Dapper를 사용하여 SQLServer에 NULL로 문자열을 보내려면 어떻게해야합니까?

c# dapper sql-server

문제

C #의 문자열이 null 수있는 시나리오가 있습니다. 나는 그것이 SQLServer에서 NULL 이 될 필요가있다.

Dapper를 사용하여 다음과 같은 쿼리를 사용하여 SQLServer로 보냅니다.

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

여기서 startDatenull 과 같을 수있는 문자열입니다.

저장 프로 시저의 매개 변수는 다음과 같습니다.

@StartDate varchar(10) = NULL

그것이 NULL 이면 모든 레코드를 반환합니다. 이 동작은 SSMS를 통해 작동하는 것으로 확인되었습니다.

나는 Marc Gravell 이 게시물 을 읽었습니다.

null 대 DBNull 문제는 혼란의 끊임없는 원인입니다. 그러나 일반적으로 사람들이 C #에서 null 이라고 말하면 SQL에서 null 을 의도합니다. 이것은 dapper가 채택하는 접근 방식입니다.

이것은 stringnull 로 설정되면 DBNull.Value 를 SQLServer로 보내야한다고 생각합니다.

그러나 이것이 사실 인 것처럼 보이지는 않습니다. 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 #에서 null 이 될 수있는 string 을 가지고있을 때 Dapper를 사용하여 SQLServer에 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
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow