Здравствуйте! Сегодня: Сб, 21 Сен 2019, Ваш IP: 35.172.100.232 Войти через loginza
 
Вход | Регистрация | Забыли пароль?
Мой Kbyte.Ru
> Список форумов Kbyte.Ru - - Общие вопросы программирования
+ Создать новую тему Страница: 1
Тема: Алгоритм проверки наличия записи в БД · +  +  дата добавления: 10.03.2015 / 16:42
Автор темы:
email333333
email333333
тем: 2 / ответов: 0 / благодарностей: 0 / репутация: 0
ответов: 0
создал(а) тем: 2


Здравствуйте.
подскажите хороший алгоритм проверки наличия записи в БД.
Нужно для следующих целей:
В таблице "типы пользователей" идут различные типы: админ,гость,пользователь
в таблице "пользователи" идет список: ФИО,возраст,тип пользователя.
Если из таблицы "типы пользователей" пытаются удалить запись, которая используется в таблице "пользователи" то выдается сообщение о невозможности этого действия.

Как я понял алгоритм следующий:
При клике на "удалить" я подключаюсь к базе.
объявляю переменную типа boolean, как "флаг" и переменную счетчик.
Делаю запрос к БД.
Если в таблице "пользователи" записей "тип пользователя"="админстратор" >0, то тогда выдается сообщение об ошибке.

Верно?
 
Ответ # 1 # · +  +  дата добавления: 10.03.2015 / 17:59
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


SELECT COUNT(*) FROM [пользователи] WHERE [тип пользователя] = 'админстратор'
Да, верно. Если запрос вернет значение больше нуля, значит указанный тип пользователей используется.

А вообще, удобней использовать три таблицы:
1. Типы пользователей
2. Пользователи
3. Связка пользователей с типами

Тогда один пользователь сможет состоять одновременно в нескольких ролях. И число ролей можно будет увеличивать, при необходимости.
 
Ответ # 2 # · +  +  дата добавления: 10.03.2015 / 20:25
Автор ответа:
email333333
email333333
тем: 16 / ответов: 30 / благодарностей: 0 / репутация: 2
ответов: 30
создал(а) тем: 16


А не подскажете как два условия записать?
Этот метод не работает
SELECT COUNT(*) FROM [UserResurses] WHERE [Resurs] = R2 AND [TabNum] = T2
 
Ответ # 3 # · +  +  дата добавления: 10.03.2015 / 20:43
Автор ответа:
email333333
email333333
тем: 16 / ответов: 30 / благодарностей: 0 / репутация: 2
ответов: 30
создал(а) тем: 16


Если быть точнее,то
    SqlCom2 = New OleDb.OleDbCommand("SELECT COUNT(*) FROM UserResurses WHERE Resurs=R1 AND TabNum=T2", Con2) 
        SqlCom2.Parameters.Add("@R2", OleDbType.WChar).Value = chres.DataGridView1.CurrentRow.Cells(1).Value
        SqlCom2.Parameters.Add("@T2", OleDbType.WChar).Value = chres.TextBox1.Text
 
Ответ # 4 # · +  +  дата добавления: 10.03.2015 / 22:44
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


В самом запросе у параметров тоже должна быть собака: @R1, @T2.
 
Ответ # 5 # · +  +  дата добавления: 11.03.2015 / 09:01
Автор ответа:
email333333
email333333
тем: 16 / ответов: 30 / благодарностей: 0 / репутация: 2
ответов: 30
создал(а) тем: 16


Изменил, но запись все равно добавляется даже если схожая уже существует.
Принцип такой на форме chres есть textbox1 где хранится табельный номер, а в датагриде первая колонка содержит название ресурса.
Когда я добавляю пользователю с этим табельным номером уже добавленный ему ресурс, он должен по идее показать меседжбокс что это недопустимо,
но вместо этого он продолжает добавлять.


 'добавить новый ресурс
        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 UserResurses WHERE Resurs=@R2 AND TabNum=@T2", Con2) ' Указываем строку запроса и привязываем к соединению
        SqlCom2.Parameters.Add("R2", OleDbType.WChar).Value = chres.DataGridView1.CurrentRow.Cells(1).Value
        SqlCom2.Parameters.Add("T2", OleDbType.WChar).Value = chres.TextBox1.Text
        Con2.Open() ' Открываем соединение
        SqlCom2.ExecuteNonQuery() 'Выполняем запрос
        k = SqlCom2.ExecuteScalar()
        If k > 0 Then
            MsgBox("Такая запись уже существует!")
            Con2.Close() ' Закрываем соединение
            Me.Close()
        Else

            Dim Con4 As New OleDb.OleDbConnection("Provider=Microsoft.ACE.oledb.12.0; Data source=" + bpath) ' Переменная для подключения базы
            Dim SqlCom4 As OleDb.OleDbCommand ' Переменная для Sql запросов
            If (TextBox4.Text = "") Or (ComboBox1.SelectedIndex = -1) Then
                MessageBox.Show("Введите Имя Пользователя и укажите Уровень доступа!", _
                               "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Else
                Con4.Open()
                SqlCom4 = New OleDb.OleDbCommand("INSERT INTO [UserResurses] ([TabNum], [Resurs], [UserName], [AccessLevel], [LthPwd], [ChgPwd], [Pwd]) VALUES (TabNum, Resurs, UserName, AccessLevel, LthPwd, ChgPwd, Pwd)", Con4)
                SqlCom4.Parameters.Add("@TabNum", OleDb.OleDbType.WChar).Value = tnum1
                SqlCom4.Parameters.Add("@Resurs", OleDb.OleDbType.WChar).Value = TextBox1.Text
                SqlCom4.Parameters.Add("@UserName", OleDb.OleDbType.WChar).Value = TextBox4.Text
                SqlCom4.Parameters.Add("@AccessLevel", OleDb.OleDbType.WChar).Value = ComboBox1.SelectedItem
                SqlCom4.Parameters.Add("@LthPwd", OleDb.OleDbType.WChar).Value = "8"
                SqlCom4.Parameters.Add("@ChgPwd", OleDb.OleDbType.WChar).Value = "да"
                SqlCom4.Parameters.Add("@Pwd", OleDb.OleDbType.WChar).Value = TextBox5.Text
                SqlCom4.ExecuteNonQuery()
                chres.Close()
                chres.Show()
                chres.Close()
                Con4.Close()
                MessageBox.Show("Новый ресурс для пользователя добавлен!", _
                                    "Добавление Ресурса", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Me.Close()
                chres.Show()
            End If
        End If
 
Ответ # 6 # · +  +  дата добавления: 11.03.2015 / 12:20
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


Запрос выполняется два раза, в 9 строке и в 10.
Метод ExecuteNonQuery() вернет число задействованных строк.
Метод ExecuteScalar() - одно поле из результатов выполнения запроса.

Имена параметров подстановки всегда должны начинаться с собаки (@):
SqlCom2 = New OleDb.OleDbCommand("SELECT COUNT(*) FROM UserResurses WHERE Resurs=@R2 AND TabNum=@T2", Con2)
SqlCom2.Parameters.Add("
@R2", OleDbType.WChar).Value = chres.DataGridView1.CurrentRow.Cells(1).Value
SqlCom2.Parameters.Add("
@T2", OleDbType.WChar).Value = chres.TextBox1.Text

В 6 и 7 строках собак нет, поэтому видимо и не работает.
 
Ответ # 7 # · +  +  дата добавления: 11.03.2015 / 14:39
Автор ответа:
email333333
email333333
тем: 16 / ответов: 30 / благодарностей: 0 / репутация: 2
ответов: 30
создал(а) тем: 16


Добавил скобки, результат не дает.
Я придумал уже другой метод,просто хотел понять в чем причина.
На сайте где можно протестировать запрос на таблице (эмулятор SQL-запросов) запрос срабатывает.
А в программе результата не дает, и число записей удовлетворяющих условию постоянно = 0
 
Ответ # 8 # · +  +  дата добавления: 11.03.2015 / 14:40
Автор ответа:
email333333
email333333
тем: 16 / ответов: 30 / благодарностей: 0 / репутация: 2
ответов: 30
создал(а) тем: 16


Т.е не скобки,а собаки (@)
 
Страница: 1 + Создать новую тему