简体   繁体   中英

How to pass a DateTime into a Stored Procedure using Dapper?

I have this Stored Procedure:

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

When I call it:

DECLARE @return_value int

EXEC    @return_value = [dbo].[IsDateInBetween]
        @someDateTime = N'2020-07-14'

SELECT  'Return Value' = @return_value

GO

I receive 1, which is expected.

But then I try to call it in C#:

var result = DbConnection.ExecuteScalar<int>("dbo.IsDateInBetween", new { new DateTime(2020, 7, 14) }, commandType: CommandType.StoredProcedure);

And I get 0.

I tried to change the passed object to DynamicParameters, like that:

var parameters = new DynamicParameters();
parameters.Add("someDateTime", faultDateTime, DbType.DateTime);

But it didn't help.

I tried both DbType.DateTime and DbType.DateTime2, as well as parameter name starting with @ and without it. Both columns from the stored procedure are of type datetime.

What am I doing wrong?

You just need to give your parameter the correct name:

var result = DbConnection.ExecuteScalar<int>(
    "IsDateInBetween", 
    new { someDateTime = new DateTime(2020, 7, 14) }, 
    commandType: CommandType.StoredProcedure);

Also, Unless you're executing a schema that is different than the login's default schema, you don't need to mention it, the procedure name is enough.

And another thing - the problem is probably in the stored procedure itself. You're not suppose to use Return - you're suppose to either use an output parameter or a simple select.

Try this procedure instead:

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

You could use Query or QueryAsync Or any of the other query methods like QueryFirst or QueryFirstOrDefault . ExecuteScalar is an ADO.net method and also exists in dapper so it might not be clear witch one you are using.

For dapper try

DbConnection.QueryFirst<int>("EXEC dbo.IsDateInBetween @someDate", new { someDate = new DateTime(2020, 7, 14) });

Why use Query() instead of Execute() ? You expect a return value.

Also you should specify the name of the parameter in your query and in your anonymous type.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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