Как правильно санировать (или параметризировать) Сжатый оператор вставки SQL - PullRequest
1 голос
/ 01 февраля 2011

РЕДАКТИРОВАТЬ Обратите внимание, что оператор не является одной вставкой.Он вставляет несколько массивов значений, используя блок foreach.

StringBuilder sbSQL = 
  new StringBuilder(
    "INSERT INTO [table] ([fk_id], [Description], [Title] ) VALUES");

foreach(var item in items) {
    sbSQL.AppendFormat("({0},'{1}','{2}'),", 
      item.fk_id, item.description, item.title)
}

myDataContext.ExecuteCommand(sbSQL.Remove(sbSQL.Length - 1, 1).ToString());
myDataContext.SubmitChanges();

Я действительно хотел бы использовать этот метод, так как он ускоряет вставку БД в 2 раза.Но я не знаю, как я должен это параматизировать.

Ответы [ 3 ]

2 голосов
/ 01 февраля 2011

Посмотрите на параметры табличных значений (впервые в SQL Server 2008) - они позволяют передавать все значения за один раз.

Единственная проблема заключается в том, что они не запекаются вLinq2SQL - так что вам нужно предоставить свой собственный метод.

См. это сообщение в блоге для примера.

1 голос
/ 01 февраля 2011

Я начал писать комментарий, но это было слишком долго.

Параметризованные запросы в LINQ-to-SQL должны хорошо работать для вас.Примерно так:

StringBuilder sbSQL = new StringBuilder(
       "INSERT INTO [table] ([fk_id], [Description], [Title] ) VALUES");

int paramNum = 0;
List<object> paramValues = new List<object>();

foreach(var item in items) 
{
    sbSQL.AppendFormat("({{{0}}},{{{1}}},{{{2}}}),", 
        paramNum, 
        paramNum + 1, 
        paramNum + 2);

    paramValues.Add(item.fk_id);
    paramValues.Add(item.description);
    paramValues.Add(item.title);

    paramNum += 3;
}

myDataContext.ExecuteCommand(
    sbSQL.Remove(sbSQL.Length - 1, 1).ToString(), 
    paramValues.ToArray());

Функция ExecuteCommand просто принимает вашу команду SQL вместе с токенами ({0}), совместимыми со стандартными функциями форматирования строк .NET, затем поворачиваетзначения, которые вы передаете в параметры, и использует их сгенерированные имена параметров вместо токенов.Вы должны написать команду и расположить параметры так, как вам нравится;он не собирается проверять или анализировать команду.

1 голос
/ 01 февраля 2011

Использовать параметризованные запросы.

public int ExecuteCommand(
    string command,
    params Object[] parameters
)

например:.

List<string> myList = new List<string>();

myList.Add("MyName");
myList.Add("MyAddress");

StringBuilder queryInsert = new StringBuilder();
queryInsert.Append("insert into Customers(name, address) values ({0},{1})");

this.myDataContext.ExecuteCommand(queryInsert.ToString(), myList.ToArray()); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...