powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Проверка существования дубликатов \ MC Access
13 сообщений из 13, страница 1 из 1
Проверка существования дубликатов \ MC Access
    #38905694
majhool001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Проверяю существование записи в БД,чтобы избежать записей-дубликатов.
Если в базе данных в таблице Users уже есть запись с таким-же TabNum с которым я пытаюсь добавить нового пользователя в БД - выдается сообщение что такая запись уже существует.

Проблема в том, что программа выдает это сообщение всегда.
И когда в базе уже есть пользователь с таким tabnum, и когда его нет.
Подскажите, где ошибка?
Заметил следующую особенность:
При работе с другой формой, напрямую через датагрид, код работает нормально.
А тут выкидывает такие ошибки.
Так и не смог разобраться в чем причина

Проверяю наличие записи-дубликата так

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Dim k As Integer = 0
        Dim Con2 As New OleDb.OleDbConnection("Provider=Microsoft.ACE.oledb.12.0; Data source=" + bpath) ' Переменная для подключения базы
        Dim SqlCom2 As OleDb.OleDbCommand ' Переменная для Sql запросов
        SqlCom2 = New OleDb.OleDbCommand("SELECT COUNT(*) FROM [Users] WHERE [TabNum] = @T1", Con2) ' Указываем строку запроса и привязываем к соединению
        SqlCom2.Parameters.Add("@T1", OleDbType.WChar).Value = usadm.DataGridView1.CurrentRow.Cells(0).Value
        Con2.Open() ' Открываем соединение
        SqlCom2.ExecuteNonQuery() 'Выполняем запрос
        k = SqlCom2.ExecuteScalar()
        If k > 0 Then
            MsgBox("Такая запись уже существует!")



Данные из БД получаю так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Dim Con1 As New OleDb.OleDbConnection("Provider=Microsoft.ACE.oledb.12.0; Data source=" + bpath) ' Переменная для подключения базы
    Dim SqlCom1 As OleDb.OleDbCommand ' Переменная для Sql запросов
    Dim DT1 As New Data.DataTable ' Таблица для хранения результатов запроса
    Dim DA1 As OleDb.OleDbDataAdapter ' Адаптер для заполнения таблицы после запроса
    Dim k As Integer
 
 DT1.Clear() 'Очищаем таблицу
        SqlCom1 = New OleDb.OleDbCommand("SELECT [TabNum],[LastName],[FirstName],[MiddleName],[Dep],[Post],[UserType],[BasPwd] FROM [Users]", Con1) ' Указываем строку запроса и привязываем к соединению
        Con1.Open() ' Открываем соединение
        SqlCom1.ExecuteNonQuery() 'Выполняем запрос
        DA1 = New OleDb.OleDbDataAdapter(SqlCom1) 'Через адаптер получаем результаты запроса
        DataGridView1.DataSource = DT1 ' Привязываем Грид к источнику данных
        DA1.Fill(DT1) ' Заполняем таблицу результатми
        DataGridView1.Columns(0).HeaderCell.Value = "Таб.#"
        DataGridView1.Columns(1).HeaderCell.Value = "Фамилия"
        DataGridView1.Columns(2).HeaderCell.Value = "Имя"
        DataGridView1.Columns(3).HeaderCell.Value = "Отчество"
        DataGridView1.Columns(4).HeaderCell.Value = "Подразделение"
        DataGridView1.Columns(5).HeaderCell.Value = "Должность"
        DataGridView1.Columns(6).HeaderCell.Value = "Тип"
        DataGridView1.Columns(6).HeaderCell.Value = "Пароль"
        Con1.Close() ' Закрываем соединение
        Me.DataGridView1.DataSource = DT1



Добавляю пользователя не через datagried, а через форму.
Данные вводятся в текстовые поля либо выбираются из комбобоксов и тп.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Con4.Open()
                SqlCom4 = New OleDb.OleDbCommand("INSERT INTO [Users] ([TabNum], [LastName], [FirstName], [MiddleName], [Dep], [Post], [Usertype], [Description], [BasPwd]) VALUES (@TabNum, @LastName, @FirstName, @MiddleName, @Dep, @Post, @Usertype, @Description, @BasPwd)", Con4)
                SqlCom4.Parameters.Add("@TabNum", OleDb.OleDbType.WChar).Value = TextBox1.Text
                SqlCom4.Parameters.Add("@LastName", OleDb.OleDbType.WChar).Value = TextBox2.Text
                SqlCom4.Parameters.Add("@FirstName", OleDb.OleDbType.WChar).Value = TextBox3.Text
                SqlCom4.Parameters.Add("@MiddleName", OleDb.OleDbType.WChar).Value = TextBox6.Text
                SqlCom4.Parameters.Add("@Dep", OleDb.OleDbType.WChar).Value = ComboBox1.SelectedItem
                SqlCom4.Parameters.Add("@Post", OleDb.OleDbType.WChar).Value = ComboBox2.SelectedItem
                SqlCom4.Parameters.Add("@UserType", OleDb.OleDbType.WChar).Value = ComboBox3.SelectedItem
                SqlCom4.Parameters.Add("@Description", OleDb.OleDbType.WChar).Value = TextBox9.Text
                SqlCom4.Parameters.Add("@BasPwd", OleDb.OleDbType.WChar).Value = TextBox8.Text
                SqlCom4.ExecuteNonQuery()
                Con4.Close()
                MessageBox.Show("Новый пользователь успешно добавлен!", _
                                    "Добавление нового пользователя", MessageBoxButtons.OK, MessageBoxIcon.Information)
                TextBox1.Clear()
                TextBox2.Clear()
                TextBox3.Clear()
                TextBox6.Clear()
                TextBox8.Clear()
                TextBox9.Clear()
                ComboBox1.SelectedIndex = -1
                ComboBox2.SelectedIndex = -1
                ComboBox3.SelectedIndex = -1
                Me.Close()
                usadm.Show()
