2014-08-29 8 views
1

저장 프로 시저 :비주얼 C# 저장 프로 시저

ALTER PROCEDURE VendorsRowcount 
    @RowCount int OUTPUT 
AS 
    SET NOCOUNT ON 

    SELECT * 
    FROM dbo.Vendors 

    SET @RowCount = @@ROWCOUNT 

    RETURN @RowCount 

C 번호 :

using (var conn = new SqlConnection("Data Source=.\\SQLEXPRESS;Initial Catalog=Pricer;Persist Security Info=True;User ID=xxx;Password=xxx")) 
using (var command = new SqlCommand("VendorsRowcount", conn) 
{ 
    CommandType = CommandType.StoredProcedure 
}) 
{ 
    conn.Open(); 
    command.ExecuteNonQuery(); 
    conn.Close(); 
} 

나는 오류가 점점 오전 :

Additional information: Procedure or function 'VendorsRowcount' expects parameter '@RowCount', which was not supplied.

난 그냥 오전 VB를 배워서 C#을위한 인터넷에 더 많은 리소스가 있다는 것을 깨닫고 C#을 배우십시오.

이것은 아마도 어리석은 질문이지만, 나는 대답을 찾을 수 없기 때문에 나는 수색을했고, 아마도 내가 사용하는 용어가 올바르지 않을 수도 있습니다.

@RowCount가 출력되므로 매개 변수를 보낼 필요가 없습니다.

왜이 오류가 발생합니까?

+3

을하지만 당신은 RowCount' @ 당신의 SP에'있나요? –

답변

3

저장 프로 시저에 매개 변수를 선언 할 경우에는 관련 OUTPUT으로 선언 된 사실이 없습니다. C# 코드에서 전달해야합니다. 대안은 다른 대답에서와 같이 매개 변수를 선택적으로 선언하는 것입니다. 그러나 이제는 문제가 생겼습니다. C# 코드에서 매개 변수의 값을 어떻게 다시 읽습니까?

첫번째 옵션은 C# 1 측의 매개 변수 집합을 작성하고 그것을 읽어 SqlCommandBuilder.DeriveParameters 메소드 호출 등의 선택 파라미터를 저장 프로 시저의 파라미터를 전달하고 다시

conn.Open(); 
SqlParameter prm = command.Parameters.Add(new SqlParameter("@RowCount", SqlDbType.Int)); 
prm.Direction = ParameterDirection.Output; 
command.ExecuteNonQuery(); 
Console.WriteLine(prm.Value.ToString()); 
conn.Close(); 

번째 옵션을 읽어 설정 뒤로. 나는이 사실에 의아해하고 그러나 당신이 잠재적으로 비용이 많이 드는 SELECT * 명령을 실행하는 것이

-- in the stored procedure 
@RowCount int = 0 OUTPUT 


conn.Open(); 
SqlCommandBuilder.DeriveParameters(command); 
command.ExecuteNonQuery(); 
Console.WriteLine(command.Parameters["@RowCount"].Value.ToString()); 
conn.Close(); 

(이 솔루션의 효율성에 대해 제공된 링크에서 발언 섹션을 읽어 보시기 바랍니다)하지만 그렇게하지 것은 관심이 보인다 레코드가 반환되었습니다. 이러한 맥락에서

는의 StoredProcedure 과도한 것 같다 당신은 행이 작성 단순히 계산 얻을 수 있지만 유지 보수 문제를 추가합니다

conn.Open(); 
command.CommandText = "SELECT COUNT(*) FROM Vendors"; 
int rowCount = Convert.ToInt32(command.ExecuteScalar()); 
Console.WriteLine(rowCount.ToString()); 
conn.Close(); 
+0

완벽하게 작동했습니다. 그리고 나는 내 코드가/나쁘다는 것을 안다. 나는 네트워크 기술자이지 프로그래머가 아닙니다. 나는 프로그래머가되기 위해 내 직업에 대해서만 들었다. 그래서 나는 노력하고있다. 나는 VB에서 3 주 정도의 경험을 쌓았으며 C#으로 어지럽 혔다. 나는 그 바보 같은 질문들이 많을 것이라고 확신한다. – Katp00p

+0

이것은 단지 검색어를 입력하는 것만 큼 어려운 것처럼 보입니다. 나는 그들이 시간을 절약 할 것이라고 생각했기 때문에 저장 프로 시저를 사용하고 있었다. – Katp00p

+0

복잡한 작업이나 성능의 마지막 부분을 쥐어 짜기 위해 정말로 필요한 경우가 아니면 그냥 간단한 SELECT만으로 SP에서 멀어 지도록 제안합니다.예를 들어 간단한 방법으로 레코드의 COUNT (*)를 얻을 수 있습니다. – Steve

1

매개 변수가 선택적이어야하는 경우 저장 프로 시저에 기본값을 제공해야합니다. 예를 들어

: @RowCount의 INT 출력 = 0