繁体   English   中英

ExecuteReader:尝试为我的数据库创建注册表单时,尚未初始化CommandText属性

[英]ExecuteReader: CommandText property has not been initialized when trying to make a register form for my database

大家好,我正在尝试为我的数据库编写一个注册表单,我附带了此代码>>所以有人可以帮忙吗?

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-Injections

在调用cmd.ExecuteReader之前,应该为cmd.CommandText分配存储的proc名称或实际的原始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') & '" '

ExecuteReader用于“ SELECT”查询,有助于填充数据表。 在这种情况下,可以在定义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()

执行查询后,您尝试更改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 Command,确保连接已打开并执行insert命令。

希望这可以帮助!

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

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

(注意:我猜想列的类型和列的大小。根据需要对表定义进行调整。)

另外 ,请勿将用户密码存储为纯文本格式。 这对您的用户是完全不负责任的 ,并且有暴露其私人数据的风险(即使您重复使用密码,您也无法控制其他站点上的私人数据)。 用户密码应该以1向哈希来掩盖,并且永远不能被检索,即使您是系统所有者也是如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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