2011-12-21 10 views
0

通常、私はSQLパラメータを使用して、ハッカーによる注入SQLを回避します。しかし、ループ内でSQLパラメータを使用するにはどうすればいいですか?ループ内のSQLパラメータを使用

try 
{ 
    using (var connectionWrapper = new Connexion()) 
    { 

     var connectedConnection = connectionWrapper.GetConnected(); 
     string sSql = ""; 
     foreach (var oItem in LeListVoit_End) 
     { 
      //insert into Lettrvoit 
      if (sSql != "") sSql += " UNION ALL "; 
      sSql += "SELECT '" + oItem.IdLettre + "', '" + oItem.Date_Cloture + "', '" + oItem.CodeDest + "', '" + oItem.ModalMode + "', '" + oItem.LibPort + "', '" + oItem.LibExpr + "', '" + oItem.LibUnite + "', '" + oItem.EnlvUnite + "', '" + oItem.NbrColis + "', '" + oItem.Poids.ToString().Replace(',', '.') + "', '" + oItem.LeCR.ToString().Replace(',', '.') + "', '" + oItem.LeVD.ToString().Replace(',', '.') + "', '" + oItem.CodeClient + "', '" 
           + oItem.RsNom_Exp + "', '" + oItem.Addr_Exp + "', '" + oItem.CP_Exp + "', '" + oItem.Ville_Exp + "', '" + oItem.Tel_Exp + "', '" + oItem.Fax_Exp + "', '" 
           + oItem.RsNom_Dest + "', '" + oItem.Addr_Dest + "', '" + oItem.CP_Dest + "', '" + oItem.CP_Dest + "', '" + oItem.Tel_Dest + "', '" + oItem.Fax_Dest + "', '" + oItem.InseeDest + "', '" 
           + Is_Print + "', '" + CHAUFFEUR + "'"; 
     } 
     string sqlComm_Insert = "INSERT INTO LETTRE_VOIT_FINAL ([NOID], [DATE_CLOTURE], [CODE_DEST] ,[MODAL_MODE], [LIBELLE_PORT] ,[LIBELLE_EXPR], [LIBELLE_UNITE],ENLEV_UNITE, [NBR_COLIS], [POID], [ENLEV_CREMB], [ENLEV_DECL], CODE_CLIENT, [RS_NOM_EXP] ,[ADDR_EXP] ,[CP_EXP] ,[VILLE_EXP] ,[TEL_EXP] ,[FAX_EXP],[RS_NOM_DEST] ,[ADDR_DEST] ,[CP_DEST] ,[VILLE_DEST] ,[TEL_DEST] ,[FAX_DEST],INSEE_DEST, IS_PRINT, CHAUFFEUR) " + sSql; 
     SqlCommand comm_Insert = new SqlCommand(sqlComm_Insert, connectionWrapper.conn); 
     comm_Insert.ExecuteScalar(); 
    } 
} 
catch (Exception excThrown) 
{ 
    throw new Exception("Err", excThrown); 
} 

上記のSQLパラメータは私のループの外にあります。

+0

[SQLDataAdapter](http://msdn.microsoft.com/en-us/library/system.data.sqlclient)を使用して考えていますか?代わりに.sqldataadapter.aspx)? –

答えて

0

ステートメント文字列を作成する代わりにストアドプロシージャを記述できますか?どちらの方法でも、リスト内の項目ごとにコマンドを実行し、すべてのコマンドを1回のトランザクションで実行します。構築し、

がParametersコレクションを使用して、コマンドにパラメータを追加します(フェイル上またはrollback)トランザクションをコミット各項目のコマンドに挿入実行

    • 開始トランザクション
    • ループ項目:

      command.Parameters.Add({several overloads}) 
      
  • 2

    SQLパラメータ名は一意でなければならないので、forすなわち代わりにpとSQLパラメータ名に各反復でループ変数のインデックスを追加し、:

    for(int i=0; i< LeListVoit_End.Length; i++) 
    { 
        string sql = string.Format("select foo from bar where baz = @FOO{0}" i); 
        command.Parameters.Add(string.Format("@FOO{0}",i), SqlDbType.VarChar, 80).Value = "someValue"; 
    } 
    
    0

    あなたはループの外で接続、コマンドとパラメータを作成してからちょうどパラメータ値を設定し、実行することができますループ内のコマンド:

    comm_Insert.Parameters[""].Value = ""; 
    comm_Insert.ExecuteScalar(); 
    
    関連する問題