Форум программистов, компьютерный форум CyberForum.ru Форум программистов | Компьютерный форум | Форум web-программистов | Форум по электронике и бытовой технике | Форум о софте | Научный форум | Карьера и бизнес
CyberForum.ru - форум программистов и сисадминов > > >
Восстановить пароль Регистрация

Ответ Создать новую тему
 
Dzhej-Dzhej
Заблокирован
11.03.2011, 16:16     Как проверить наличие записи в таблице БД MySql(по ID)
  #1
Всем доброго времени суток.
Уважаемые программисты, у меня возник такой вопрос:

Есть таблица в БД MySql в ней неопределенное количество записей(строк)
Записи я периодически обновляю примерно так:
Код Visual Basic .NET
1
2
3
4
5
'Dim cmd As New MySql.Data.MySqlClient.MySqlCommand
...
cmd.CommandText = "UPDATE table ... WHERE id = " & tDat.id
cmd.Prepare()
cmd.ExecuteNonQuery()
Здесь все нормально и подключение, и обновление, и др.

При старте программы необходимо проверять есть ли записи с некоторыми id, если нету - создавать
Пытаюсь сделать следующим образом:
Код Visual Basic .NET
1
2
3
4
5
6
7
8
9
        cmd.CommandText = "select * from table where id = 80;"
        cmd.Prepare()
        cmd.ExecuteNonQuery()
        If (Not cmd.ExecuteReader().HasRows) Then
            'cmd.ExecuteReader().Close()
            cmd.CommandText = "INSERT INTO table VALUES( 80, '', 0, 0, 0, '', '', '', '', '', '');"
            cmd.Prepare()
            cmd.ExecuteNonQuery()
        End If
а он мне отвечает на строке 8 cmd.ExecuteNonQuery():
There is already an open DataReader associated with this Connection which must be closed first.
Так вот, может кто подскажет как мне это нормально организовать

Зараннее благодарен
AdAgent
Объявления
11.03.2011, 16:16
gitarillo
Форумчанин
549 / 478 / 7
Регистрация: 17.06.2010
Сообщений: 990
Записей в блоге: 1
11.03.2011, 17:07
  #2
Dzhej-Dzhej
Код Visual Basic .NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Public Class Form1
    Dim sql_con As New MySql.Data.MySqlClient.MySqlConnection
    Dim datbl As New System.Data.DataTable
    Dim sql As String
    Dim cmd As MySql.Data.MySqlClient.MySqlCommand
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        sql_con.ConnectionString = "Server=localhost; User id=USER;password=***;database=LLL"
        sql = "SET NAMES cp1251; SELECT *  FROM   `tbname` WHERE (`ID`='20')"
        sql_con.Open()
        cmd = New MySql.Data.MySqlClient.MySqlCommand(sql, sql_con)
        cmd.ExecuteNonQuery()
        datbl.Clear()
        Dim reader As New MySql.Data.MySqlClient.MySqlDataAdapter(cmd)
        reader.Fill(datbl)
        sql_con.Close()
        If datbl.Rows.Count = 0 Then
            sql = "INSERT INTO `tbname`   (`N1`, `N2`, `N3`, `N4`) VALUES ('111', '30', '20', '02')"
            sql_con.Open()
            cmd = New MySql.Data.MySqlClient.MySqlCommand(sql, sql_con)
            cmd.ExecuteNonQuery()
            sql_con.Close()
        End If
В принципе суть та же что и тебя. Но работает нормально
Dzhej-Dzhej
Заблокирован
12.03.2011, 11:13  [ТС]
  #3
gitarillo, спасибо.
Дело в том, что если у меня будет нехватать десяток записей, то коннектиться и разрывать коннект десять раз как-то нехорошо.
rem ID будет подсовываться динамически из инишника описаний.

Может есть какой-либо способ проверять наличие записи(и создавать несуществующую) без разрывов коннекта?

Добавлено через 2 часа 28 минут
вроде получилось(слабонервных просьба не читать, разрыв мозга во второй строке)
Код Visual Basic .NET
1
2
3
4
5
6
7
8
9
        Dim id As Integer = 80
        cmd.CommandText = "select id from table where id = " + id.ToString + ";"
        cmd.Prepare()
        cmd.ExecuteNonQuery()
        If (id <> cmd.ExecuteScalar()) Then
            cmd.CommandText = "INSERT INTO table VALUES( " + id.ToString + ", '', 0, 0, 0, '', '', '', '', '', '');"
            cmd.Prepare()
            cmd.ExecuteNonQuery()
        End If
Eugene22
_
2273 / 1146 / 42
Регистрация: 28.10.2009
Сообщений: 4,112
12.03.2011, 11:55
  #4
Чуть модифицированный вариант :
Код Visual Basic .NET
1
2
3
4
5
6
7
8
9
10
 Dim id As Integer = 80
        cmd.CommandText = "select id from table where id = " + id.ToString + ";"
        If cmd.ExecuteNonQuery() = 0 Then
            cmd.CommandText = "INSERT INTO table VALUES( " + id.ToString + ", '', 0, 0, 0, '', '', '', '', '', '');"
            If comand1.ExecuteNonQuery() > 0 Then
                MessageBox.Show("INSERT-command has been executed")
            Else
                MessageBox.Show("INSERT-command failed")
            End If
        End If
