2011-09-13 6 views
4

사용자가 다른 요일에 시간을 입력/체크 아웃 할 수있는 시간 기록기 응용 프로그램이 있습니다. 양식은 매일 매일의 in/out을 처리하고 매개 변수로 저장 프로 시저에 넣고 데이터베이스에 추가합니다. 가장 효율적인 방법은 무엇입니까? 데이터베이스에 액세스 할 수 없으며 저장 프로 시저 만 사용할 수 있습니다.C#에서 저장 프로 시저를 여러 번 실행하는 방법

이것은 기본적인 코드이므로, 불필요한 코드를 제거했습니다.

SqlConnection conn = new SqlConnection(connString); 
conn.Open(); 
SqlCommand cmd = new SqlCommand("insertINOUT", conn); 
cmd.CommandType = CommandType.StoredProcedure; 

cmd.Parameters.Add(new SqlParameter("@UserName", user)); 

for (int j = 0; j < weekDays.Length; j++) 
{ 
    cmd.Parameters.Add(new SqlParameter("@In", in)); 
    cmd.Parameters.Add(new SqlParameter("@Out", out)); 
    cmd.ExecuteReader(); 
} 
conn.Close(); 

입/출력이 1 일 밖에되지 않는 경우 코드가 작동합니다. 사용자가 여러 날을 기입하면이 오류가 발생합니다. '@In'매개 변수가 여러 번 제공되었습니다.

도움 주셔서 감사합니다.

+0

그것은 모든 때문에'for' 루프에서 그'new' 문장들입니다. 이미 존재하는 새로운 것을 만들기 위해 노력하고 있습니다. – Brad

답변

13
SqlConnection conn = new SqlConnection(connString); 
conn.Open(); 
SqlCommand cmd = new SqlCommand("insertINOUT", conn); 
cmd.CommandType = CommandType.StoredProcedure; 

for (int j = 0; j < weekDays.Length; j++) 
{ 
    **cmd.Parameters.Clear();** 
    cmd.Parameters.Add(new SqlParameter("@UserName", user)); 
    cmd.Parameters.Add(new SqlParameter("@In", in)); 
    cmd.Parameters.Add(new SqlParameter("@Out", out)); 
    cmd.ExecuteReader(); 
} 
conn.Close(); 

(각 반복 매개 변수를 취소해야합니다.)

0
루프에 대한 매개 변수를 여러 번 다시 추가되기 때문에 해당 오류가 발생하는 이유는

:

cmd.Parameters.Add(new SqlParameter("@In", in)); 
cmd.Parameters.Add(new SqlParameter("@Out", out)); 

을 이 작업을 수행하는 적절한 방법은 foor 루프의 마지막 행에서 Parameters 컬렉션을 지우거나 매개 변수가 이미 존재하는지 확인하고 대신 값을 설정하는 것입니다. Parameters.Add

1

또 다른 대안으로 매번 SqlCommand를 다시 만들 수 있도록 SqlCommand의 범위를 변경할 수 있습니다.

SqlConnection conn = new SqlConnection(connString); 
conn.Open(); 

for (int j = 0; j < weekDays.Length; j++) 
{ 
    SqlCommand cmd = new SqlCommand("insertINOUT", conn); 
    cmd.CommandType = CommandType.StoredProcedure; 

    cmd.Parameters.Add(new SqlParameter("@UserName", user)); 
    cmd.Parameters.Add(new SqlParameter("@In", in)); 
    cmd.Parameters.Add(new SqlParameter("@Out", out)); 
    cmd.ExecuteReader(); 
} 
conn.Close(); 

다소 낭비가 있지만 이렇게 작동하는 일부 라이브러리가 있습니다 (엔터프라이즈 라이브러리 DAAB가 떠오름).

1
using (SqlConnection conn ...) 
{ 
    SqlCommand cmd = ... 
    ... 
    // Set up the parameter list. 
    // You can use .AddWithValue here to add values that don't change in the loop. 
    cmd.Parameters.Add("@Username", SqlDbType.VarChar); 
    ... 
    for (...) 
    { 
     // Load one set of loopy values. 
     cmd.Parameters["@UserId"].Value = user; 
     ... 
    } 
} 
0
SqlConnection conn = new SqlConnection(connString); 
conn.Open(); 
SqlCommand cmd = new SqlCommand("insertINOUT", conn); 

    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.Add(new SqlParameter("@UserName", user)); 
    for (int j = 0; j < weekDays.Length; j++) 
    { 


     cmd.Parameters.Add(new SqlParameter("@In"+j, in)); 
     cmd.Parameters.Add(new SqlParameter("@Out"+j, out)); 
     cmd.ExecuteReader(); 
    } 
    conn.Close(); 
+0

은 이와 같은 코드를 사용합니다. –

관련 문제