2011-09-13 42 views
4

我有一個時間表應用程序,用戶可以在一週中的不同日子內輸入他們的時間。表單處理每天的輸入/輸出,將它們作爲參數存入存儲過程並將它們添加到數據庫中。我將如何最有效地完成這項工作?我無法訪問數據庫,只能訪問存儲過程。如何在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

你得到這個錯誤的原因是因爲for循環重新添加參數多次:

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

這樣做的正確方法是清除foor循環最後一行的Parameters集合,或者簡單地檢查參數是否已經存在並設置其值而不是做Parameters.Add

1

另一種方法是,您可以更改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

使用這樣的代碼。 –