[英]sending DATETIME parameters to SP from Method Call In C# Dapper
我在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询问格式可以接受
我的工作代码
// 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;
}
以下代码对我来说很好用。
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 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.