比较受影响的行数

时间:2013-01-22 22:53:53

标签: asp.net sql visual-studio-2010

我正在尝试比较字符串(网络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行)。

3 个答案:

答案 0 :(得分:4)

ExecuteNonQuery仅用于插入,更新或删除查询。因此,您必须在查询中使用COUNT并使用ExecuteScalar或使用ExecuteReader和读者的HasRows属性。

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

ExecuteNonQuery

  

对于 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时才会返回受影响的行数。

  

ExecuteNonQuery

     

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

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

ExecuteNonQuery适用于不返回行的查询,显而易见其名称NonQuery

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

  • ExecuteReader() - 返回多行时
  • ExecuteScalar() - 返回一行和一列时。在您的情况下,这将是完美的

答案 2 :(得分:0)

当您编写INSERT UPDATEDELETE脚本而不是SELECT时,行数会受到影响。请改用SQL2 = "SELECT * from MicroDB_Users WHERE Users LIKE '+@Usercheck+'"和{{1} }

cmd2.ExecuteScalar()