2012-02-01 9 views
0

whileループを使用していくつかのデータをループし、それぞれをsqlに追加しようとしています。WhileループでのSQLの挿入

 SqlCommand cmd = new SqlCommand(); 
     cmd.Connection = SqlConn; 
     while (dr.Read()) 
      { 
       cmd.CommandText = "insert into CPC_Coupons(PortalID, CreatedByUser, CouponCode, ProductID, ExpiresOn, Quantity, Title, FirstName, LastName, Company, Address1, City, Region, Zip, Country, WorkPhone, Email, Campaign, Source, Market, Notes) values(@PortalID, @CreatedByUser, @Coupon, @ProductID, @ExpiresOn, @Quantity, @Title, @FirstName, @LastName, @Company, @Address1, @City, @Region, @Zip, @Country, @WorkPhone, @Email, @Campaign, @Source, @Market, @Notes)"; 
       cmd.Parameters.Add("@PortalID", SqlDbType.NVarChar).Value = 0; 
       cmd.Parameters.Add("@Coupon", SqlDbType.NVarChar).Value = dr[0].ToString(); 
       cmd.Parameters.Add("@CreatedByUser", SqlDbType.NVarChar).Value = "3517"; 
       cmd.Parameters.Add("@ProductID", SqlDbType.NVarChar).Value = "0"; 
       cmd.Parameters.Add("@ExpiresOn", SqlDbType.NVarChar).Value = "01/01/2013"; 
       cmd.Parameters.Add("@Quantity", SqlDbType.NVarChar).Value = "100"; 
       cmd.Parameters.Add("@Title", SqlDbType.NVarChar).Value = "Mr."; 
       cmd.Parameters.Add("@FirstName", SqlDbType.NVarChar).Value = dr[3].ToString(); 
       cmd.Parameters.Add("@LastName", SqlDbType.NVarChar).Value = dr[4].ToString(); 
       cmd.Parameters.Add("@Company", SqlDbType.NVarChar).Value = dr[2].ToString(); 
       cmd.Parameters.Add("@Address1", SqlDbType.NVarChar).Value = dr[5].ToString(); 
       cmd.Parameters.Add("@City", SqlDbType.NVarChar).Value = dr[6].ToString(); 
       cmd.Parameters.Add("@Region", SqlDbType.NVarChar).Value = dr[7].ToString(); 
       cmd.Parameters.Add("@Zip", SqlDbType.NVarChar).Value = dr[8].ToString(); 
       cmd.Parameters.Add("@Country", SqlDbType.NVarChar).Value = dr[9].ToString(); 
       cmd.Parameters.Add("@WorkPhone", SqlDbType.NVarChar).Value = dr[10].ToString(); 
       cmd.Parameters.Add("@Email", SqlDbType.NVarChar).Value = dr[11].ToString(); 
       cmd.Parameters.Add("@Campaign", SqlDbType.NVarChar).Value = txtCampaign.Text; 
       cmd.Parameters.Add("@Source", SqlDbType.NVarChar).Value = dr[12].ToString(); 
       cmd.Parameters.Add("@Market", SqlDbType.NVarChar).Value = txtMarketSegment.Text; 
       cmd.Parameters.Add("@Notes", SqlDbType.NVarChar).Value = txtNotesToSales.Text; 
       cmd.CommandType = CommandType.Text; 
       SqlConn.Open(); 
       cmd.ExecuteNonQuery(); 
       SqlConn.Close(); 

      } 

しかし、それを通る第2のパスはcmd.ExecuteNonQuery();に取得し、このエラーを与える1:The variable name '@PortalID' has already been declared. Variable names must be unique within a query batch or stored procedure.

私が間違っているの何任意のアイデアをこれは私がこれまで行ってきたコードのですか?

ありがとうございます!

答えて

3

ループ内で新しいSQLCommandをインスタンス化すると、おそらく問題が解決されます。これと同じように:

