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