Форум программистов, компьютерный форум CyberForum.ru
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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2011, 16:16

Посмотрите здесь:

Visual Basic .NET Проверить наличие запятых в тексте и заменить запятые точками

Visual Basic .NET Проверить наличие файлов Visual Basic (Сервис)

Visual Basic .NET проверить в базе Microsoft SQL Server наличие индекса

Visual Basic .NET Как узнать ID добавленной записи? (MySql)

Visual Basic .NET MS Sql: при добавлении новой записи, информация из первой записи в таблице исчезает

Visual Basic .NET Как проверить таблицу на наличие записи

Visual Basic .NET Проверить наличие файла в папке или на диске

Visual Basic .NET Отображение всех имен, как список в таблице mysql

gitarillo
Форумчанин
550 / 479 / 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
_
2274 / 1147 / 42
Регистрация: 28.10.2009
Сообщений: 4,113
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
_
2274 / 1147 / 42
Регистрация: 28.10.2009
Сообщений: 4,113
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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать новую тему
Опции темы

Текущее время: 04:02. Часовой пояс GMT +4.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.7 PL3
Copyright ©2000 - 2014, vBulletin Solutions, Inc.