Почему мой 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, в вашем случае, который всегда ложен.

Другие вопросы по тегам