SQL ExecuteNonQuery выдает неверный синтаксис рядом с «0».

У меня есть следующий код, который я использую для вставки ряда строк в базу данных:

   _conn.Open();
   SqlCommand command = new SqlCommand(_insert[0].ToString(), _conn);
   command.Parameters.AddRange((_insert[1] as List<SqlParameter>).ToArray());
   Int32 rowsAffected = command.ExecuteNonQuery();
   _conn.Close();

Команда (_insert[1].ToString()):

"INSERT INTO Candidate (id, name) VALUES ({0},{1}),({2},{3}),({4},{5}),({6},{7}),
({8},{9}),({10},{11}),({12},{13}),({14},{15}),({16},{17}),({18},{19}),({20},{21}),
({22},{23}),({24},{25}),({26},{27}),({28},{29}),({30},{31}),({32},{33}),({34},{35}),
({36},{37}),({38},{39})"

и параметры команды такие (из отладки VS):

[0] - ParameterName = "0", SqlDbType = BigInt, Value = 21400
[1] - ParameterName = "1", SqlDbType = NVarChar, Value = "Dan Smith"
[2] - ParameterName = "2", SqlDbType = BigInt, Value = 21401
[3] - ParameterName = "3", SqlDbType = NVarChar, Value = "Doug Smith"
[4] - ParameterName = "4", SqlDbType = BigInt, Value = 21402
[5] - ParameterName = "5", SqlDbType = NVarChar, Value = "Danielle Smith"

Я получаю сообщение об ошибке: «Неверный синтаксис рядом с '0'». Может ли кто-нибудь сказать мне, что является причиной этого?

Если это имеет значение, здесь я создаю массив параметров (отдельная функция, которая перебирает JSON, возвращаемый из API):

    foreach (KeyValuePair<string, object> _attribute in _field)
    {
        // '_score' is an attribute included with each entity when doing a search
        // indicating the matching score of the query, we don't want this in the database
        if (_attribute.Key.ToString() != "_score")
        {
            _insertQuery.AppendFormat("{{{0}}},", _paramNumber);
            _paramValues.Add(new SqlParameter(_paramNumber.ToString(), _attribute.Value));
            _paramNumber++;
        }
    }
    return new object[] {_insertQuery.ToString(), _paramValues };

Я делаю это, когда извлекаю различные объекты из API, а затем вставляю их в локальную базу данных. Я не могу создать класс для каждого из этих объектов (требования сделать это общим).

ОБНОВЛЕНИЕ:

Я обновил код, чтобы добавить к _paramNumber знак «@», поэтому каждый параметр теперь равен @0, @1 и т. д., и теперь я получаю эту ошибку:

"Incorrect syntax near '@0'."

Оператор вставки выглядит следующим образом:

"INSERT INTO Candidate (id, name) VALUES ({@0},{@1}),({@2},{@3}),({@4},{@5}),({@6},{@7}),
({@8},{@9}),({@10},{@11}),({@12},{@13}),({@14},{@15}),({@16},{@17}),({@18},{@19}),
({@20},{@21}),({@22},{@23}),({@24},{@25}),({@26},{@27}),({@28},{@29}),({@30},{@31}),
({@32},{@33}),({@34},{@35}),({@36},{@37}),({@38},{@39})"

а параметры такие:

[0] - ParameterName = "@0", SqlDbType = BigInt, Value = 21400
[1] - ParameterName = "@1", SqlDbType = NVarChar, Value = "Dan Smith"
[2] - ParameterName = "@2", SqlDbType = BigInt, Value = 21401
[3] - ParameterName = "@3", SqlDbType = NVarChar, Value = "Doug Smith"
[4] - ParameterName = "@4", SqlDbType = BigInt, Value = 21402
[5] - ParameterName = "@5", SqlDbType = NVarChar, Value = "Danielle Smith"

person BrianKE    schedule 28.04.2014    source источник
comment
Похоже, у вас есть параметры в форме {0}, а не @0. Я не думаю, что когда-либо видел параметры SQL в таком виде...   -  person Jon Skeet    schedule 28.04.2014
comment
Я обновил свой код (см. редактирование), но все еще получаю аналогичную ошибку. Есть ли способ зафиксировать информацию, переданную в SQL с помощью команды ExecuteNonQuery, чтобы я мог отлаживать ее в SQL?   -  person BrianKE    schedule 28.04.2014
comment
У вас все еще есть фигурные скобки вокруг ваших параметров - почему? {@0} не то же самое, что @0.   -  person Jon Skeet    schedule 28.04.2014
comment
Спасибо, это была проблема. Я никогда раньше не использовал объект SqlParameter, а {{{0}}} был взят из примера, которому я пытался следовать.   -  person BrianKE    schedule 28.04.2014


Ответы (2)


Если вы используете прямые параметры в своем запросе и не форматируете саму строку запроса с помощью String.Format, вы должны использовать в своем запросе только параметры с форматом @parameterName, например.

"INSERT INTO Candidate (id, name) VALUES (@0,@1),(@2,@3),(@4,@5),(@6,@7),
(@8,@9),(@10,@11),(@12,@13),(@14,@15),(@16,@17),(@18,@19),
(@20,@21),(@22,@23),(@24,@25),(@26,@27),(@28,@29),(@30,@31),
(@32,@33),(@34,@35),(@36,@37),(@38,@39)"
person Janne Matikainen    schedule 28.04.2014

Из того, что я делаю из вашего вопроса, вы пытаетесь использовать {number} в качестве имен параметров. Что я лично не считаю правильным.

Вы должны использовать @yourParameterName

person Amit Joki    schedule 28.04.2014