Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ to SQL: ExecuteCommand/ExecuteQuery и null в параметрах / 5 сообщений из 5, страница 1 из 1
08.06.2010, 00:48
    #36674404
Alexey Trizno
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ to SQL: ExecuteCommand/ExecuteQuery и null в параметрах
Подскажите, как наиболее красиво и надежно (без оговорок) обойти баг, из-за которого в функции 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
08.06.2010, 09:44
    #36674683
qu-qu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ to SQL: ExecuteCommand/ExecuteQuery и null в параметрах
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
08.06.2010, 09:51
    #36674693
qu-qu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ to SQL: ExecuteCommand/ExecuteQuery и null в параметрах
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
08.06.2010, 12:02
    #36675045
Alexey Trizno
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ to SQL: ExecuteCommand/ExecuteQuery и null в параметрах
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
08.06.2010, 12:07
    #36675060
Alexey Trizno
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ to SQL: ExecuteCommand/ExecuteQuery и null в параметрах
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
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ to SQL: ExecuteCommand/ExecuteQuery и null в параметрах / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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