메서드 호출에서 SP에 DATETIME 매개 변수 보내기 C # Dapper

asp.net-mvc c# dapper datetime stored-procedures

문제

SQL Server에서 다음 SP가 있습니다.

CREATE PROCEDURE [dbo].[SPGetData] 

       @StartDate DATETIME,
       @EndDate DATETIME

AS
            BEGIN
                  SELECT *
                  FROM SampleTable
                  WHERE CAST(SampleTable.CreateDate AS DATE) BETWEEN  CAST(@StartDate AS DATE) AND CAST(@EndDate AS DATE)                   
            END
END
GO

Management Studio에서이 SP를 테스트하면 정상적으로 작동하지만 StartDate 및 EndDate 값을 다음과 같이 전달해야합니다

여기에 이미지 설명을 입력하십시오.

DECLARE @return_value int

EXEC    @return_value = [dbo].[SPGetStationData]
        @StartDate = N'2016/10/08',
        @EndDate = N'2016/10/09'

SELECT  'Return Value' = @return_value

GO

내 백 엔드 C # 프로그램에서 매개 변수를 보내고 싶습니다.

다음과 같이 작성된 메소드

    public IEnumerable<ModelClass> GetDetails(DateTime? startdate, DateTime? enddate)
    {
        using (SqlConnection cnn = this.OpenConnection())
        {

            DynamicParameters parameters = new DynamicParameters();
            parameters.Add("@StartDate", startdate);
            parameters.Add("@EndDate", enddate);

            IList<ModelClass> SampleList = SqlMapper.Query<ModelClass>(cnn, "SPGetData", parameters, commandType: CommandType.StoredProcedure).ToList();

            cnn.Close();

            return SampleList.ToList();
        }
    }

그러나 이것을 디버깅 할 때 다음과 같은 형식으로 값을 볼 수 있습니다.

여기에 이미지 설명을 입력하십시오.

YYYY/MM/DD 형식을 묻는 저장 프로 시저에서 DD/MM/YYYY HH:MM:SS AM/PM 형식

SP가 묻는 형식으로 받아 들일 수 있도록이 작업을 수행하려면 어떻게해야합니까?

인기 답변

다음 코드는 나를 위해 잘 작동합니다.

void Main()
{
    DateTime? s=null;
    DateTime? e=DateTime.Today;
    Test(s,e);
}

void Test(DateTime? startDate, DateTime? endDate)
{
    var cs=@"data source=(local);database=test;integrated security=true";
    using (var con = new SqlConnection(cs))
    {
        con.Open();
        var t = con.Query<string>("TestIt", new { startDate, endDate},
                commandType: CommandType.StoredProcedure);

        $"List: {t.FirstOrDefault()}".Dump();
    }
}

다음은 절차입니다.

ALTER PROC TestIt
(
    @startDate datetime2,
    @endDate datetime2
)
AS
BEGIN
    SELECT 'Start: ' + CASE WHEN @startDate IS NULL THEN 'Null' ELSE CONVERT(VARCHAR(35), @startDate, 106) END +
            '\r\nEnd: ' + CASE WHEN @endDate IS NULL THEN 'Null' ELSE CONVERT(VARCHAR(35), @endDate, 106) END
END

주석의 코드와 달리 매개 변수를 전달할 때 속성 이름을 정의하지 않는다는 점에 유의하십시오.

new { startDate, endDate}

프로 시저 매개 변수 이름은 메서드에 전달할 변수와 동일합니다. 주석과 동일한 코드를 사용하려면 다음과 같이 수정할 수 있습니다.

cnn.Query<ModelClass>("SPGetData",  
   new { StartDate=startDate??null, EndDate=endDate??null}, 
    commandType:CommandType.StoredProcedure).ToList()


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow