Официальный сайт студ.городка НГТУ
Программирование и БД » c# MSSQL DataSet Проверка на уникальность UNIQUE 

#1  15.04.11 16:07

c# MSSQL DataSet Проверка на уникальность UNIQUE

В БД MSSQL есть уникальное текстовое поле с названием статей. Требуется из приложенияс DataSet скинуть новые названия статей. Соответственно, если какие-то названия статей уже есть в БД сервера - чтобы они не добавлялись. Подскажите куда копать на c# ) Может как-то помочь свойство поля UNIQUE на MSSQL?

Исправлено drug_detei (15.04.11 16:10)

Offline

#2  15.04.11 17:05

Re: c# MSSQL DataSet Проверка на уникальность UNIQUE

что значит

drug_detei написал(а):

из приложенияс DataSet скинуть новые названия статей

?

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

Re: c# MSSQL DataSet Проверка на уникальность UNIQUE

сделай типизированный DataSet, далее делаешь Fill ....... Update

Offline

#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

sav
Профиль

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

sav
Профиль

Re: c# MSSQL DataSet Проверка на уникальность UNIQUE

Udaw написал(а):

sav,  ну да, вылетает исключение. А ты его можешь отловить. В тексте исключения будет название констрейнта. И будут характерные фразы о том, что нарушена уникальность. Ты всегда можешь это дело отследить и выдать окошко с соответствующим сообщением. Только в БД должна быть таблица, в которой задано соответствие характерной фразы и что выводить на русском. В момент запуска программы это дело должно быть загружено. Далее при каждом исключении должен быть анализ на класс исключения и на сообщение исключения. Таким образом ты оставишь контроль на уровне БД и сделаешь обработку ошибок.

Вроде бы  я то же самое сказал. Что БД сама отвечает за целостность и корректность данных.
А как обрабатывать исключения и что выводить пользователю и выводить ли вообще, это уже другой вопрос.

Offline

Программирование и БД » c# MSSQL DataSet Проверка на уникальность UNIQUE 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.071 сек.
Выполнено 14 запросов.