Dapperを使用してSQLServerにNULLとして文字列を送信するにはどうすればよいですか?

c# dapper sql-server

質問

私はC#の文字列がnullなるシナリオを持っていnull 。 SQLServer上でNULLにする必要がありNULL

Dapperを使ってSQLServerに次のようなクエリを送信します。

connection.Query<MyObject>("[dbo].[sp_MyStoredProcedure]"), new
{
    StartDate: startDate
}, commandType: CommandType.StoredProcedure);

startDateは、時にはnullに等しい文字列です。

ストアドプロシージャのパラメータは次のとおりです。

@StartDate varchar(10) = NULL

NULL場合、すべてのレコードを返します。私はこの動作がSSMS経由で動作することを確認しました。

私はMarc Gravellのこの記事を読んでいます。

ヌル対DBNullの問題は、混乱の原因です。しかし、 一般的に人々がC#でnullを言うなら、SQLではnullを意図します。これは、dapperが採用しているアプローチです。

これは、 stringnullに設定されている場合、 DBNull.ValueをSQLServerに送信する必要があると私に信じていstring

しかし、これは当てはまりません。 null文字列を送信するときに、SQLServerから0レコードを取得します。これは、 DBNull.Valueではなく、空の文字列を送信していることを示しています。

また、私は直接DBNull.Valueを送信することはできません:

connection.Query<MyObject>("[dbo].[sp_MyStoredProcedure]"), new
{
    StartDate: DBNull.Value
}, commandType: CommandType.StoredProcedure);

これにより、Dapper内で例外が生成されます。

System.DBNull型のメンバStartDateをパラメータ値として使用することはできません

質問

C#でstringnull場合、Dapperを使用してSQLServerにNULLを送信するにはどうすればよいですか?


重要

文字列がnull場合、Dapperは実際にはNULL送信しNULL 。この仮定は、誤った情報に基づいて私の部分で間違いでした。それにもかかわらず、この質問は、同様に誤った仮定をする他の誰かを助ける役目を果たします。

さらに、受け入れられた答えは、オプションまたは条件パラメータを処理するための優れたメカニズムを提供します。

受け入れられた回答

StartDateを送信しないことを選択できます。

例:

dynamic parameters = new {

};

if (!string.IsNullOrWhiteSpace(startDate)) 
{
   parameters.StartDate = startDate;
}

connection.Query<MyObject>("[dbo].[sp_MyStoredProcedure]"), parameters, commandType: CommandType.StoredProcedure);

編集:

また、ストアド・プロシージャはNULLを受け入れる必要があります。ここに例があります:

CREATE PROCEDURE [ExampleProc]
   @StartDate datetime = null
AS
   Select @StartDate

エキスパート回答

はい、dapperはreference- nullを参照するたびにDBNull.Valueに置き換えることを知っています。 DBNullは私のアーチストですから、私のアプリケーションコード(ライブラリコードは違う)にもう一度表示されないのであれば、少し幸せになるでしょう。

https://stackoverflow.com/a/9632050/23354も参照してください



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