powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ to SQL: ExecuteCommand/ExecuteQuery и null в параметрах
5 сообщений из 5, страница 1 из 1
LINQ to SQL: ExecuteCommand/ExecuteQuery и null в параметрах
    #36674404
Alexey Trizno
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, как наиболее красиво и надежно (без оговорок) обойти баг, из-за которого в функции ExecuteCommand/ExecuteQuery у DataContext нельзя передать в качестве параметра null (или DBNull.Value)?

например:

Код: plaintext
1.
2.
3.
4.
int f1 = 50;
string f2 = null;

context.ExecuteCommand("insert into Table (Field1, Field2) values ({0}, {1})", f1, f2);
такой код свалится с эксепшином, хотя в документации (msdn) указано, что параметры равные null должны автоматом преобразовываться в DBNull.Value.
Хуже того, не помогает и ручная подстановка DBNull.Value для null параметров, т.к. DBNull также является недопустимым типом для этих функций.

Как быть? Откатываться в этих моментах на SqlCommand...? Не красиво как-то, рушит всю идею.
Пока пришла в голову идея только переопределить в своем DataContext функции, и для всех параметров равных null подменять в тексте команды соответствующий {x} на NULL, а сам параметр просто сделать равным нулю.

Но это же опять - танцы с бубном :( Может есть выход красивее?
...
Рейтинг: 0 / 0
LINQ to SQL: ExecuteCommand/ExecuteQuery и null в параметрах
    #36674683
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Trizno...
Код: plaintext
1.
2.
3.
4.
int f1 = 50;
string f2 = null;

context.ExecuteCommand("insert into Table (Field1, Field2) values ({0}, {1})", f1, f2);
такой код свалится с эксепшином...
Хоть бы текст эксепшна привели...
(может у вашей Table поле Field2 не разрешает null-ы на серверной стороне?).
...
Рейтинг: 0 / 0
LINQ to SQL: ExecuteCommand/ExecuteQuery и null в параметрах
    #36674693
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Trizno...
Код: plaintext
1.
2.
...
context.ExecuteCommand("insert into Table (Field1, Field2) values ({0}, {1})", f1, f2);
...
msdn - DataContext.ExecuteCommand Method
...
Remarks
...
The syntax for the command is almost the same as the syntax used to create an ADO.NET DataCommand. The only difference is in how the parameters are specified. Specifically, you specify parameters by enclosing them in braces ({…}) and enumerate them starting from 1 .
...
...
Рейтинг: 0 / 0
LINQ to SQL: ExecuteCommand/ExecuteQuery и null в параметрах
    #36675045
Alexey Trizno
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qu-quAlexey Trizno...
Код: plaintext
1.
2.
3.
4.
int f1 = 50;
string f2 = null;

context.ExecuteCommand("insert into Table (Field1, Field2) values ({0}, {1})", f1, f2);
такой код свалится с эксепшином...
Хоть бы текст эксепшна привели...
(может у вашей Table поле Field2 не разрешает null-ы на серверной стороне?).

Все разрешается. Проверьте. Эксепшин простой, NotSupportedException.
Собственно о чем и написано в баг-репорте:

http://connect.microsoft.com/VisualStudio/feedback/details/305114/linq-datacontext-executecommand-does-not-behave-according-to-the-documentation

Замечу, баг-репорт от 2007-ого года, и ничего не исправлено.
От того и вопрос возник, как обходить более красиво, чем предложено в workarounds.
...
Рейтинг: 0 / 0
LINQ to SQL: ExecuteCommand/ExecuteQuery и null в параметрах
    #36675060
Alexey Trizno
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qu-qu
...
The syntax for the command is almost the same as the syntax used to create an ADO.NET DataCommand. The only difference is in how the parameters are specified. Specifically, you specify parameters by enclosing them in braces ({…}) and enumerate them starting from 1 .
..


А это ещё одна ошибка в документации. Нумерация таки начинается с 0, о чем говорят примеры в том же msdn (да и работа методов в реальной жизни):

Код: plaintext
1.
2.
3.
var customers = db.ExecuteQuery<Customer>(@"SELECT CustomerID, CompanyName, ContactName, ContactTitle, 
   Address, City, Region, PostalCode, Country, Phone, Fax
   FROM   dbo.Customers
   WHERE  City = {0}", "London");

Такая же ошибка, как и это заявление:

If a parameter is null, it is converted to DBNull.Value.

В реальной ситуации будет выдано NotSupportedException.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ to SQL: ExecuteCommand/ExecuteQuery и null в параметрах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]