while (dr.Read()) 
    { 
      SqlCommand cmd = new SqlCommand(); 
      cmd.Connection = SqlConn; 
      cmd.CommandText = "insert into CPC_Coupons(PortalID, CreatedByUser, CouponCode, ProductID, ExpiresOn, Quantity, Title, FirstName, LastName, Company, Address1, City, Region, Zip, Country, WorkPhone, Email, Campaign, Source, Market, Notes) values(@PortalID, @CreatedByUser, @Coupon, @ProductID, @ExpiresOn, @Quantity, @Title, @FirstName, @LastName, @Company, @Address1, @City, @Region, @Zip, @Country, @WorkPhone, @Email, @Campaign, @Source, @Market, @Notes)"; 
      cmd.Parameters.Add("@PortalID", SqlDbType.NVarChar).Value = 0; 
      cmd.Parameters.Add("@Coupon", SqlDbType.NVarChar).Value = dr[0].ToString(); 
      cmd.Parameters.Add("@CreatedByUser", SqlDbType.NVarChar).Value = "3517"; 
      cmd.Parameters.Add("@ProductID", SqlDbType.NVarChar).Value = "0"; 
      cmd.Parameters.Add("@ExpiresOn", SqlDbType.NVarChar).Value = "01/01/2013"; 
      cmd.Parameters.Add("@Quantity", SqlDbType.NVarChar).Value = "100"; 
      cmd.Parameters.Add("@Title", SqlDbType.NVarChar).Value = "Mr."; 
      cmd.Parameters.Add("@FirstName", SqlDbType.NVarChar).Value = dr[3].ToString(); 
      cmd.Parameters.Add("@LastName", SqlDbType.NVarChar).Value = dr[4].ToString(); 
      cmd.Parameters.Add("@Company", SqlDbType.NVarChar).Value = dr[2].ToString(); 
      cmd.Parameters.Add("@Address1", SqlDbType.NVarChar).Value = dr[5].ToString(); 
      cmd.Parameters.Add("@City", SqlDbType.NVarChar).Value = dr[6].ToString(); 
      cmd.Parameters.Add("@Region", SqlDbType.NVarChar).Value = dr[7].ToString(); 
      cmd.Parameters.Add("@Zip", SqlDbType.NVarChar).Value = dr[8].ToString(); 
      cmd.Parameters.Add("@Country", SqlDbType.NVarChar).Value = dr[9].ToString(); 
      cmd.Parameters.Add("@WorkPhone", SqlDbType.NVarChar).Value = dr[10].ToString(); 
      cmd.Parameters.Add("@Email", SqlDbType.NVarChar).Value = dr[11].ToString(); 
      cmd.Parameters.Add("@Campaign", SqlDbType.NVarChar).Value = txtCampaign.Text; 
      cmd.Parameters.Add("@Source", SqlDbType.NVarChar).Value = dr[12].ToString(); 
      cmd.Parameters.Add("@Market", SqlDbType.NVarChar).Value = txtMarketSegment.Text; 
      cmd.Parameters.Add("@Notes", SqlDbType.NVarChar).Value = txtNotesToSales.Text; 
      cmd.CommandType = CommandType.Text; 
      SqlConn.Open(); 
      cmd.ExecuteNonQuery(); 
      SqlConn.Close(); 

     } 

しかし、あなたがこれを行うにはよろしいです。すべてのデータを一度に挿入してみませんか?たとえば、Yucksの回答を参照してください。

2

cmdには範囲外のスコープがあります。したがって、設定したすべてのパラメータ(つまりパラメータ)は繰り返し実行されます。それが動作しますので、これに

変更を:

while (dr.Read()) 
{ 
    SqlCommand cmd = new SqlCommand(); 
    cmd.Connection = SqlConn; 
    // ... rest as before 
} 

あなたはDataSetを充填し、そのをループする、またはストアドプロシージャにたらを送信するようにその結果を蓄積したほうが良いと思います。大きな結果セットの場合、これは非常に非効率的になるでしょう。

+0

申し訳ありませんが、私の間違いは、おそらくあなたの答えを編集するのに十分な時間がありませんでした。再投票して再投票してください。 – Shai

3

これらのパラメータはデフォルト値で作成し、各反復中にアクセスし、新しい パラメータ 引数を設定する必要があります。

要約:繰り返しごとに追加しないでください!

EDIT:

、より具体的に、このMSDNのエントリをチェックするために:

+0

これまでのベストアンサー! – Shai

+0

@Shaiありがとう! –

1

コマンドオブジェクトを再利用しているとして、あなたがなります第2の反復で別のパラメータセットを追加する。

ループ外のパラメータを追加し、ループ内で変更される値を設定します。

また、ループの前にデータベース接続を開いてから閉じてください。

0

毎回接続を開いたり閉じたりする必要はありません。

毎回新しいSqlCommandを作成する必要はありません。

SqlCommand cmd = new SqlCommand(); 
cmd.Connection = SqlConn; 
cmd.CommandText = "insert into CPC_Coupons(PortalID, CreatedByUser, CouponCode, ProductID, ExpiresOn, Quantity, Title, FirstName, LastName, Company, Address1, City, Region, Zip, Country, WorkPhone, Email, Campaign, Source, Market, Notes) values(@PortalID, @CreatedByUser, @Coupon, @ProductID, @ExpiresOn, @Quantity, @Title, @FirstName, @LastName, @Company, @Address1, @City, @Region, @Zip, @Country, @WorkPhone, @Email, @Campaign, @Source, @Market, @Notes)"; 
cmd.CommandType = CommandType.Text; 
SqlConn.Open(); 

while (dr.Read()) 
{ 
    cmd.Parameters.Clear() 

    cmd.Parameters.Add("@PortalID", SqlDbType.NVarChar).Value = 0; 

    ''' other parameters here 

    cmd.ExecuteNonQuery(); 
} 

SqlConn.Close(); 
+0

あなたがそうするかどうかは関係ありません。接続をプーリングするのは問題ありません。 – visc

関連する問題