ExecuteNonQuery() -возвращает количество записей и этим можно воспользоваться
Dzhej-Dzhej
Заблокирован
12.03.2011, 12:18  [ТС]
  #5
Цитата Сообщение от Eugene22 Посмотреть сообщение
ExecuteNonQuery() -возвращает количество записей и этим можно воспользоваться
ExecuteNonQuery возвращает количество записей, которые изменены, например, апдейтом.

следующий код выдает "-1", хоть есть у меня запись, хоть нету
Код Visual Basic .NET
1
2
3
4
                        cmd.CommandText = "select id from table where id = 80;"
                        cmd.Prepare()
                        Dim q As Integer = cmd.ExecuteNonQuery()
                        MessageBox.Show(q.ToString)
Eugene22
_
2273 / 1146 / 42
Регистрация: 28.10.2009
Сообщений: 4,112
12.03.2011, 14:39
  #6
Да, немного ошибся, видимо количество записей, отвечающих выборке "SELECT", можно проверить только через DataReader, как-нибудь так
Код Visual Basic .NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dim id As Integer = 80
        cmd.CommandText = "select id from table where id = " + id.ToString + ";"
        Dim dataReader As MySqlDataReader = comand1.ExecuteReader()
        If dataReader.Read() = False Then
            dataReader.Close()
            cmd.CommandText = "INSERT INTO table VALUES( " + id.ToString + ", '', 0, 0, 0, '', '', '', '', '', '');"
            If comand1.ExecuteNonQuery() > 0 Then
                MessageBox.Show("INSERT-command has been executed")
            Else
                MessageBox.Show("INSERT-command failed")
            End If
       Else
            MessageBox.Show("Запись уже есть")
        End If
Dzhej-Dzhej
Заблокирован
12.03.2011, 15:03  [ТС]     Как проверить наличие записи в таблице БД MySql(по ID)
  #7
я сделал, как в посте #3
мне чем меньше строк и переменных, тем лучше, т.к. размер проги уже приближается к 2000 строкам

всем спасибо, тему можно закрывать
Yandex
Объявления
12.03.2011, 15:03
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать новую тему

Похожие темы
Тема Раздел Автор Дата
MS Access Как проверить наличие записи В ПОДЧИНЕННОЙ ФОРМЕ
привет всем ... Как проверить наличие записи В ПОДЧИНЕННОЙ ФОРМЕ с помощью Recordset.EOF Мне нужно по нажатию на кнопку "новая запись" , в форме "F_Работник" проверить наличие записи В ...
MS Access rvafexa 04.03.2014 09:09
Visual Basic .NET Проверить наличие файлов Visual Basic (Сервис)
Необходимо чтобы служба или сервис постоянно проверял наличие файла на диске. Пробовал чере Dir() и через FileExists бесполезно...возможно есть еще другие функции в бейсике? сам новичек в этом языке...
Visual Basic .NET Spaiker 25.02.2014 11:34
Delphi БД Как программно проверить наличие MySQL Connector в системе?
Приложение работает с базой MySQL через MySQL Connector/ODBC v5.2. Необходимо при запуске проверить установлен ли он в системе, какая версия и так далее. С чего начать даже не пойму. Единственная...
Delphi и базы данных KMSNasgool 25.12.2013 11:38
Visual Basic .NET Как узнать ID добавленной записи? (MySql)
Всем привет! Как можно получить ID только что добавленной записи? Пишу функцию, которая, в качестве параметра, принимает массив из строк sql-запросов, которые добавляют (изменяют) записи. Хотелось...
Visual Basic .NET LittleLoya 20.05.2013 21:12
MySQL Как проверить таблицу на наличие записи
Делаю отдельную регистрацию, подскажите как проверять не занят ли логин другим человеком с учетом регистра...
MySQL Micro 26.04.2013 20:56
Visual Basic .NET MS Sql: при добавлении новой записи, информация из первой записи в таблице исчезает
Ошибка заключается в том, что при добавлении новой записи(через программу), информация из первой записи в таблице исчезает. При добавлении последующих ничего не происходит, но если отредактировать...
Visual Basic .NET Gnom1990 03.07.2012 14:35
Visual Basic .NET Как проверить таблицу на наличие записи
Делаю отдельную регистрацию, подскажите как проверять не занят ли логин другим человеком с учетом регистра...
Visual Basic .NET Micro 29.02.2012 12:48
Visual Basic .NET Отображение всех имен, как список в таблице mysql
Доброго времени суток Dim Conect As String = "server=******;User Id=****;password=*****;Persist Security Info=True;database=*****" Dim sqlConect As New...
Visual Basic .NET ByRuNdUk 18.12.2011 11:57
Опции темы

Текущее время: 15:34. Часовой пояс GMT +4.

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.7 PL3
Copyright ©2000 - 2014, vBulletin Solutions, Inc.