我是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
谢谢!
答案 0 :(得分:0)
每个MSDN:
cmd.ExecuteScalar()
如果未找到结果集中第一行的第一列,则a 返回null引用。如果数据库中的值为null,则为 查询返回DBNull.Value。
在您的情况下,存储过程不会产生任何结果,并且ExecuteScalar的通用版本必须尝试将结果解析为T,在您的情况下始终为false。