2013-08-14 2 views
0

ASP.NET/C# 코드에서 액세스하는 SQL Server 2005 데이터베이스에 저장 프로 시저가 있습니다. 저장 프로 시저에 대한저장 프로 시저가 실행되지만 데이터를 업데이트하지 않습니다.

매개 변수는 일반적인 방식으로 정의됩니다

Try 
{ 

SqlCommand cmd = new SqlCommand("mystoredprocedure",myConnection) 
cmd.Parameters.Add(new SqlParameter("@p1"), SqlDbType.Int)) 
cmd.Parameters["@p1"].Value = myvalue (usually form inputs) 

. 
. 
. 

myConnection.Open() 
cmd.ExecuteNonQuery() 

} 
catch (Exception xx) 
{ 
lblError.Text = xx.Message; 
} 
finally 
{ 
myConnection.Close(); 
} 

문제는 저장 프로 시저가 오류를 throw하지 않습니다하지만, 내 데이터 결코 업데이트입니다. SQL Server에서 프로 시저를 확인한 후 SQL Server를 통해 직접 호출하면 proc이 업데이트합니다.

오랫동안 정상적으로 작동 했으므로이 머리카락을 찢어 버리고 작동을 멈췄습니다. 일반적인 범인을 확인했습니다 (db 연결이 올바른 데이터베이스를 가리키고 있으며 프로 시저가 SQL Server에서 제대로 작동하는 것으로 보입니다. 내가 만든 몇 가지 새로운 매개 변수를 주석으로 처리했습니다)

이걸 일으킬 수 있니? 동일한 절차가 SQL Server에서는 작동하지만 코드를 통해 오류가 발생하지 않는 것은 이상한 일입니다. (확실히, 내가 저장 프로 시저의 반환 값을 넣어 반환 값은 내가 롤백 아니에요 표시) 저장 프로 시저에 대한

편집

코드 :

BEGIN TRANSACTION 

    --get count 
update dbo.myTable set 
[email protected], 
[email protected], 
. 
. 
. 

WHERE [email protected] 

SET @Err = @@ERROR 

--if error rollback transaction 
IF @Err <> 0 
    BEGIN 
     ROLLBACK TRANSACTION 
     GOTO ErrorHandler 
    END 
Select @ReturnCode = 1 
COMMIT TRANSACTION 

RETURN 

ErrorHandler: 
--unknown error 
Select @ReturnCode = 0 
RAISERROR (@Err, 16, 1) WITH LOG 
RETURN -100 

편집

나는 cmd.ExecuteNonQuery를 구문 분석 할 때 결과가 -1이됩니다. 여전히 C# 코드가이 작업을 수행하지만 오류를 던지지 않는 이유를 파악하려고합니다. ExecuteNonQuery는 저장 프로 시저의 영향을받는 행 수를 반환해야합니까?

편집

내 역사를 다시 회전 속도를 올린다 몇 계단 한 TFS를 사용 - 쿼리를 깨고 내가 최근에 추가 된 추가 필드가처럼 보인다. 그 필드를 주석 처리하고 sproc을 호출하면 잘 동작합니다.

왜 그런지 모르지만 - 단지 varchar (255) 필드입니다. 이 데이터베이스에는 비슷한 방식으로 설정되는 많은 다른 필드가 있습니다. 이것이 왜 문제가 되는가에 대한 어떤 생각?

EDIT SQL 프로파일 러를 사용하면 실행 및 커밋 문을 볼 수 있지만 여전히 데이터가 업데이트되지 않습니다. 나는 sproc을 쓰레기로 다시 채울 필요가 있는지 궁금하네요?

SqlCommand cmd; 
cmd.CommandType = System.Data.CommandType.StoredProcedure; 

또는 당신은 아마 사용 :

+3

SQL 프로파일 러는 무엇이 있습니까? 전화는 무엇입니까? 매개 변수가 전송됩니까? – Pouki

+2

거기에 거래가 있습니까 (아마도 'TransactionScope'를 통해)? 아마도 데이터베이스 * 파일 *에 대해 실행하고 빌드 할 때마다 bin/debug에서 복사본을 버리는가? –

+0

SP 코드는 어디에 있습니까? 이 코드 주변에 주변 거래가 있습니까? – vittore

답변

0

봅니다 사용하는 SQL 텍스트로

CALL mystoredprocedure(@ParameterName) 

+1

이것이 문제라면, 우리는 큰 주목할만한 예외가'catch' 블록을 치기를 기대할 것입니다. –

1

시도를 그런 CommandType 설정 :

