第二个ExecuteReader()不起作用

时间:2013-05-04 05:26:58

标签: asp.net mysql vb.net

我有一个代码来检查用户的有效性,然后,如果用户有效,它会在数据库中插入某些值。

我的问题是,当我查询我的数据库以检查用户是否有效之后,我尝试将附加值传递给其帐户时,当我第二次调用ExecuteReader()时,流程停止。

没有错误,或类似的东西。我试图用ExecuteNoneQuery替换ExecuteReader(),但它仍然无法正常工作。我在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

3 个答案:

答案 0 :(得分:2)

如果要执行嵌套Reader,则必须创建另一个connection。你需要像

这样的东西
smd2 = New MySqlCommand(stquery2, myconn2)' myconn2 is another connection

OR

在连接字符串中设置“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

答案 1 :(得分: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注入攻击。请查看使用参数化查询。有一个不错的例子here

答案 2 :(得分:0)

逻辑是你需要在同一个连接上执行另一个阅读器(MyReader2)之前关闭你的第一个阅读器(myreader)。