2016-09-12 10 views
0

이전 VB 웹 사이트를 상속하고 ExecuteNonQuery를 사용하여 암호를 수정합니다. 우리 프로덕션 환경에서 SQL Server 2008 R2, 최근에 고장난 기능에 대한 보고서를 받았습니다. 실제로 ExecuteNonQuery는 데이터가 업데이트되는 경우 (단일 행) -1을 반환합니다. dev 환경에 데이터를 복사 할 때 영향을받는 행은 예상대로 1입니다. 우리는 다른 서비스 팩을 적용했습니다 (4XXX 대 6XXX) 이것이 문제인지 궁금합니다. ExecuteScalar를 사용하여 RowCount를 검사하도록 코드를 수정했는데 이것이 작동합니다. 하지만 그렇게해서는 안됩니다. 어떤 통찰력? 나는 이것이 얼마나 오랫동안 깨져 있었는지 생각 해왔다.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 문을 방해하지 못하게 할 때 ...이 방법을 사용하지 않는 것이 좋습니다. 간단한 업데이트만으로 문제가되지 않도록해야합니다. 또 다른 옵션은 declare입니다. ouput 매개 변수를 지정하고 업데이트 후에 설정하십시오. 실행하면 행 수가 생깁니다 ... 또는 행 수를 선택하십시오. – Codexer

+0

테이블에 트리거가 있습니까? 그렇다면 도움이 될 수 있습니다. (http://stackoverflow.com/a/15702169/1050927) – Prisoner

+0

@Alex OP에 트리거가 없습니다 ... 마지막 문장. – Codexer

답변

0

ExceuteNonQuery -1을 반환 Msdn 문서에 따라 모든 저장 프로 시저를.

명세서의 경우에만 업데이트 된 레코드의 번호를 반환합니다.