Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
178 / 68 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
1

Как при добавлении записи в DataGridView избежать повторения по какому-либо полю?

14.09.2016, 10:26. Показов 1814. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем здравствуйте.
DataGridView заполнена записями таблицы БД MSAccess без использования Binding Source.
Добавление записи выглядит так:
VB.NET
1
2
3
4
5
6
    Sub AddRecord()
        SqlCom = New OleDb.OleDbCommand("INSERT INTO [Kadr] ([Name], [BDate]) VALUES ('" & sName & "', '" & dtBDay & "')", Con)
        Con.Open()
        SqlCom.ExecuteNonQuery()
        Con.Close()
    End Sub
Как избежать повторяющихся записей, например по полю Name таблицы Kadr.
Перебором всех существующих записей с анализом содержимого поля Name? Или есть другой способ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.09.2016, 10:26
Ответы с готовыми решениями:

Создаются какие либо записи в реестре, при добавлении закладок на панель избранного в IE 8/9?
Всем привет. Интересует следующий момент: Создаются какие либо записи в реестре при добавлении...

Обновление DataGridView при добавлении записи через запрос
Добрый день! Подскажите пожалуйста как реализовать обновление dataGridView (чтобы выводились все...

Поместить список файлов текущего каталога в текстовый файл и в зависимости от ключа сортировать по какому-либо полю
Условие:"Разработать командный файл, который помещает список файлов текущего каталога в текстовый...

Как избежать утечки памяти при добавлении элемента в TSet
Здравствуйте. Подскажите, пожалуйста, как избежать утечки памяти при добавлении элемента в...

9
Модератор
Эксперт .NET
4203 / 3287 / 497
Регистрация: 27.01.2014
Сообщений: 6,033
14.09.2016, 14:45 2
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

jkrnd, можно задать уникальность строки, и вставлять через INSERT IGNORE... чтобы исключений не вызывало. относительно access правда не знаю какой SQL запрос нужен. погуглите...
а если нет, то да, делаете выборку этой колонки, проверяете нв наличие такого имени и там уже делаетк выводы соответствующие
2
1136 / 881 / 152
Регистрация: 25.07.2015
Сообщений: 1,959
14.09.2016, 15:38 3
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

Цитата Сообщение от Yury Komar Посмотреть сообщение
INSERT IGNORE
Это фишка MySql.
Ни в MSSQL , ни тем более в Access этого нет.
Можно реализовать с помощью MERGE , но придётся писать достаточно приличный скрипт.
В Аccess эта задача реализуется самим Access :
В конструкторе таблиц устанавливаете значение "индексированное поле" в значение "Да, совпадения
не допускаются" и всё. Ассеss сам будет проверять повторы.

Ну а VB код оборачиваете в Try Catch , чтобы ошибки вставки не доставали.
VB.NET
1
2
3
4
5
6
7
8
Try
    SqlCom = New OleDb.OleDbCommand("INSERT INTO [Kadr] ([Name], [BDate]) VALUES ('" & sName & "', '" & dtBDay & "')", Con)
        Con.Open()
        SqlCom.ExecuteNonQuery()
        Con.Close()
Catch ex As Exception
    Exit sub
End Try
Миниатюры
Как при добавлении записи в DataGridView избежать повторения по какому-либо полю?  
1
Модератор
Эксперт .NET
4203 / 3287 / 497
Регистрация: 27.01.2014
Сообщений: 6,033
14.09.2016, 16:20 4
Kulma, нет, INSERT IGNORE не только в MSSQL работает...

Вот как я такую же проблему решал в срседней теме на SQL LITE
Как загрузить 200K строк типа String в базу SQLite максимально быстро?

Добавлено через 1 минуту
добавлю и повторюсь, что для таблицы нужно уникальность строки настроить по нужным колонкам... В каждой СУБД это выполняется по разному
1
1136 / 881 / 152
Регистрация: 25.07.2015
Сообщений: 1,959
14.09.2016, 16:28 5
Yury Komar, да, вы правы, моя оплошность, сорри.
SQlite из головы вылетел , вот и не упомянул его.

Не по теме:

У SQLite и MySQL вообще диалект SQL очень схожи.


И про уникальность всё верно , просто в Access ,в отличии от большинства скульных баз,
гораздо проще это настроить в конструкторе, чем прописывать ручками.
Вот мне и решилось разъяснить более детально процесс , чтобы избежать непонимания
со стороны ТС
2
178 / 68 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
14.09.2016, 16:54  [ТС] 6
Kulma, Всё работает спасибо. только перед выходом по ошибке закрываю соединение, а то при первой ошибке ничего добавить уже никогда не получится. Избавили меня от перебора записей. Я до этого думал что в таблице может быть только одно индексированное поле.
0
1136 / 881 / 152
Регистрация: 25.07.2015
Сообщений: 1,959
14.09.2016, 17:25 7
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

jkrnd, да не за что ))
Касаемо "избавили от перебора..." , Юрий предложил ранее то же решение , я только развернул
его относительно Access ))
Про соединение - я забыл включить его в Exception,вы всё верно сделали.
Цитата Сообщение от jkrnd Посмотреть сообщение
а то при первой ошибке ничего добавить уже никогда не получится.
А вот чтобы об этом голова не болела , создайте отдельную процедуру подключения
и делайте в ней проверку , что-то типа такого ( я не буду код к правилам подключения к Access-лень,
просто приведу кусок своего кода )) ,думаю вы сами по аналогии разберётесь.
А потом , когда в коде потребуется подключение к БД просто вставляете эту процедуру.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
Public Sub Connect_DB() 
        cnnSql = New MySqlConnection
        If cnnSql.State = ConnectionState.Closed Then
            cnnSql.ConnectionString = "database=gtdata;server=127.0.0.1;Port=3307;user id=; pwd=;Character Set=cp1251;"
            Try
                cnnSql.Open()
            Catch ex As SystemException
                MessageBox.Show("Ошибка подключения к локальной БД")
            End Try
        Else
            Exit Sub
        End If
    End Sub
2
178 / 68 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
14.09.2016, 17:33  [ТС] 8
Kulma, вместо
Цитата Сообщение от Kulma Посмотреть сообщение
cnnSql.Open()
вставляем
Цитата Сообщение от Kulma Посмотреть сообщение
Connect_DB()
правильно?
0
1136 / 881 / 152
Регистрация: 25.07.2015
Сообщений: 1,959
14.09.2016, 17:39 9
Нет, у ваc же соединение открывается con.Open()
Вот вместо него и используйте процедуру с проверкой а-ля Connect_DB()
А остальное как всегда :
Закрываем как обычно con.Close
Ну и не забываем вставлять con там где это необходимо :
VB.NET
1
 OleDbCommand ("Запрос",con)
1
178 / 68 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
14.09.2016, 17:51  [ТС] 10
Kulma, я так и понял.
0
14.09.2016, 17:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.09.2016, 17:51
Помогаю со студенческими работами здесь

Как избежать повторения?
procedure MouseDown - нужно сделать несколько подобных процедур.

Как избежать повторения строк?
Доброго времени суток, у меня есть 2 класа Singleton и Program, помогите сделать так чтоби я вводил...

нарушение прав доступа при записи. объясните, почему? и как избежать?
void Stroka::F1(char*word) { char *point; if((point=strstr(data,word))) { strrev(word); } }...

Как избежать повторения черного экрана после логина вместо рабочего стола в Windows 10
Здравствуйте, Недавно у меня вышла неприятная история с появлением черного экрана вместо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru