2011-04-05 5 views
1
private void btnGo_Click(object sender, EventArgs e) 
    { 
     Array IDlist = txtUserID.Text.Split(new char[] { }); 
     ArrayList badID = new ArrayList(); 

     foreach (string textLine in IDlist) 

     { 

      try 
      { 

       int LineID = Convert.ToInt32(textLine); 
       string emp = txtDistricts.Text; 
       command.Parameters.Add("@EmpID", SqlDbType.Int).Value = LineID; 

       if (!emp.Equals(string.Empty)) 
        command.Parameters.Add("@SchoolDistricts", SqlDbType.NVarChar).Value = emp; 
       else command.Parameters.Add("@SchoolDistricts", SqlDbType.NVarChar).Value = DBNull.Value; 
       if (cbRemove.Checked) 
        command.Parameters.Add("@Options", SqlDbType.Int).Value = 1; 
       else if (cbReset.Checked) 
        command.Parameters.Add("@Options", SqlDbType.Int).Value = 0; 
       else command.Parameters.Add("@Options", SqlDbType.Int).Value = DBNull.Value; 

       SqlParameter returnValue = new SqlParameter("@return_value", DbType.String); 
       returnValue.Direction = ParameterDirection.ReturnValue; 
       command.Parameters.Add(returnValue); 

       conn.Open(); 
       command.Connection = conn; 

       // command.ExecuteNonQuery(); 
       command.ExecuteScalar(); 

       String OutPutCheck = (command.Parameters["@return_value"].Value.ToString()); 
       String getCheck = (command.ExecuteScalar().ToString()); 
       OPBox.Text += LineID + "--->>" + OutPutCheck + "--->>" + getCheck + "\n"; 

       conn.Close(); 




       //flagUser(LineID, emp); 
      } 
      catch (Exception ex) 
      { 
       //stored procedure error 
       badID.Add(textLine); 
       conn.Close(); 
      } 
     }} 

ID를 한 번에 가져 오는 APP를 만들었습니다. btn_click 이후에이 값들은 배열로 저장됩니다. 그런 다음 배열에서 각 ID를 하나씩 저장 프로 시저에 전달하고 반환 값을 가져옵니다. 물론 첫 번째 값은 반환 값을 제공하지만 두 번째 값이 프로 시저를 저장하기 위해 전달되면 다음과 같은 오류가 발생합니다.C#을 사용하여 저장 프로 시저 호출

> ERROR::::ex = {"Procedure or function 
> usp_Flag_Employee has too many 
> arguments specified."} 
+2

우리는 당신의 sproc을 볼 수 있습니까? –

+0

저장 프로 시저의 헤더 (매개 변수 선언)를 포함하십시오. – harpo

+1

이 코드에서 생성되는 SQL 명령은 어디에 있습니까? 그것이 클래스 수준의 객체라면 ... 이미 사용 된 적이 있고 이미 매개 변수가 추가되어있을 가능성이 있습니다. –

답변

0

예에서 SqlCommand 개체를 생성하는 코드가 표시되지 않습니다.

명령이 클래스에 로컬 인 경우 명령이 이미 사용 된 가능성이 있습니다 (즉, 이미 매개 변수가 추가되어있을 가능성이 높음).

또한 명령 유형을 StoredProcedure으로 설정하는 코드는 없습니다. 명령 텍스트가 무엇인지에 따라 문제가 될 수도 있습니다 (유형을 설정하지 않고 저장 프로 시저 이름을 전달하면 매개 변수가없는 것으로 명령이 표시됩니다).

SqlConnection과 을 사용하는 코드를 다시 작성하면 디버그가 훨씬 쉬워집니다 (물론 이미 존재하지 않는 한 해당 코드를 제공하지 않은 경우).

편집

난 그냥 당신이 매개 변수를 삭제하지 않고 foreach 루프 내부의 코드를 사용하고있는 것으로 나타났습니다. 그것은 또 다른 문제입니다 (그리고 아마도이 문제의 가장 큰 원인 일 것입니다). 새로운 매개 변수를 추가하기 전에 각 루프 시작 부분에 command.Parameters.Clear()으로 전화하십시오.

+0

감사합니다. 감사합니다 – Dumy

1

너무 많은 매개 변수를 프로 시저에 전달 중입니다. 프로 시저 코드를 붙여 넣으면 식별하는 데 도움이됩니다. 단, 매개 변수의 수를 계산하고 proc에 모두 정의되었는지 확인하십시오.

4

재설정하지 않고도 명령 개체에 매개 변수를 계속 추가 할 수 있습니다. 연결 및 명령 객체를 호출중인 메소드로 이동하고 'using'문을 사용해야합니다.

연결 및 명령이 클래스 필드이므로 루프의 각 인스턴스가 이전 매개 변수 집합에 매개 변수를 다시 추가합니다. 최소한 루프 상단에서 매개 변수 컬렉션을 재설정하십시오.

+0

+1, 명령이 없습니다. 매개 변수. for 루프가 다음 항목으로 시작하기 전에 취소하십시오 ... –

0

매개 변수를 추가하기 전에 Clear 메서드를 호출하십시오.

0

command 개체에 매개 변수가 없기 때문에 처음으로 작동합니다. 후속 반복 할 때마다 command 개체에 다른 매개 변수 집합을 계속 추가합니다.

command 개체는 각 반복마다 clear the parameters이어야합니다.

관련 문제