У меня есть сценарий, где строка в С# может быть 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. Это предположение было ошибкой с моей стороны, основанной на ошибочной информации. Тем не менее, этот вопрос может помочь кому-то другому, кто делает столь же ошибочное предположение.
Кроме того, принятый ответ обеспечивает хороший механизм для обработки необязательных или условных параметров.