简体   繁体   中英

second ExecuteReader() doesn't work

I have a code which checks the validity of user and then, if a user is valid it inserts certain values in the database.

My problem is when After I query my database to check if a user is valid and after that i try to pass the additional value to its account the flow stops when I invoke ExecuteReader() for the second time.

There is no error, or anything like that. I tried to substitute ExecuteReader() with ExecuteNoneQuery but still it's not working. I tried all the query in mysql command prompt they are working perfectly. I really can't understand what am I doing wrong there. Can anyone help me please?

Here is the code:

 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

If you want to execute nested Reader , you have to create another connection . You need somethig like

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

OR

Set " MultipleActiveResultSets=True in your connection string.

Also, use ExecuteNonQuery() for Inserting

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

Please use Parameterized query to avoid SQL Injection

Because your second query is an update, not a select, you need to execute it using the ExecuteNonQuery method. Your commented-out code shows an attempt to call ExecuteNonQuery but on the wrong command object ( smd when it should be smd2 ). Try something like this instead:

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()

The ExecuteNonQuery method returns the number of rows updated as an int value, so you can capture it if it's valuable to you. In your case it's probably not, but here's how you'd check anyway:

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

Finally, concatenating strings to build SQL commands can leave you vulnerable to SQL Injection attacks. Please take a look at using parameterized queries. There's a decent example here .

逻辑是您需要先关闭第一个阅读器(myreader),然后再在同一连接上执行另一个阅读器(MyReader2)。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM