-1

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

我的问题是,当我查询我的数据库以检查用户是否有效之后,我尝试将附加值传递给其帐户,当我第二次调用 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
4

3 回答 3

2

如果要执行嵌套Reader,则必须创建另一个connection。你需要类似的东西

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

请使用参数化查询以避免 SQL 注入

于 2013-05-04T05:35:27.847 回答
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 注入攻击。请查看使用参数化查询。这里有一个不错的例子。

于 2013-05-04T05:47:55.003 回答
0

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

于 2013-05-04T05:35:45.917 回答