为什么即使查询执行成功,我的ExecuteScalar <bool>也会返回false?

时间:2018-03-02 07:39:40

标签: c# sql-server winforms dapper

我是SQL Server的新手。 我目前正在研究简单的ATM模拟程序,仅用于练习,我想检查传输是否成功(顺便说一下,我正在使用Dapper ORM)。

单击转移按钮时将执行代码,这是代码的一部分:

try
{
    var balance = sqlcon.ExecuteScalar<float>("GetClientBalance", pinParam, commandType: CommandType.StoredProcedure);
    if (balance < transferAmount)
    {
        MessageBox.Show("Error: Your balance is not enough to transfer", "Transfer Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    else
    {
        var success = sqlcon.ExecuteScalar<bool>("TransferMoney", transferParam, commandType: CommandType.StoredProcedure);
        if (success)
        {
            MessageBox.Show("Transfer Success! You just transfer to " + lblDesName.Text + " for " + lblAmount.Text, "Transfer Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        else
        {
            MessageBox.Show(success.ToString());
        }
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

即使存储过程(success)成功运行,false变量始终为TransferMoney。我恐怕在这里犯了一个愚蠢的错误。

编辑:这是TransferMoney存储过程的查询:

USE [Stellar]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER PROC [dbo].[TransferMoney]
@PIN varchar(6),
@DestinationNumber varchar(20),
@Amount float
AS
BEGIN
    UPDATE Client.Cards
    SET Balance -= (@Amount + 0.5)
    WHERE PIN = @PIN

    UPDATE Client.Cards
    SET Balance += @Amount
    WHERE Client.Cards.CardNumber = @DestinationNumber

    UPDATE Client.Cards
    SET LastTransaction = CAST(GETDATE() AS DATE)
    WHERE PIN = @PIN
END

谢谢!

1 个答案:

答案 0 :(得分:0)

每个MSDN:

cmd.ExecuteScalar()
  

如果未找到结果集中第一行的第一列,则a   返回null引用。如果数据库中的值为null,则为   查询返回DBNull.Value。

在您的情况下,存储过程不会产生任何结果,并且ExecuteScalar的通用版本必须尝试将结果解析为T,在您的情况下始终为false。