繁体   English   中英

如何使用 Dapper 将 DateTime 传递给存储过程?

[英]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

您可以使用QueryQueryAsync或任何其他查询方法,如QueryFirstQueryFirstOrDefault 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM