Как я могу отправить строку как NULL на SQLServer с помощью Dapper?

У меня есть сценарий, где строка в С# может быть null. Мне нужно, чтобы он был null на SQLServer.

Я отправляю его на SQLServer с помощью Dapper с запросом вроде:

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

Где startDate - это строка, которая иногда может быть равна null.

Параметр хранимой процедуры

@StartDate varchar(10) = NULL

Когда он null, он возвращает все записи. Я подтвердил, что это поведение работает через SSMS.

Я прочитал этот пост от Марка Гравелла, который гласит:

Проблема null и DBNull является постоянной причиной путаницы; однако, как правило, если люди говорят null в С#, они намереваются null в SQL. Это подход, который использует dapper.

Это заставляет меня думать, что когда string установлен в null, он должен отправить DBNull.Value в SQLServer.

Однако, похоже, это не так. Я возвращаю 0 записей из SQLServer при отправке строки null. Это кажется показателем отправки пустой строки, а не DBNull.Value.

Кроме того, я не могу отправить DBNull.Value напрямую:

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

Это создает исключение в Dapper:

Элемент StartDate типа System.DBNull не может использоваться как значение параметра

Вопрос

Как я могу отправить null в SQLServer, используя Dapper, когда у меня есть string в С#, который может быть null?


Внимание!

Dapper действительно отправляет null, когда строка null. Это предположение было ошибкой с моей стороны, основанной на ошибочной информации. Тем не менее, этот вопрос может помочь кому-то другому, кто делает столь же ошибочное предположение.

Кроме того, принятый ответ обеспечивает хороший механизм для обработки необязательных или условных параметров.

Ответ 1

Вы можете не отправлять StartDate.

Пример:

dynamic parameters = new {

};

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

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

Edit:

Кроме того, ваша хранимая процедура должна принимать значения NULL. Вот пример:

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

Ответ 2

Да, dapper знает, чтобы заменить reference- null на DBNull.Value всякий раз, когда он его видит. Потому что DBNull - это моя архимедия, и если я никогда больше не увижу ее в коде приложения (код библиотеки отличается), я умру немного счастливее.

Смотрите также: fooobar.com/info/79261/...