2016-10-19 4 views
1

null可能なguidパラメータを下のC#コードのストアドプロシージャに渡すと、私は例外を取得しています:null可能な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プロファイラで見たときだから、私は、クエリの最後にデフォルトを参照してください

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

を取得します。それは問題を引き起こす。 私は、ストアドプロシージャのパラメータとしてSQLにNULL可能GUIDを渡すことができますどのようにストアドプロシージャ

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

のヘッダがあります。あなたのストアドプロシージャで

+0

いいえ、ただちに – Jacek

+0

「EXEC」ステートメントでパラメータをカンマで区切る必要があります。 –

答えて

4

まず第一に、あなたは代わりにnull

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

DBNull.Valueを送信する必要があり、あなたはあなたのクエリにカンマを見逃しています。

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

は、以前の回答から示唆されているように、あなたのC#の終わり

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

とストアドプロシージャの終わりにこれを置くことができ

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

2つのパラメータを渡した場合には機能しません。デフォルトのNULLはparamを渡すことからの「デフォルト」値によって上書きされます。 もちろんcustomerGuidがnullの場合は1つのパラメータでプロシージャを呼び出すことができますが、if-ingを避けることをお勧めします。 – Jacek

+1

@Jacek - 試してみましたか? MidTwoが 'exec GetCurrentUserContext @ userName = 'abc'、@customerGuid = default'として提供したプロシージャを実行すると、' @ userName'は 'abc'、' @ customerGuid'は 'NULL'です。 * default *を使用する場合は、SQL Serverにデフォルト*を指定する必要があります。ここに示すように、プロシージャのパラメータリストで '= 'の後にデフォルトを指定することでSQL *に指示する必要があります。 –

0

をゼロにするためにデフォルト値を設定します。

@ customerguid uniqueidentifier = NULL

nullがある場合、nullを渡します。価値がある場合は、@ customerguid paramで取得します。

関連する問題