SqlCommand cmd = new SqlCommand("mystoredprocedure",myConnection) 
cmd.CommandType = CommandType.StoredProcedure 
+2

이것이 문제라면, 큰 주목할만한 예외가'catch' 블록을 치기를 기대합니다. –

4

실행을 저장 프로 시저 .Net 코드 (SQL Server Management Studio에서 직접)를 변경하고 변경 사항이 업데이트되는지 여부를 확인하십시오.아마도 명시적인 commit 문이 누락되었습니다.

+0

예, 커밋되지 않은 트랜잭션 나에게도. – Mels

+0

일반적으로 SQL Server는 자동 커밋 모드입니다. 따라서 연결을 닫으면 커밋을 실행합니다. – BendEg

+0

이렇게하면 코드가 제대로 실행되어 업데이트됩니다. 절차에 명시 적으로 커밋을했습니다. 프로 시저 코드 스 니펫을 게시합니다. – Tim

0

시도해보십시오!

SqlCommand cmd = new SqlCommand(string.Format("mystoredprocedure('{0}')",inputValue),myConnection) 
0

SQL Server에서 sp를 직접 실행하고 저장 프로 시저에서 오류 처리를 제거하여 .Net에서 정확한 오류를 가져 오도록하십시오.

0

나를 위해 간단한 것을 시도해 볼 수 있습니까?

매개 변수를 허용하지 않도록 저장 프로 시저를 변경하십시오. 저장된 proc의 로직을 변경하여 하나의 테이블에 하나의 행을 삽입 한 다음 코드를 변경하여 해당 프로 시저를 호출하고 호출의 성공 여부를 찾습니다.

0

잘못된 방법으로 저장 프로 시저를 호출한다고 생각합니다. INSERT/UPDATE/DELETE 인 경우 값은 영향을받는 행 수이고, 롤백이 있으면 -1입니다. ExecuteNonQuery가 반환하는 값 -1은 다음 문으로 인해 발생합니다. 다른 모든 경우에 반환 값은 -1입니다 (나는 생각합니다).

을 :

두 개의 매개 변수를하는 SqlCommand (문자열,도록 SqlConnection)와 함께 사용하는 SqlCommand 생성자는 "간부 myProcedure의 @의 PAR1"같은 것을 실행할 수 있으며, 매개 변수 등을 설정 할 수 있도록 첫 번째는 일반적인 쿼리 것을 필요

Dim par1 As New SqlParameter("@par1", SqlDbType.VarChar, 50) 
par1.Value = "DummyValue" 
cmd.Parameters.Add(par1) 

그러나 이상적인 상황에서 CommandType을 "StoredProcedure"로 설정하는 것보다 저장된 것을 호출 할 때 MSDN은이 링크에서 http://msdn.microsoft.com/it-it/library/yy6y35y8.aspx을 제안합니다.

(나는 당신에게 VB 코드를 표시합니다 ... 죄송합니다 .. 쉽게 this 같은 도구를 사용하여 C 번호로 변환합니다.) 당신이 실행 저장 프로 시저에서 값을 읽으려면

, 당신이 채울 수 있습니다 당신은 당신이 할 수있는 아무것도 읽을 필요가없는 경우

 Dim da As New SqlDataAdapter(cmd) 
     da.Fill(ds, "result") 

     If ds.Tables.Item("result").Rows.Count > 0 Then 
      Return True 
     Else 
      Return False 
     End If 

단순히 사용 :

 cmd.ExecuteNonQuery() 

datased (예를 들어, "DS")는 SqlAdapter를 사용하여이 - 여긴에만 예 -입니다 확실히 당신이 저장 프로 시저를 실행하려는 말할했습니다 :

 cmd.CommandType = CommandType.StoredProcedure 

희망 당신에게 유용 할 ...

안녕, 마시모.

0

커맨드 객체를 생성하는 동안 커맨드 타입이 누락되었다고 생각합니다. 커맨드 객체의 커맨드 타입을 StoreProcegure로 설정 한 다음 다시 확인하십시오 .. 커맨드 타입을 설정하지 않으면 UR 쿼리가 실행되지만 u 오류는 발생하지 않습니다. 결과도.

0

코드에서 전달하는 매개 변수 이름이 프로 시저에서 사용중인 것과 다르다는 것을 알 수 있습니다.

1

바보 같지만 디스크 공간이 부족한 경우 SQL Server가 동작을 확인했지만 오류는 발생하지 않지만 데이터는 저장되지 않습니다. 확인하기도 쉽다!

관련 문제