LINQ-To-SQL ExecuteCommand с оператором «IN» - PullRequest
1 голос
/ 31 января 2012

У меня есть следующий код:

long[] conIds = GetIDs();
dc.ExecuteCommand("UPDATE Deliveries SET Invoiced = NULL WHERE ID IN {0}",conIds);

Я бы ожидал, что это сработает, но оператор executecommand выдает исключение, сообщающее, что

Параметр запроса не может иметь тип int64 [].

Почему это?

Ответы [ 3 ]

1 голос
/ 31 января 2012

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

В зависимости от того, где еще вы используете метод GetIDs, вы можете упростить свой код, если этот метод вернет массив строк.Затем вы можете легко использовать String.Join здесь для преобразования этого массива в связанный текст, который вы хотите.

0 голосов
/ 29 ноября 2012

У меня были проблемы с этим, и я обнаружил, что Linq очень требователен к параметрам. Мне пришлось построить SQL-оператор в виде строки и передать эту строку в .ExecuteCommand (), чтобы он работал. Там не было ошибки, просто нет результатов. Смешение.

Тем не менее, кто-нибудь видел хороший надежный метод просмотра того, что Linq передает на Sql Server?

Я использовал профилировщик SQL, но он немного расплывчатый.

0 голосов
/ 31 января 2012

Вы не можете сделать это. Параметры SQL должны быть отдельными значениями.

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

См. здесь для примера.

command.CommandText = command.CommandText.Replace(
  "@conIDs", 
  string.Join(conIDs.Select(b => b.ToString()), ",")
);

В общем, лучше сериализовать ваш SQL и использовать параметр с табличным значением для такого рода вещей. См. этот вопрос для получения инструкций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...