大家好,我正在为我的数据库编写一个注册表单,我带来了这段代码>>,有人能帮忙吗?
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命令,确保连接处于打开状态并执行插入命令。
希望这能有所帮助!