#1 15.04.11 16:07
c# MSSQL DataSet Проверка на уникальность UNIQUE
В БД MSSQL есть уникальное текстовое поле с названием статей. Требуется из приложенияс DataSet скинуть новые названия статей. Соответственно, если какие-то названия статей уже есть в БД сервера - чтобы они не добавлялись. Подскажите куда копать на c# ) Может как-то помочь свойство поля UNIQUE на MSSQL?
Исправлено drug_detei (15.04.11 16:10)
Offline
#3 15.04.11 18:52
Re: c# MSSQL DataSet Проверка на уникальность UNIQUE
в dataset есть текстовое поле varchar(255) . В нем находится текст (название статей)
Допустим в поле varchar(255) БД MSSQL есть строка
Определить попадание точки в прямоугольник или эллипс на C#
а в поле DataSet две строки
Определить попадание точки в прямоугольник или эллипс на C#
Пьяньчуга – Моделирование движения пьяного человека на C#
требуется чтобы DataSet так передал данные в БД MSSQL, чтобы в БД MSSQL добавилась только строка, которой там нет, т.е.
Пьяньчуга – Моделирование движения пьяного человека на C#
Offline
#4 18.04.11 23:37
Re: c# MSSQL DataSet Проверка на уникальность UNIQUE
drug_detei написал(а):
Может как-то помочь свойство поля UNIQUE на MSSQL?
Ну конечно может помочь - ошибку высыпет :)))
Но как бы лучше и наверное самое правильное будет использовать триггер на insert. И сделать в триггере обработку такой ошибки если такие данные в поле уже есть. А поле проиндексируй.
Offline
#5 19.04.11 12:28
Re: c# MSSQL DataSet Проверка на уникальность UNIQUE
+VoFFka+ написал(а):
drug_detei написал(а):
Может как-то помочь свойство поля UNIQUE на MSSQL?
Ну конечно может помочь - ошибку высыпет :)))
Но как бы лучше и наверное самое правильное будет использовать триггер на insert. И сделать в триггере обработку такой ошибки если такие данные в поле уже есть. А поле проиндексируй.
Триггер как бы не самое оптимальное решение, по причине медленной работы. Однако если претензий к быстродействию нет, то будет достаточно удобным вариантом.
Есть еще несколько вариантов:
1. Написать SQL запрос на вставку, который будет добавлять только те значения из датасета, которых еще нет в таблице
2. Реализовать логику в хранимой процедуре, и вызывать ее из приложения
3. В случае неуникальности данных СУБД вернет ошибку, можно в блоке try..catch эту ошибку игнорить, и продолжать дальше бежать по датасету :)
Offline
#6 20.04.11 10:39
Re: c# MSSQL DataSet Проверка на уникальность UNIQUE
156j написал(а):
Триггер как бы не самое оптимальное решение, по причине медленной работы.
Спорный вопрос, триггер, такая же процедура, но минус в том что он будет безусловно на любой инсерт срабатывать и делать проверки, тоесть в целом можно конечно замедлить систему.
Но конечно лучше в хранимой процедуре. Бежать по датасету и каждый раз её вызывать. Согласен, это пожалуй оптимальное решение, если эта проверка не везде нужна.
Offline
#7 21.04.11 09:35
Re: c# MSSQL DataSet Проверка на уникальность UNIQUE
+VoFFka+ написал(а):
Бежать по датасету и каждый раз её вызывать.
т.е. в любом случае нельзя обойтись update-ом dataset-а, а нужно передавать значения по одному через цикл?
Исправлено drug_detei (21.04.11 09:35)
Offline
#8 21.04.11 11:11
Re: c# MSSQL DataSet Проверка на уникальность UNIQUE
Добавлю свои пять копеек. Можно тупо оставить constraint unique на таблице в БД. Далее производить вставку ВСЕХ записей из приложения (у тебя же двухзванная архитектура?) в БД в одной транзакции. При попытке вставить значение, нарушающее констрейнт будет сгенерировано исключение, по тексту которого, можно однозначно судить об ошибке, а по сему отловить и обработать ее вприложении. Причем не на уровне окна, а на уровне всего приложения. Такой подход позволяет сделать обработку многих ошибок только в одном месте, не замарачиваясь на них в дальнейшем.
Offline
#9 21.04.11 11:20
Re: c# MSSQL DataSet Проверка на уникальность UNIQUE
А вообще, у меня большие сомнения насчет целесообразности использования всей технологии DataSet. Взамен можно использовать другие ORM, к примеру, BL.ToolKit, или Entity to SQL, но это надо много читать и долго разбираться. Зато будет профессиональный рост :)
Исправлено Udaw (21.04.11 11:21)
Offline
#10 20.05.11 00:11
Re: c# MSSQL DataSet Проверка на уникальность UNIQUE
Offline
#11 21.05.11 10:48
Re: c# MSSQL DataSet Проверка на уникальность UNIQUE
XuMiX, поясни плз свой намек на Update) Как я понимаю работу Update: берется DataSet с записями, потом на записях расставляются метки INSERT, UPDATE или DELETE, и затем Update-ом все вместе скидывается в БД согласно этим меткам. А проблема уникальности записей так и не понял как решается )
Offline
#12 28.05.11 18:17
#13 30.11.12 18:07
Re: c# MSSQL DataSet Проверка на уникальность UNIQUE
Вот чем закончилось дело. В DataSet добавленные (но еще не отправленные в БД) данные помечаются как INSERT. При выполнении SqlDataAdapter.Update(DataSet), SqlDataAdapter берет помеченные как INSERT данные пачкой и добавляет в БД согласно своей внутренней команды InsertCommand, заданной по умолчанию. Эту команду можно поменять вот так, с использованием условия
Код: c#:
SqlDataAdapter da = new SqlDataAdapter(); da.InsertCommand = new SqlCommand("IF NOT EXISTS (SELECT ProductName FROM MyTable WHERE (ProductName = @ProductName)) INSERT INTO MyTable (ProductName) VALUES (@ProductName)", con);
После Update в DataSet снимется пометка INSERT с добавленных в БД данных и останется на продублированных, вот так их можно отличить для дальнейшей обработки.
Тестировалось только на MSSQL. Статейка по теме Обработка баз данных на Visual Basic®.NET Джеффри П. Мак-Манус; Джеки Голдштейн; Кевин Т. Прайс; ГЛАВА 6 ADO.NET: объект DataAdapter
Исправлено drug_detei (30.11.12 18:24)
Offline
#14 02.12.12 20:34
Re: c# MSSQL DataSet Проверка на уникальность UNIQUE
Зачем все это?
Ты хочешь иметь таблицу. в которой названия продуктов будут уникальными.
База данных все за тебя сделает.
Тип UNIQUE для поля. По умолчанию, кажется индексируется. Не только в MS SQL, во всех базах.
При вставке у тебя даже експшен не бросится.
Либо возвратит ID вставленной записи, либо null.
Такая логика должна быть везде.
Чем меньше ты задумываешься о деталях на уровне приложения, тем лучше. Чем легче у тебя запрос, чем он меньше, тем лучше. Чем более он универсален для д ругих баз,тем лучше. Если ты можшеь какую то логику на уровень БД перенести, тем лучше. Спорный вопрос по поводу триггеров, но констрейнты - однозначно на уровень ДБ.
Обрати внимание, выражение IF EXISTS в примере, на который ты дал ссылку используется исключительно чтобы что то дропнуть перед этим. Иначе да, у тебя будет exception. Но с инсертом, это не правильно.
PS: был не прав, ексепшен вылетает, если будет попытка вставить запись с дубликатом. И тут спорный вопрос, сделать все в тихую и вставить с помощью IF EXISTS, либо вставлять явно все, и обабатывать exception для дубликатов. Exception - отличная возможность показать пользователю, что такая строчка уже существует.
Исправлено sav (03.12.12 10:25)
Offline
#15 10.12.12 16:00
Re: c# MSSQL DataSet Проверка на уникальность UNIQUE
sav, ну да, вылетает исключение. А ты его можешь отловить. В тексте исключения будет название констрейнта. И будут характерные фразы о том, что нарушена уникальность. Ты всегда можешь это дело отследить и выдать окошко с соответствующим сообщением. Только в БД должна быть таблица, в которой задано соответствие характерной фразы и что выводить на русском. В момент запуска программы это дело должно быть загружено. Далее при каждом исключении должен быть анализ на класс исключения и на сообщение исключения. Таким образом ты оставишь контроль на уровне БД и сделаешь обработку ошибок.
Исправлено Udaw (10.12.12 16:01)
Offline
#16 11.12.12 16:13
Re: c# MSSQL DataSet Проверка на уникальность UNIQUE
Udaw написал(а):
sav, ну да, вылетает исключение. А ты его можешь отловить. В тексте исключения будет название констрейнта. И будут характерные фразы о том, что нарушена уникальность. Ты всегда можешь это дело отследить и выдать окошко с соответствующим сообщением. Только в БД должна быть таблица, в которой задано соответствие характерной фразы и что выводить на русском. В момент запуска программы это дело должно быть загружено. Далее при каждом исключении должен быть анализ на класс исключения и на сообщение исключения. Таким образом ты оставишь контроль на уровне БД и сделаешь обработку ошибок.
Вроде бы я то же самое сказал. Что БД сама отвечает за целостность и корректность данных.
А как обрабатывать исключения и что выводить пользователю и выводить ли вообще, это уже другой вопрос.
Offline

