1

我正在尝试比较一个字符串(网络 ID)并使用 SQL Like 命令,返回受影响的行数(如果找到了用户名)但是在我的代码中我总是得到“-1”,我找不到原因,用户名是正确的,通过在 SQL Server Mgt 中运行查询在 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 行)。

4

3 回答 3

4

ExecuteNonQuery仅用于插入、更新或删除查询。因此,您要么必须COUNT在查询中使用和使用,ExecuteScalar要么使用ExecuteReader和读者的 HasRows财产。

Using var reader = cmd2.ExecuteReader()
    If reader.HasRows Then
        ' ...
    Else
        ' ...
    End If
End Using

执行非查询

对于UPDATE、INSERT 和 DELETE 语句,返回值是受命令影响的行数。当正在插入或更新的表上存在触发器时,返回值包括受插入或更新操作影响的行数以及受一个或多个触发器影响的行数。对于所有其他类型的语句,返回值为 -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))
于 2013-01-22T22:56:54.510 回答
0

仅当您执行 INSERT、DELETE 和 UPDATE 时才会返回受影响的行数。

执行非查询

对于 UPDATE、INSERT 和 DELETE 语句,返回值是受命令影响的行数。当正在插入或更新的表上存在触发器时,返回值包括受插入或更新操作影响的行数以及受一个或多个触发器影响的行数。对于所有其他类型的语句,返回值为 -1。如果发生回滚,则返回值也是 -1。

要获取行数,请使用SELECT count(*) FROM myTable

ExecuteNonQuery用于不返回行的查询,从它的名称可以明显看出NonQuery

对于返回结果的查询,请改用这些

  • ExecuteReader() - 返回多行时
  • ExecuteScalar() - 当返回一行一列时。在你的情况下,这将是完美的
于 2013-01-22T22:57:56.923 回答
0

当您编写脚本时,行数会受到影响INSERT UPDATEDELETE而不是SELECT.. 使用SQL2 = "SELECT * from MicroDB_Users WHERE Users LIKE '+@Usercheck+'"而不是和cmd2.ExecuteScalar()

SQL2 = "SELECT COUNT(*) from MicroDB_Users WHERE Users LIKE '%" + TextBox1.Text + "%'";
        Dim cmd2 As New SqlCommand(SQL2, Con)
        cmd2.Parameters.AddWithValue("@Usercheck", TextBox1.Text)
        Dim obj2 As Int32 = 0
        obj2 = Convert.ToInt32(cmd2.ExecuteScalar())
于 2013-01-22T23:00:42.630 回答