我继承了一个旧的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)
答案 0 :(得分:0)
ExceuteNonQuery
为所有存储过程返回-1。
它将返回更新的记录'只有在声明的情况下才会出现数字。