0

对不起我的英语不好。我的代码有问题:

Dim sq As String = "SELECT username FROM standing WHERE username = @user"
            Dim con As New SqlConnection(Sql.ConnectionString)
            Dim cmd As New SqlCommand(sq, con)
            cmd.Parameters.Add("@user", SqlDbType.VarChar)
            cmd.Parameters("@user").Value = "contesttest"
            con.Open()
            Dim index As Integer = cmd.ExecuteNonQuery
            con.Close()
            If (index > 0) Then
                'Something..
            Else
                'Something else..
            End If

在我的代码中,“contesttest”存在于数据库中,并且返回的行(索引)应该大于 0。但是索引是-1!有什么问题?我的连接字符串是正确的。
不管是 C# 还是 VB.Net

4

4 回答 4

2

如果您的用户名字段是唯一索引(意味着您没有两个具有相同值的用户名),则可以在不使用 SqlDataReader 的情况下重写您的查询

Dim sq As String = "SELECT username FROM standing WHERE username = @user"
Using con SqlConnection(Sql.ConnectionString)
Using cmd As New SqlCommand(sq, con)
    cmd.Parameters.Add("@user", SqlDbType.VarChar)
    cmd.Parameters("@user").Value = "contesttest"
    con.Open()
    Dim username = cmd.ExecuteScalar
    If userName IsNot Nothing Then
        'Something..
    Else
       'Something else..
    End If
End Using
End Using 

ExecuteScalar返回您的命令检索到的第一行的第一列。如果您的列是唯一索引/主键,那么您只有一行,并且您只返回用户名。所以如果有返回的东西,那么你已经找到了你的用户

于 2013-06-07T08:53:55.877 回答
1

MSDN;

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

这不是问题。它是ExecuteNonQuery方法的定义。

于 2013-06-07T08:46:27.650 回答
1

使用某种 Reader(如 SqlDataReader)来获取从SELECT语句返回的行数或ExecuteScalar获取单个返回值。UsingExecuteNonQuery只会返回与SELECT语句一起使用时受影响的行数。

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

于 2013-06-07T08:47:38.633 回答
0

我想SqlDbType.VarChar只允许一个字符..您length还需要为 varchar 传递。

例如:-

  cmd.Parameters.Add("@user", SqlDbType.VarChar,80)
于 2013-06-07T08:46:57.240 回答