Почему мой ExecuteScalar<bool> возвращает false, даже если выполнение запроса прошло успешно?
Я новичок в SQL Server. В настоящее время я работаю над простой программой симуляции банкомата только для практики, и я хочу проверить, успешен ли перевод (и, кстати, я использую 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 ответ
По MSDN:
cmd.ExecuteScalar()
Если первый столбец первой строки в наборе результатов не найден, возвращается пустая ссылка. Если значение в базе данных равно нулю, запрос возвращает DBNull.Value.
В вашем случае процедура сохранения не приводит ни к какому результату, и универсальная версия ExecuteScalar должна пытаться проанализировать результат T, в вашем случае, который всегда ложен.