我正在尝试比较字符串(网络ID)和使用SQL Like命令,返回受影响的行数(如果找到了用户名),但在我的代码中我总是得到“-1 “我找不到原因,用户名是正确的,并通过在SQL Server管理中运行查询在SQL表中找到。
Try
Dim Con As New SqlConnection
Con.ConnectionString = "Data Source=WCRDUSMJEMPR9\SQLEXPRESS;Initial Catalog=MicroDB;Integrated Security=True"
Con.Open()
Dim SQL2 As String
SQL2 = "SELECT * from MicroDB_Users WHERE Users LIKE '+@Usercheck+'"
Dim cmd2 As New SqlCommand(SQL2, Con)
cmd2.Parameters.AddWithValue("@Usercheck", TextBox1.Text)
Dim obj2 = cmd2.ExecuteNonQuery
Con.Close()
If obj2 > 0 Then
MsgBox(obj2)
Response.Redirect("~\ControlCharts\AddData_Control.aspx")
Label7_Control.Visible = False
Else
MsgBox(obj2)
Label7_Control.Text = ("You are not authorized to Add Data")
Label7_Control.Visible = True
End If
Catch ex As Exception
MsgBox(Err.Description)
如您所见,我使用IF来比较用户是否被发现(受到1行影响)或者是否找不到(受影响的是0行)。
答案 0 :(得分:4)
ExecuteNonQuery
仅用于插入,更新或删除查询。因此,您必须在查询中使用COUNT
并使用ExecuteScalar
或使用ExecuteReader
和读者的HasRows
属性。
Using var reader = cmd2.ExecuteReader()
If reader.HasRows Then
' ...
Else
' ...
End If
End Using
对于 UPDATE,INSERT和DELETE语句,返回值为 受命令影响的行数。当a上存在触发器时 正在插入或更新的表,返回值包括数字 受插入或更新操作影响的行数和数字 受触发器或触发器影响的行数。 适用于所有其他类型的 语句,返回值为-1。如果发生回滚,则返回 值也是-1。
更新:除此之外,您正在使用LIKE
运算符且参数不正确。而不是
SQL2 = "SELECT * from MicroDB_Users WHERE Users LIKE '+@Usercheck+'"
cmd2.Parameters.AddWithValue("@Usercheck", TextBox1.Text)
使用这种方法
SQL2 = "SELECT * from MicroDB_Users WHERE Users LIKE @Usercheck"
cmd2.Parameters.AddWithValue("@Usercheck", string.Format("%{0}%", TextBox1.Text))
答案 1 :(得分:0)
只有在执行INSERT,DELETE和UPDATE时才会返回受影响的行数。
对于UPDATE,INSERT和DELETE语句,返回值为 受命令影响的行数。当a上存在触发器时 正在插入或更新的表,返回值包括数字 受插入或更新操作影响的行数和数字 受触发器或触发器影响的行数。对于所有其他类型的 语句,返回值为-1。如果发生回滚,则返回 值也是-1。
要获取行数,请使用SELECT count(*) FROM myTable
ExecuteNonQuery
适用于不返回行的查询,显而易见其名称NonQuery
。
对于返回结果的查询,请改用
答案 2 :(得分:0)
当您编写INSERT
UPDATE
和DELETE
脚本而不是SELECT
时,行数会受到影响。请改用SQL2 = "SELECT * from MicroDB_Users WHERE Users LIKE '+@Usercheck+'"
和{{1} }
cmd2.ExecuteScalar()