...
Рейтинг: 0 / 0
Проверка существования дубликатов \ MC Access
    #38905730
Вячеслав Д
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
majhool001,

Ну не корректно проверять дублирующие записи на клиенте, правильнее всего пусть база контролирует.
Первое это индекс уникальным должен быть, ну или же на крайняк проверять дубликаты в триггере или в процедуре.
Но самое правильное это индекс уникальный
...
Рейтинг: 0 / 0
Проверка существования дубликатов \ MC Access
    #38905806
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
majhool001
Код: vbnet
1.
usadm.DataGridView1.CurrentRow.Cells(0).Value


Что-то мне подсказывает, что вот тут
Код: c#
1.
usadm.DataGridView1.CurrentRow.Cells(0).Value


передается что-то не то, что ожидается.
Проверьте запрос вручную в базе - коректное значение возвращает?
...
Рейтинг: 0 / 0
Проверка существования дубликатов \ MC Access
    #38905898
majhool001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Axeleron,

Спасибо.
Да,действительно.
У меня при запуске программы выделена запись с TabNum "1" в DataGriedVew
Он берет ее значение и поэтому выкидывает.
Мне тогда нужно при запуске "фокус" снять с датагрида?
...
Рейтинг: 0 / 0
Проверка существования дубликатов \ MC Access
    #38905906
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно удостовериться, что в параметре T1 передается верное значение
...
Рейтинг: 0 / 0
Проверка существования дубликатов \ MC Access
    #38905946
majhool001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Значение передается неправильно.
При запуске программы у меня открывается форма с таким Datagried.
Вот поле "Таб.#" это и есть "0"-я ячейка.
Она бывает выделена при запуске программы.
Когда я жму добавить, @T1 принимает ее значение и потом делает проверку:
Есть ли запись c TabNum равным значение 0-й колонки выделенной записи, а она есть.
И так с каждой записью.
Т.е T1 он почему-то присваивает значение выделенной в DataGried записи.

Как это можно исправить?
...
Рейтинг: 0 / 0
Проверка существования дубликатов \ MC Access
    #38905952
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
majhool001,
Вы же явно указываете в коде брать всегда значение колонки из текущего ряда. А создаете новую запись в другой форме. Так и обращайтесь к TextBox'у 'Табельный номер' формы где заводите новую запись и посылйте TextBox.Value вместо usadm.DataGridView1.CurrentRow.Cells(0).Value.
...
Рейтинг: 0 / 0
Проверка существования дубликатов \ MC Access
    #38905967
majhool001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Axeleron,

Тьфу-ты, действительно, Спасибо.
Не могу понять как я такое написал.
...
Рейтинг: 0 / 0
Проверка существования дубликатов \ MC Access
    #38905975
Вячеслав Д
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
majhool001,

А получается если руками вставлять записи минуя твою программу тогда можно добавлять дубликаты.
Ну не правильно это!!! База сама должна соблюдать целостность системы.
...
Рейтинг: 0 / 0
Проверка существования дубликатов \ MC Access
    #38905980
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ДА получается если руками вставлять записи минуя твою программу тогда можно добавлять дубликаты.
Ну не правильно это!!! База сама должна соблюдать целостность системы.
Возможно, что такой возможности добавлять руками записи напряму в БД у TCа не предусмотрено. А проверить на дубликат перед вставкой новой записи - это стандартный функционал. Табельный номер, вероятно должен быть Unique и Primary Key в таблице, на что я надеюсь.
...
Рейтинг: 0 / 0
Проверка существования дубликатов \ MC Access
    #38905997
Вячеслав Д
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AxeleronВячеслав ДА получается если руками вставлять записи минуя твою программу тогда можно добавлять дубликаты.
Ну не правильно это!!! База сама должна соблюдать целостность системы.
Возможно, что такой возможности добавлять руками записи напряму в БД у TCа не предусмотрено. А проверить на дубликат перед вставкой новой записи - это стандартный функционал. Табельный номер, вероятно должен быть Unique и Primary Key в таблице, на что я надеюсь.
А раз есть Unique Index или Primary Key по табельному, тогда и отлавливать надо Exception
Но это уже дело автора, ему намекают а он пусть делает как знает
...
Рейтинг: 0 / 0
Проверка существования дубликатов \ MC Access
    #38906009
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Д,
До эксепшена дело все-таки лучше не доводить
...
Рейтинг: 0 / 0
Проверка существования дубликатов \ MC Access
    #38906011
majhool001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Д,

Я все понимаю.
Просто в этой программе пользователь (т.е я) будет работать с базой не вручную, а используя программу.
А так, то, о чём вы сказали тоже можно будет реализовать,спасибо за совет.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Проверка существования дубликатов \ MC Access
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]