2016-09-12 6 views
0

古いVB Webサイトを継承し、ExecuteNonQueryを使用してパスワードを変更しました。私たちの運用環境では、SQL Server 2008 R2では、機能が壊れているという最近の報告がありました。実際にデータが更新されているとき(単一の行)、ExecuteNonQueryは-1を返していることが分かります。データを私たちの開発環境にコピーすると、影響を受ける行は期待どおり1になります。別のサービスパック(4XXXと6XXX)が適用されていますが、これが問題なのでしょうか? RowCountを検査するためにExecuteScalarを使用するようにコードを修正しました。これは動作しています。しかし、そうする必要はありません。どんな洞察?私は今、これがどれくらい長く壊れているのか考えました。ExecuteNonQueryは-1を返します(間違って)

ここには-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

'SET NOCOUNT OFF;'は更新前に追加します。それにより、余計な結果セットがselect文を妨害するのを防ぐことができます...私はこのアプローチをお勧めしません。あなたはそれを残すべきです...単純な更新をして問題にならないようにしてください。パラメタを出力し、更新後に設定します。あなたが実行されたときには、行数を取得します...または、あなたのような行数を選択します。 – Codexer

+0

そのテーブルにトリガーがありますか?はいの場合、これは助けになる可能性があります(http://stackoverflow.com/a/15702169/1050927) – Prisoner

+0

@Alex OPはトリガーがないと言っています...最後の文章です。 – Codexer

答えて

0

ExceuteNonQuery戻り-1 Msdnマニュアル通りのすべてのストアドプロシージャのために。

更新されたレコードの番号は、ステートメントの場合のみ返されます。

関連する問題