Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Проверка существования дубликатов \ MC Access / 13 сообщений из 13, страница 1 из 1
16.03.2015, 11:53
    #38905694
majhool001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка существования дубликатов \ MC Access
Здравствуйте.
Проверяю существование записи в БД,чтобы избежать записей-дубликатов.
Если в базе данных в таблице 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
16.03.2015, 12:16
    #38905730
Вячеслав Д
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка существования дубликатов \ MC Access
majhool001,

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


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


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

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

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

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

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

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


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