Ошибка обновления базы данных в C # - PullRequest
2 голосов
/ 19 марта 2012
try
{
    sqlCommandWithdraw.Connection.Open();
    sqlCommandWithdraw.Parameters["@cardNumber"].Value = Class1.cardNumber;
    readdata = sqlCommandWithdraw.ExecuteReader();

    while (readdata.Read())
    {
        balanceDB = decimal.Parse(readdata["balance"].ToString());
    }

    decimal withdrawAmm = Convert.ToDecimal(textWithdraw.Text);
    balanceDB = balanceDB - withdrawAmm;
    sqlCommandWithdraw.Connection.Close();

    sqlCommandUpdate.Connection.Open();
    sqlCommandUpdate.Parameters["@cardNumber"].Value = Class1.cardNumber;
    sqlCommandUpdate.Parameters["@balanceDB"].Value = Class1.cardNumber;
    readdata = sqlCommandUpdate.ExecuteReader();
    MessageBox.Show(balanceDB +" Successfully Withdrawn");
}

Я работаю над кодом для банкомата. Я немного разбираюсь в снятии денег, он выглядит нормально, но, похоже, не меняет баланс, чтобы отразить снятие средств в базе данных

Мои команды идут так (обновление)

update dbo.Accounts
set balance = @balanceDB
from dbo.ATMCards 
INNER JOIN dbo.Accounts ON dbo.ATMCards.accountID = dbo.Accounts.accountID
where (dbo.ATMCards.cardNumber = @cardNumber)

и это моя команда для выбора данных

select dbo.Accounts.balance
from dbo.ATMCards 
INNER JOIN dbo.Accounts ON dbo.ATMCards.accountID = dbo.Accounts.accountID
where (dbo.ATMCards.cardNumber = @cardNumber)

Кажется, что работает очень хорошо, добавил окно сообщения, чтобы проверить его, спасибо за любую помощь, оцените это!

Ответы [ 3 ]

5 голосов
/ 19 марта 2012

Вы передаете номер кредитной карты параметру @balanceDB - это первая ошибка.Во-вторых, вы не используете ExecuteReader для выполнения обновлений - вместо этого используйте ExecuteNonQuery.

РЕДАКТИРОВАТЬ
Я сделаю для вас некоторые очистки:

try
{
    try
    {
        sqlCommandWithdraw.Connection.Open();
        sqlCommandWithdraw.Parameters["@cardNumber"].Value = Class1.cardNumber;

        // Make sure to dispose of the reader, which also closes the reader, which
        // is important, because you can't perform any other selects on a connection
        // with an open reader!
        using (SqlDataReader reader = sqlCommandWithdraw.ExecuteReader())
        {
            // You will only get one line - also, your code also only evaluates
            // one result, so we can do the following:
            if (reader.Read())
            {
                balanceDB = decimal.Parse(readdata["balance"].ToString());
            }
        }
    }
    finally
    {
        sqlCommandWithdraw.Connection.Close();
    }

    decimal withdrawAmm = Convert.ToDecimal(textWithdraw.Text);
    balanceDB = balanceDB - withdrawAmm;

    try
    {
        sqlCommandUpdate.Connection.Open();
        sqlCommandUpdate.Parameters["@cardNumber"].Value = Class1.cardNumber;
        sqlCommandUpdate.Parameters["@balanceDB"].Value = balanceDB;

        sqlCommandUpdate.ExecuteNonQuery();
        MessageBox.Show(balanceDB +" Successfully Withdrawn");
    }
    finally
    {
        sqlCommandUpdate.Connection.Close();
    }

}

1 голос
/ 19 марта 2012

Эта строка мне кажется подозрительной:

sqlCommandUpdate.Parameters["@balanceDB"].Value = Class1.cardNumber;

Это должно быть Class1.balance?

1 голос
/ 19 марта 2012

Вы передаете неправильное значение для параметра @balanceDB. Это должна быть сумма баланса. Но вы передаете номер карты.

 sqlCommandUpdate.Parameters["@balanceDB"].Value = Class1.cardNumber;

следует изменить на

 sqlCommandUpdate.Parameters["@balanceDB"].Value = balanceDB ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...