2012-01-16 6 views
1

私はforeachコントロールを使用して文字列の配列をループし、各値を使用してデータベースに情報を挿入しようとしています。誰かが私がなぜforeach変数を使用できないusing節の中でなぜ理解するのを助けることができますか?C#使用節のForeach値?

string[] ship_ids = ShipsInScope.Split('|'); 
foreach (string ship_id in ship_ids) 
{ 
    using (SqlCommand InsertCommand = new SqlCommand("insert into PROJECT_SHIP (CR_Number, Ship_Id) VALUES (@CR_Number, @CCF_Number)", DBConn)) 
    { 
     InsertCommand.Parameters.Add("@CR_Number", SqlDbType.NVarChar, 10).Value = CRNumber; 
     InsertCommand.Parameters.Add("@Ship_Id", SqlDbType.NVarChar, 10).Value = Ship_Id; 

     InsertCommand.ExecuteNonQuery(); 
     InsertCommand.Dispose(); 
    } 
} 
+4

あなたがC#ののship_idで、そこケーシングの問題を抱えているがSHIP_ID – Marek

+5

と同じではありませんあなたは必要ありません。あなたの 'using'句の中で' using'句として 'InsertCommand.Dispose()' *を呼び出すと、コードがその終わりに達すると 'SqlCommand'に対して自動的に' Dispose'が呼び出されます。 –

+1

'using'ブロック内で' InsertCommand.Dispose(); 'を呼び出すのはなぜですか?彼らが言ったのは – Oded

答えて

6

C#では大文字と小文字が区別されます。反復変数はship_idですが、ループ内でShip_Idを使用しようとしています。理想的には

は、代わりに(とあまりにも他の変数のために)C#の命名規則を使用します。

// Declared outside the method. 
private const string InsertSql = 
    "insert into PROJECT_SHIP (CR_Number, Ship_Id) " + 
    "VALUES (@CR_Number, @CCF_Number)"; 

... 

string[] shipIds = ShipsInScope.Split('|'); 
foreach (string shipId in shipIds) 
{ 
    using (SqlCommand command = new SqlCommand(InsertSql, connection)) 
    { 
     command.Parameters.Add("@CR_Number", SqlDbType.NVarChar, 10) 
          .Value = crNumber; // Unclear what this means 
     command.Parameters.Add("@Ship_Id", SqlDbType.NVarChar, 10) 
          .Value = shipId; 
     command.ExecuteNonQuery(); 
    } 
} 

注:

  • クラスレベルの定数に一定のSQLを抽出しました。必要ではないが、物事を明確にするかもしれない。すべての変数がStackOverflowのため
  • ラップラインを強調せずにcamelCaseことに改名
  • からusing文がすでに処分を呼び出すと、あなたはおそらくDisposeに削除冗長明示的な呼び出し(
  • あなたのコード内でできるだけ多くの包装を必要としません)
+0

信じられないほどの人、それは信じられないほど速い応答時間でした。申し訳ありませんが、私はVBから来た後、これをやっているので、とてもシンプルでした!チップを使用していただきありがとうございます使用ブロック。 – deed02392

3

ship_idの代わりにShip_idを使用しています。 C#は大文字と小文字を区別します

string[] ship_ids = ShipsInScope.Split('|'); 
foreach (string ship_id in ship_ids) 
{ 
    using (SqlCommand InsertCommand = new SqlCommand("insert into PROJECT_SHIP (CR_Number, Ship_Id) VALUES (@CR_Number, @CCF_Number)", DBConn)) 
    { 
     InsertCommand.Parameters.Add("@CR_Number", SqlDbType.NVarChar, 10).Value = CRNumber; 
     InsertCommand.Parameters.Add("@Ship_Id", SqlDbType.NVarChar, 10).Value = ship_Id; 

     InsertCommand.ExecuteNonQuery(); 
    } 
} 

また、usingブロックはInsertCommandDisposeを呼び出すことになります - それはusing文が何をするかです。 Disposeにご連絡ください。

1

あなたの変数名を「SHIP_ID」大文字:

   InsertCommand.Parameters.Add("@Ship_Id", SqlDbType.NVarChar, 10).Value = Ship_Id 
2

あなたはDispose()メソッドを呼び出す必要はありませんusing文を使用している場合、それは内部的に呼び出し、パラメータの名前が異なっています、SQLステートメントでは@CCF_Number、パラメータセクションでは​​です。別のノートで

0

の代わりに、あなたは、単一の操作でコレクション全体を追加するスクリプトを作成することができたときに非常に多くの操作でのSQLServerに

をINSERTコマンドの10000を送信します。

より効果があると思います。これまでの回答やコメントに基づいて

+0

通常、これは私がやっていることですが、私はPHP + MySQLのバックグラウンドから来て、複数の挿入を集めてC#で一度にやっているのかどうか分かりません。 – deed02392

1

次のように、あなたのコードを再構築できます。

const string sql = @" 
    INSERT INTO PROJECT_SHIP (CR_Number, Ship_Id) 
    VALUES (@CR_Number, @Ship_Id)"; 

using (SqlCommand InsertCommand = new SqlCommand(sql, DBConn)) 
{ 
    var parameters = InsertCommand.Parameters; 
    var crNumberParameter = parameters.Add("@CR_Number", SqlDbType.NVarChar, 10); 
    var shipIdParameter = parameters.Add("@Ship_Id", SqlDbType.NVarChar, 10); 
    string[] ship_ids = ShipsInScope.Split('|'); 
    foreach (string ship_id in ship_ids) 
    { 
     crNumberParameter.Value = CRNumber; 
     shipIdParameter.Value = ship_id; 
     InsertCommand.ExecuteNonQuery(); 
    } 
} 
+0

これをコンパイルしようとしましたか?私はC#キーワードのような名前の変数を見つけています... – Nuffin

+0

@Tobias - 少なくともいくつかは私の答えを読む!フィードバックをお寄せいただきありがとうございます。それは私のコードを編集することを私に教えてくれます。水平スクロールバーが表示されなくなるように 'params'変数を追加しました(水平スクロールでは答えが読みにくくなりました。変数を 'parameters'に変更しました。 –

関連する問題