ExecuteNonQuery返回-1(错误)

时间:2016-09-12 23:13:35

标签: vb.net sqlcommand executenonquery

我继承了一个旧的VB网站,它使用ExecuteNonQuery来修改密码。在我们的生产环境中,sql server 2008 R2,我最近有关于功能损坏的报告。事实证明,当实际数据正在更新(单行)时,ExecuteNonQuery返回-1。当我将数据复制到我们的开发环境时,受影响的行是预期的1。我们应用了不同的服务包(4XXX vs 6XXX),我想知道这是不是问题?我修改了代码以使用ExecuteScalar来检查RowCount,这是有效的。但我不应该这样做。任何见解?我现在知道这已经被打破了多长时间。

这是原始代码,错误地返回-1。它没有调用存储过程,也没有涉及触发器。

Dim cmd As SqlCommand = New SqlCommand("UPDATE UserMaster " & _
           " SET Password = @Password, LastPasswordChangedDate = @LastPasswordChangedDate " & _
           " WHERE Username = @UserName AND ApplicationName = @ApplicationName ", conn)

    cmd.Parameters.Add("@Password", SqlDbType.VarChar, 255).Value = CreateHash(newPwd)
    cmd.Parameters.Add("@LastPasswordChangedDate", SqlDbType.DateTime).Value = DateTime.Now
    cmd.Parameters.Add("@Username", SqlDbType.VarChar, 255).Value = username.TrimEnd
    cmd.Parameters.Add("@ApplicationName", SqlDbType.VarChar, 255).Value = Left(pApplicationName, 1)

Dim rowsAffected As Integer = 0
Try
    conn.Open()
    rowsAffected = cmd.ExecuteNonQuery()

此代码按预期返回1:

Dim cmd As SqlCommand = New SqlCommand("UPDATE UserMaster " & _
           " SET Password = @Password, LastPasswordChangedDate = @LastPasswordChangedDate " & _
           " WHERE Username = @UserName AND ApplicationName = @ApplicationName ; select @@rowcount", conn)

    cmd.Parameters.Add("@Password", SqlDbType.VarChar, 255).Value = CreateHash(newPwd)
    cmd.Parameters.Add("@LastPasswordChangedDate", SqlDbType.DateTime).Value = DateTime.Now
    cmd.Parameters.Add("@Username", SqlDbType.VarChar, 255).Value = username.TrimEnd
    cmd.Parameters.Add("@ApplicationName", SqlDbType.VarChar, 255).Value = Left(pApplicationName, 1)

Dim rowsAffected As Integer = 0
Try
    conn.Open()
    rowsAffected = CType(cmd.ExecuteScalar(), Integer)

1 个答案:

答案 0 :(得分:0)

根据{{​​3}}文档,

ExceuteNonQuery为所有存储过程返回-1。

它将返回更新的记录'只有在声明的情况下才会出现数字。