Используйте параметры SQL в цикле - PullRequest
0 голосов
/ 21 декабря 2011

Обычно я использую параметры 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 находятся вне моего цикла.

Ответы [ 3 ]

2 голосов
/ 21 декабря 2011

Поскольку имена параметров SQL должны быть уникальными, вы можете вместо этого использовать цикл for и добавлять индекс переменной цикла в каждой итерации к имени параметра 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 голосов
/ 21 декабря 2011

Вы можете создать соединение, команду и параметры вне цикла, а затем просто установить значения параметров и выполнить команду в цикле:

 comm_Insert.Parameters[""].Value = "";
 comm_Insert.ExecuteScalar();
0 голосов
/ 21 декабря 2011

Можете ли вы написать хранимую процедуру вместо построения строки оператора?В любом случае я выполняю команду для каждого элемента в списке и выполняю все команды в одной транзакции.

  • запуск транзакции
  • элементов цикла, создание и выполнение вставки в команду для каждойitem
  • фиксация транзакции (или откат при сбое)

Добавить параметр в команду, используя коллекцию Parameters:

command.Parameters.Add({several overloads})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...