2010-12-01 6 views
1

SQL 저장 프로 시저에서 행을 삽입하고 새 행에 IDENTITY INT를 반환하려고하면 내 C# 코드에서 가져옵니다.C에서 SQL INSERT OUTPUT 값 가져 오기

ALTER PROCEDURE the_proc @val_2 VARCHAR(10), @val_3 VARCHAR(10) 
AS 
BEGIN 
SET NOCOUNT ON 
INSERT INTO the_table (field_2, field_3) 
    OUTPUT INSERTED.field_1 
    VALUES (@val_2, @val_3) 
END 

C#에서 나는 LINQ를 사용하고 있지만 그 OUTPUT 값을 검색하는 방법은 퍼지입니다. SQL proc 선언에서 OUTPUT 매개 변수로 포함 시키려고 시도했지만 그 중 하나를 호출 할 수 없습니다 (예외로 인해 호출에서 제공되지 않음). 가장 가까운 것은 Db.designer.cs 코드에 들어가는 것입니다. 여기서 IExecuteResult result ReturnValue에 0 (정확하지 않음)이 있지만 포함 된 결과 뷰 (result.ReturnValue Results View)에 출력 된 값이 있는지 검사합니다.

key = (int)(db.TheProc(val2,val3).ReturnValue); 

key

돌아오고 0으로 나는 INSERT에서 IDENTITY의 INT 값을합니다.

+2

직접 프로 시저를 실행하여 실제로 ID가 int인지 확인 했습니까? INSERTED.field_1 대신 @@ Identity를 사용해야 할 수도 있습니다. – StriplingWarrior

+2

@StriplingWarrior - OP의 절차는 정상적으로 작동합니다. 그의 접근법은 삽입 트리거가 테이블에 추가되면 올바르게 작동하므로'@@ identity '를 선택하면 더욱 강력 해집니다. –

+0

@ StriplingWarrior - 내가 말했듯이, VS 디버거에서 결과를 검사 할 때 IDENTITY INT가 있지만 (ReturnValue에는 없습니다). 어떻게 든 돌아오고 있어요. 내가 무엇을 요구하는지 그 값을 검색하기위한 C#/Linq 관용구이다. 감사. –

답변

1
OUTPUT INSERTED.* 

는 기본적으로 선택을하는 것과 같은 것. 따라서 출력 매개 변수로 표시되지 않고 결과 집합으로 돌아옵니다.

현재, ReturnValue는 실제로이 경우보고있는 값인 0이어야합니다.

결과 집합을 캡처 할 수 있도록 linq 문을 변경해야합니다.

+0

글쎄, 당신은 나를 위해 일하게 만들었지 만, 당신은 올바른 길로 나를 잡았습니다. 나는 이것을 받아 들일 것이지만 코드와 함께 대답을 추가하십시오. –

1

이 대신 (가정 SQL 서버)를보십시오 :

ALTER PROCEDURE the_proc 
@val_2 VARCHAR(10), 
@val_3 VARCHAR(10), 
@newKey int OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON 
    INSERT INTO the_table (field_2, field_3) VALUES (@val_2, @val_3) 
    SET @newKey = SCOPE_IDENTITY() 
END 

을 당신이 당신의 the_proc 저장 프로 시저를 정의하면 당신의 LINQ에 SQL로이 작업을 수행 할 수 있습니다 DBML :

 int? newKey = null; 
     dataContext.the_proc("val1", "val2", ref newKey); 
     // newKey.Value now contains your new IDENTITY value 
+0

hmmm ... 내가해야한다면, 나는 할 것이다. 그러나 내가 여기서 당황스럽게하는 것은 내가 OUTPUT INSERTED 값을 얻는 방법을 모른다라는 것이다. ** 어딘가에 ** 있습니다. 나는 검사하여 VS 디버거에서 볼 수 있다고 말했다 당신이 VS에서 볼 수있는 ReturnValue를 항상 0 값은 당신이 원하는 것없는 것을 매우 가능성이있는 경우'result.ReturnValue는 View' –

+0

결과. 저장 프로 시저에는 성공 또는 실패를 나타내는 int ReturnValue 출력이 있습니다. 이 게시물의 하단을보십시오 : http://www.cleardata.biz/articles/storedproc.aspx – Tahbaza

1

Chris Lively는 C# Linq 코드를 다시 검사하는 올바른 방향으로 나를 움직였습니다. 다음은 Field_1을 결과에서 가져옵니다. 어쩌면 정상적인 관용구가 아닌 이상한 방법 일 수 있습니다. 누군가가 "올바른"것에 대한 제안을 갖고 있다면 의견이나 답변을 추가하십시오.

var o = from res in db.MyProc(Val1, Val2) 
      select res.Field_1; 
int key = o.ToArray()[0]; 

감사합니다.

+1

다행 이네. 나는 Linq와 잘 맞지 않았다. 그렇지 않으면 나는 그것을 추가했을 것이다. 그럼에도 불구하고 이것이 올바른 방법입니다. – NotMe