为什么是我的ExecuteScalar 即使查询执行成功,返回false?

问题描述 投票:0回答:1

我是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

谢谢!

c# sql-server winforms dapper
1个回答
0
投票

对于MSDN:

cmd.ExecuteScalar()

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

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

© www.soinside.com 2019 - 2024. All rights reserved.