ExecuteReader:在尝试为我的数据库生成注册表形式时,CommandText属性尚未初始化



大家好,我正在为我的数据库编写一个注册表单,我带来了这段代码>>,有人能帮忙吗?

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Dim cn As New SqlConnection
    Dim cmd As New SqlCommand
    Dim dr As SqlDataReader
    cn.ConnectionString = "Server=localhost;Database=test;Uid=sa;Pwd=fadyjoseph21"
    cmd.Connection = cn
    cmd.CommandText = "INSERT INTO test2(Username,Password) VALUES('" & TextBox1.Text & "','" & TextBox2.Text & "')"
    cn.Open()
    dr = cmd.ExecuteReader
    If dr.HasRows Then
        MsgBox("You're already registered")
    Else
        MsgBox("Already registered")
    End If
End Sub

用这种方式编辑Code。。

cmd.CommandText = "INSERT INTO User_Data(Username,Password) VALUES('" & TextBox1.Text & "' , '" & TextBox2.Text & "')"
cn.Open()
cmd.ExecuteNonQuery() 
cn.Close()

Insert不会检索任何记录—它是您要使用的SELECT语句。我建议您使用存储过程来避免Sql注入。

ExecuteReader它用于"SELECT"查询,有助于填充DataTable。在这种情况下,您可以在定义cmd.commandText之前执行命令。

您应该在之前定义cmd.commandText,然后使用ExecuteNonQuery,如下所示。

Dim cn As New SqlConnection
Dim cmd As New SqlCommand
cn.ConnectionString = "Server=localhost;Database=test;Uid=sa;Pwd=fadyjoseph21"
cmd.Connection = cn
cn.Open()
cmd.CommandText = "INSERT INTO User_Data(Username,Password) VALUES('" & TextBox1.Text & "','" & TextBox2.Text & "')"
cmd.ExecuteNonQuery()
cn.Close()

cmd.CommandText应在调用cmd.ExecuteReader 之前被分配存储过程名称或实际的原始SQL语句

更新:

更改代码如下

.... cmd.Connection = cn cmd.CommandText = "select * from TblToRead where <filter>" ''This is select query statement missing from your code cn.Open() dr = cmd.ExecuteReader ....

其中<filter>将类似于username = "' & Request.form("username') & '" '

发生错误本身是因为您试图在定义该查询之前执行查询:

dr = cmd.ExecuteReader
'...
cmd.CommandText = "INSERT INTO User_Data(Username,Password) VALUES('" & TextBox1.Text & "' and '" & TextBox2.Text & "')"

当然,这没有道理。你必须告诉计算机要执行什么代码,然后才能执行该代码:

cmd.CommandText = "INSERT INTO User_Data(Username,Password) VALUES('" & TextBox1.Text & "' and '" & TextBox2.Text & "')"
'...
dr = cmd.ExecuteReader

但是,这不是您唯一的问题。。。

您还试图执行DataReader,但SQL命令不会返回数据。这是一个INSERT命令,而不是SELECT命令。所以你只需要直接执行它:

cmd.CommandText = "INSERT INTO User_Data(Username,Password) VALUES('" & TextBox1.Text & "' and '" & TextBox2.Text & "')"
cmd.ExecuteNonQuery

可以INSERT命令中读取的一个值是受影响的行数。类似这样的东西:

cmd.CommandText = "INSERT INTO User_Data(Username,Password) VALUES('" & TextBox1.Text & "' and '" & TextBox2.Text & "')"
Dim affectedRows as Int32 = cmd.ExecuteNonQuery

此时,affectedRows将包含查询成功插入的行数。所以如果是0,那么就出了问题:

If affectedRows < 1 Then
    'No rows were inserted, alert the user maybe?
End If

此外,这一点很重要,您的代码对SQL注入是完全开放的。不要直接将用户输入作为数据库中的代码执行。相反,将其作为参数值传递给预定义的查询。基本上,将用户输入视为,而不是可执行代码。类似这样的东西:

cmd.CommandText = "INSERT INTO User_Data(Username,Password) VALUES(@Username,@Password)"
cmd.Parameters.Add("@Username", SqlDbType.NVarChar, 50).Value = TextBox1.Text
cmd.Parameters.Add("@Password", SqlDbType.NVarChar, 50).Value = TextBox2.Text

(注意:我猜到了列类型和列大小。根据您的表定义进行必要的调整。)

另外,请不要将用户密码存储为纯文本。这是对用户极不负责任的,并有暴露其私人数据的风险(即使是您不控制的其他网站上的私人数据,如果他们重复使用密码)。用户密码应该用单向散列来掩盖,并且永远不应该是可检索的,即使你是系统所有者也是如此。

执行查询后,您正试图更改CommandText。

试试这个:

Private cn = New SqlConnection("Server=localhost;Database=test;UID=sa;PWD=secret")
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Dim cmd As New SqlCommand
    cmd.CommandText = "select * from table1" ' your sql query selecting data goes here
    Dim dr As SqlDataReader
    cmd.Connection = cn
    cn.Open()
    dr = cmd.ExecuteReader
    If dr.HasRows = 0 Then
        InsertNewData(TextBox1.Text, TextBox2.Text)
    Else
        MsgBox("Already registered")
    End If
End Sub
Private Sub InsertNewData(ByVal username As String, ByVal password As String)
    Dim sql = "INSERT INTO User_Data(Username,Password) VALUES(@Username, @Password)"
    Dim args As New List(Of SqlParameter)
    args.Add(New SqlParameter("@Username", username))
    args.Add(New SqlParameter("@Password", password))
    Dim cmd As New SqlCommand(sql, cn)
    cmd.Parameters.AddRange(args.ToArray())
    If Not cn.ConnectionState.Open Then
        cn.Open()
    End If
    cmd.ExecuteNonQuery()
    cn.Close()
End Sub

此代码将INSERT命令引用到另一个过程中,您可以在其中创建一个新的SqlCommand来执行此操作。

我还在这里更新了您的SQL查询以使用SqlParameters,这比直接将值添加到字符串中安全得多。请参阅SQL注入。

InsertNewData方法使用SQLParameters数组构建SQL命令,确保连接处于打开状态并执行插入命令。

希望这能有所帮助!

最新更新