2013-05-04 2 views
-1

У меня есть код, который проверяет действительность пользователя, а затем, если пользователь действителен, он вставляет определенные значения в базу данных.second ExecuteReader() не работает

Моя проблема в том, что после того, как я запрошу свою базу данных, чтобы проверить, является ли пользователь действительным, и после этого я пытаюсь передать дополнительное значение своей учетной записи, поток прекращается, когда я вызываю ExecuteReader() во второй раз.

Ошибка отсутствует или что-то в этом духе. Я попытался заменить ExecuteReader() на ExecuteNoneQuery, но все же он не работает. Я попробовал весь запрос в командной строке mysql, они работают отлично. Я действительно не могу понять, что я делаю неправильно. Кто-нибудь может мне помочь?

Вот код:

Try 
      myconn.Open() 
      Dim stquery As String = "SELECT * from accountstbl WHERE SE_ID = " & Id.Text 
      Dim smd = New MySqlCommand(stquery, myconn) 
      Dim myreader = smd.ExecuteReader() 
      If Not myreader.HasRows Then 
       errorUser.Visible = True 

      Else 
       myreader.Read() 
       Dim name As String = myreader.Item("user_name").ToString() 

       Dim stquery2 = "INSERT into backup VALUES (" & name & ", '" & Info & "')" 
       Dim smd2 = New MySqlCommand(stquery2, myconn) 
       Dim Myreader2 As MySqlDataReader 
       'smd.ExecuteNonQuery()' 
       'THE CODE STOPS HERE' 
       Myreader2 = smd2.ExecuteReader() 
       'Myreader2.Read()' 

       MsgBox("The BACKUP INFORMATION HAS BEEN SAVED") 


      End If 
      myconn.Close() 
     Catch ex As Exception 
      Dim ErrorMessage As String = "alert('" & ex.Message.ToString() & "');" 
      Page.ClientScript.RegisterStartupScript(Me.GetType(), "ErrorAlert", ErrorMessage, True) 
      myconn.Close() 
     End Try 

ответ

2

Поскольку ваш второй запрос - это обновление, а не выбор, его необходимо выполнить с помощью метода ExecuteNonQuery. Ваш код с комментариями показывает попытку вызвать ExecuteNonQuery, но на неправильный объект команды (smd, когда он должен быть smd2). Попробуйте что-нибудь подобное вместо этого:

myreader.Read() 
Dim name As String = myreader.Item("user_name").ToString() 

Dim stquery2 = "INSERT into backup VALUES (" & name & ", '" & Info & "')" 
Dim smd2 = New MySqlCommand(stquery2, myconn) 
smd2.ExecuteNonQuery() 

ExecuteNonQuery Метод возвращает количество обновленных строк как int значение, так что вы можете захватить его, если это ценно для вас. В вашем случае это, вероятно, нет, но вот как вы бы проверить все равно:

int rowsAdded = smd2.ExecuteNonQuery(); 
if (rowsAdded == 1) { 
    // expected this 
} else { 
    // didn't expect this 
} 

Наконец, конкатенация строк для построения команды SQL может оставить вас уязвимым для атак SQL Injection. Пожалуйста, взгляните на использование параметризованных запросов. Есть приличный пример here.

+0

Вы его правильно. – meks

+0

так много спасибо вам !!! Это было очень полезно – meks

+1

+1 побей меня немного –

2

Если вы хотите выполнить вложенную Reader, вы должны создать еще один connection. Вам нужно somethig как

smd2 = New MySqlCommand(stquery2, myconn2)' myconn2 is another connection 

ИЛИ

Набор "MultipleActiveResultSets=True в строке подключения.

Кроме того, использование ExecuteNonQuery() для вставки

Dim name As String = myreader("user_name").ToString() 
Dim stquery2 = "INSERT into backup VALUES ('" & name & "', '" & Info & "')" 
Dim smd2 = New MySqlCommand(stquery2, myconn) 
smd.ExecuteNonQuery() 

Пожалуйста, используйте Parameterized query to avoid SQL Injection

+0

момент я попробую – meks

+0

Нет ошибки в ошибке. – meks

+0

Вот что меня озадачивает. Я просто не могу понять, что с кодом – meks

0

Логика это то, что вы d, чтобы закрыть ваш первый читатель (myreader) перед тем, как выполнить другой считыватель (MyReader2) в том же соединении.

+0

ОК. Но в этом случае я бы ошибся. Но это не происходит. – meks

+0

wait Я попытаюсь закрыть существующий. – meks

+0

@nelsonb Вы верны, но дайте ответ с кодом, которое будет оценено –

Смежные вопросы