#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()