Хотите изменить одну строку базы данных, а не все - PullRequest
2 голосов
/ 19 марта 2012

Я хочу обновить одну строку моей базы данных.

Это банкомат, в котором вы сначала вводите номер карточного счета (он сохраняет этот номер для использования в различных формах). Затем вы вводите сумму для депозита. Проблема в том, что он обновляет каждую строку вместо одной строки, с которой связана карта.

Вот код:

    sqlCommandDeposit.Connection.Open();
    sqlCommandDeposit.Parameters["@cardNumber"].Value = Class1.cardNumber;

    using (SqlDataReader reader = sqlCommandDeposit.ExecuteReader())
    {

        if (reader.Read())
        {
            balanceDB = decimal.Parse(reader["balance"].ToString());
        }
    }
}
finally
{
    sqlCommandDeposit.Connection.Close();
}

decimal depositAmm = Convert.ToDecimal(textDeposit.Text);
balanceDB = balanceDB + depositAmm;

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

    sqlDepositupdate.ExecuteNonQuery();
    MessageBox.Show("£" + depositAmm + " Successfully Deposited and Deposit Number Saved");
    MessageBox.Show("you have " + "£" + balanceDB + " available");
    buttonClear.Enabled = true;
    buttonExit.Enabled = true;
    buttonMainMenu.Enabled = true;


}

catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}
finally
{
    sqlDepositupdate.Connection.Close();
}

А вот мое утверждение выбора, чтобы узнать текущий баланс:

SELECT      dbo.Accounts.balance
FROM        dbo.ATMCards 
INNER JOIN  dbo.Accounts ON dbo.ATMCards.accountID = dbo.Accounts.accountID
WHERE       (dbo.ATMCards.cardNumber = @cardNumber)

А это оператор обновления:

UPDATE      dbo.Accounts
SET         balance = @balanceDB
FROM        dbo.ATMCards 
INNER JOIN  dbo.Accounts AS Accounts_1 ON dbo.ATMCards.accountID = Accounts_1.accountID 
CROSS JOIN  dbo.Accounts
WHERE       (dbo.ATMCards.cardNumber = @cardNumber)

Ответы [ 2 ]

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

Избавьтесь от перекрестного соединения в запросе на обновление. Почему у вас это?

UPDATE      dbo.Accounts
SET         balance = @balanceDB
FROM        dbo.ATMCards 
INNER JOIN  dbo.Accounts AS Accounts_1 ON dbo.ATMCards.accountID = Accounts_1.accountID 

WHERE       (dbo.ATMCards.cardNumber = @cardNumber)
1 голос
/ 19 марта 2012

Проблема с вашим оператором обновления заключается в методе объединения таблиц: CROSS JOIN объединяет все строки в одной таблице со всеми строками в другой, поэтому обновление повлияет на все строки в таблице,несмотря на ваше WHERE предложение.CROSS JOIN также известен как декартово произведение.

Как уже было предложено, вам необходимо пересмотреть свое заявление об обновлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...