[英]How to pass a DateTime into a Stored Procedure using Dapper?
我有这个存储过程:
CREATE PROCEDURE [dbo].[IsDateInBetween]
@someDateTime datetime
AS
BEGIN
DECLARE @Exists INT
IF EXISTS(SELECT Id FROM [dbo].[SomeTable]
WHERE StartDate < @someDateTime AND EndDate > @someDateTime)
BEGIN
SET @Exists = 1
END
ELSE
BEGIN
SET @Exists = 0
END
RETURN @Exists
END
当我调用它时:
DECLARE @return_value int
EXEC @return_value = [dbo].[IsDateInBetween]
@someDateTime = N'2020-07-14'
SELECT 'Return Value' = @return_value
GO
我收到 1,这是预期的。
但后来我尝试在 C# 中调用它:
var result = DbConnection.ExecuteScalar<int>("dbo.IsDateInBetween", new { new DateTime(2020, 7, 14) }, commandType: CommandType.StoredProcedure);
我得到0。
我尝试将传递的 object 更改为 DynamicParameters,如下所示:
var parameters = new DynamicParameters();
parameters.Add("someDateTime", faultDateTime, DbType.DateTime);
但这没有帮助。
我尝试了 DbType.DateTime 和 DbType.DateTime2,以及以 @ 开头且没有它的参数名称。 存储过程中的两列都是日期时间类型。
我究竟做错了什么?
您只需要为您的参数提供正确的名称:
var result = DbConnection.ExecuteScalar<int>(
"IsDateInBetween",
new { someDateTime = new DateTime(2020, 7, 14) },
commandType: CommandType.StoredProcedure);
此外,除非您正在执行与登录的默认架构不同的架构,否则您无需提及它,过程名称就足够了。
还有一件事——问题可能出在存储过程本身。 您不应该使用Return
- 您应该使用 output 参数或简单的 select。
请尝试此过程:
CREATE OR ALTER PROCEDURE [dbo].[IsDateInBetween]
@someDateTime datetime
AS
BEGIN
SELECT CASE WHEN EXISTS(
SELECT Id
FROM [dbo].[SomeTable]
WHERE StartDate < @someDateTime
AND EndDate > @someDateTime
)
THEN 1
ELSE 0
END
END
您可以使用Query
或QueryAsync
或任何其他查询方法,如QueryFirst
或QueryFirstOrDefault
。 ExecuteScalar
是一种ADO.net方法,也存在于 dapper 中,因此您使用的可能不清楚。
对于精致的尝试
DbConnection.QueryFirst<int>("EXEC dbo.IsDateInBetween @someDate", new { someDate = new DateTime(2020, 7, 14) });
为什么使用Query()
而不是Execute()
? 您期望返回值。
此外,您应该在查询和匿名类型中指定参数的名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.