отправка параметров DATETIME в SP из вызова метода в C # Dapper

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

#c# #asp.net-mvc #datetime #хранимые процедуры #dapper

Вопрос:

У меня есть следующий SP в SQL Server

 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
  

Когда я тестирую этот SP из Management Studio, он работает нормально, но я должен передать значения 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

Комментарии:

1. Вы получаете какую-либо ошибку? Обычно это решается автоматически, и sql server получает дату и время в правильном формате.

2. Нет, я даже не получаю никаких ошибок, просто говорю, что результаты равны нулю

3. SP принимает DATETIME, что означает, что вы можете передавать строку (или varchar) в любом формате, который понимает SQL Server, вы не ограничены гггг / мм / дд. Используйте .Add перегрузку, которая позволяет указать тип данных DateTime, чтобы избежать этих проблем / двусмысленностей.

4. Нет, вы не получаете другой «формат», это отладчик VS, который отображает ваши даты в соответствии с вашими международными настройками. Переменная DateTime не передается как строка, хотя использование точного типа параметра помогло бы. Вы не сообщили нам, возвращает ли sp правильные данные, несмотря на то, что datetime находится в неправильном «формате».

5. Нет, не с моей головы. Это просто, просто откройте приложение, укажите его на сервер базы данных и начните профилирование. Вы получите всю активность в профилировщике, вы можете сузить ее, добавив фильтры, а также расширить то, что регистрируется. Попробуйте, это довольно просто.

Ответ №1:

Мой рабочий код,

 // Store procedure
CREATE PROCEDURE [dbo].[SPGetData] 
       @StartDate nvarchar(50) = null, -- change 
       @EndDate nvarchar(50) = null -- change 
AS
    BEGIN
       -- change  in where condition
       SELECT *
       FROM SampleTable
       WHERE 
        DATEPART(yyyy,cast(SampleTable.CreateDate as date)) BETWEEN DATEPART(yyyy,cast(@StartDate as date)) and DATEPART(yyyy,cast(@EndDate as date))
    END
END
GO

// Visual Studio Code for dapper
public IEnumerable<ModelClass> GetDetails(DateTime? startdate, DateTime? enddate)
    {

var _para = new DynamicParameters();
    _para.Add("@StartDate", startdate);
    _para.Add("@EndDate", enddate);
    var _list = _con.Query<ModelClass>("SPGetData", _para, commandType: CommandType.StoredProcedure); // _con is SqlConnection _con = new SqlConnection("your connection string")
            return _list;
    }
  

Ответ №2:

Следующий код отлично работает для меня.

 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  
            'rnEnd: '   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()