2011-09-13 16 views
4

私は、ユーザが異なる曜日に時刻を入力するタイムシートアプリケーションを用意しています。フォームは毎日の入出力を処理し、ストアドプロシージャにパラメータとして入力し、データベースに追加します。これを最も効率的にどのように達成するのですか? DBにアクセスすることはできません。ストアドプロシージャだけです。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のスコープを変更して毎回再作成することもできます。

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

このようなコードを使用してください。 –

関連する問題