我有一个代码来检查用户的有效性,然后,如果用户有效,它会在数据库中插入某些值。
我的问题是,当我查询我的数据库以检查用户是否有效之后,我尝试将附加值传递给其帐户时,当我第二次调用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
答案 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()
答案 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)。