Конфигуриране на SqlParameter като опция по подразбиране

Оставям SqlValue на моя SqlParameter ненастроен, за да покажа, че параметърът трябва да бъде зададен на стойността по подразбиране. Това е според MSDN документация:

Използвайте null или не задавайте SqlValue да използва стойността по подразбиране за параметъра.

Когато се опитам да изпълня SqlCommand, свързано с SqlParameter, получавам SQL грешка, оплакваща се, че

параметризираната заявка "..." очаква параметъра "@p0", който не е предоставен.

Проблемът е, че генерираната заявка извиква sp_executesql без да указва, че параметърът може да има стойност по подразбиране.

Генериран SQL (проблемно):

exec sp_executesql N'INSERT [dbo].[WithDefault] ([Field]) VALUES (@p0);',N'@p0 int',@p0=default

Правилен SQL:

exec sp_executesql N'INSERT [dbo].[WithDefault] ([Field]) VALUES (@p0);',N'@p0 int=default',@p0=default

(Забележка =default след @p0 int)

Въпрос:

Как да конфигурирам SqlParameter така, че да включва =default заедно с типа данни на параметъра?

Бих си представил нещо като:

param.DbType = System.Data.DbType.Int32;
param.IsDefaultable = true; // but this property doesn't exist

person Ben Gribaudo    schedule 20.07.2015    source източник
comment
Вие публикувахте правилния начин да направите това във вашия въпрос. Използвайте null или не задавайте SqlValue да използва стойността по подразбиране за параметъра.. Не правите нито едно от тези две неща. Трябва да имате зададена по подразбиране във вашата процедура, за да работи правилно.   -  person Sean Lange    schedule 20.07.2015
comment
@SeanLange, генерираният SQL е това, което получавам, ако оставя SqlValue ненастроен. Таблицата местоназначение има дефинирана по подразбиране (CREATE TABLE WithDefault (Field INT NOT NULL DEFAULT(1));).   -  person Ben Gribaudo    schedule 20.07.2015
comment
Защо не използвате съхранена процедура за това? Това ще накара този проблем да се разреши от самосебе си и ще получите приложение с разделяне на слоевете. Виждам проблема, който имате, но това не е нещо, с което се занимавам, защото използвам съхранени процедури за всичко.   -  person Sean Lange    schedule 20.07.2015


Отговори (1)


Това, за което се сещам, би било използването на COALESCE() и предаване на NULLs. Например:

EXECUTE sp_executesql N'SELECT COALESCE(@p0, 15);', N'@p0 INT', @p0 = NULL;

Но това изглежда не отговаря на вашия климатик.

Освен това, не знам дали е възможно.

person Evaldas Buinauskas    schedule 20.07.2015