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



我是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);
}

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

编辑:这是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

谢谢!

per MSDN :

cmd.ExecuteScalar()

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

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

最新更新