2016-10-19 2 views
1

Когда я передаю параметр nullable guid для хранимой процедуры в моем коде C# ниже. Я получаю исключение:Передача nullable guid в хранимую процедуру

System.Data.SqlClient.SqlException (0x80131904): Неправильный синтаксис около '@customerGuid'.

var userNameSqlParam = new SqlParameter 
{ 
    ParameterName = "userName", 
    Value = userName, 
    DbType = DbType.String 
}; 

var customerGuidSqlParam = new SqlParameter 
{ 
    ParameterName = "customerGuid", 
    Value = customerGuid, 
    DbType = DbType.Guid 
}; 

var rows = _dbContext.Database 
    .SqlQuery<CurrentUserContextWithoutCustomer> 
     ("EXEC [dbo].[GetCurrentUserContext] @userName @customerGuid", 
     userNameSqlParam, customerGuidSqlParam) 
    .ToList(); 

Так что, когда я смотрю на SQL Profiler, что было названо я

exec sp_executesql 
N'EXEC [dbo].[GetCurrentUserContext] @userName @customerGuid', 
N'@userName nvarchar(4),@customerGuid uniqueidentifier', 
@userName=N'gir1',@customerGuid=default 

Я вижу по умолчанию на конце запроса. Это порождает проблему. Существует заголовок хранимой процедуры

ALTER PROCEDURE [dbo].[GetCurrentUserContext] 
    @userName nvarchar(100), 
    @customerGuid uniqueidentifier 
AS 

Как я могу передать NULLABLE GUID в SQL в качестве параметра хранимой процедуры.

+0

Нет, всего лишь мгновение – Jacek

+0

Вы должны запятнать отдельные параметры в инструкции 'EXEC'. –

ответ

4

Прежде всего, вы должны послать DBNull.Value вместо null

var customerGuidSqlParam = new SqlParameter 
{ 
    ParameterName = "customerGuid", 
    Value = (object)customerGuid ?? (object)DBNull.Value, 
    DbType = DbType.Guid 
}; 

и вы пропустили запятую в вашем запросе.

var rows = _dbContext.Database 
    .SqlQuery<CurrentUserContextWithoutCustomer> 
     ("EXEC [dbo].[GetCurrentUserContext] @userName, @customerGuid", 
     userNameSqlParam, customerGuidSqlParam) 
    .ToList(); 
1

В хранимой процедуре установить значение по умолчанию в нуль

ALTER PROCEDURE [dbo].[GetCurrentUserContext] 
    @userName nvarchar(100), 
    @customerGuid uniqueidentifier = NULL 
AS 
+1

Это не работает в случае, если я передаю два параметра, значение по умолчанию NULL будет переопределено значением «по умолчанию» из прогона param. Конечно, я могу вызывать процедуру с одним параметром, когда customerGuid имеет значение null, но я предпочитаю избегать if-ing. – Jacek

+1

@ Яцек - ты пробовал? Если вы выполняете процедуру, то MidTwo предоставляет в качестве процедуры 'exec GetCurrentUserContext @ userName = 'abc', @customerGuid = default', а внутри процедуры' @ userName' '' abc' и '@ customerGuid'' 'NULL'. Если вы хотите использовать * по умолчанию *, вы должны сообщить SQL Server, что значение по умолчанию * должно быть *, и вы делаете это, указав значение по умолчанию после '=' в списке параметров процедуры, как показано здесь. –

0

Вы можете поместить это в C конца #

Value = customerGuid == null ? (object)DBNull.Value : customerGuid.Value 

и в хранящемся конце процедуры, как предложено от ранее ответа:

@customerGuid uniqueidentifier = NULL

Когда есть нуль, он пройдет null. если есть значение, вы получите его в параметре @customerGuid.

Смежные вопросы