
[英]ExecuteReader CommandText property has not been properly initialized
[英]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.