2012-03-19 11 views
2

私のデータベースの1行を更新したいと思います。データベース行を変更したいのですが、すべてを変更したくない

カードの口座番号を最初に入力するATMマシンです(この番号を別のフォームで使用するために保存します)。次に、入金する金額を入力します。問題は、カードが関連付けられている単一の行ではなく、すべての行を更新していることです。ここで

はコードです:

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

そして、これは、更新ステートメントです:

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文の

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) 

答えて

6

を取り除きますUpdateクエリのCross Joinのなぜあなたはそれを持っていますか?

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

あなたの更新ステートメントに問題がテーブルを結合する方法であり、CROSS JOINは他のすべての行に1テーブル内のすべての行を結合し、そのため更新が内のすべての行に影響しますあなたのWHERE句にもかかわらず、テーブル。 CROSS JOINはデカルト積としても知られています。

更新ステートメントを修正する必要があることが示唆されています。

+1

本当に、私は彼が入れ子になっているように振る舞うWHERE句でCROSS JOINを使うことを意味していたと思います。問題は、INNER JOINとCROSS JOINの両方を使用していることです。 CROSS JOIN(意図的に物事を複雑にする)を使用してこれを書き換える別の方法: 'UPDATE dbo.Accounts SET balance = @balanceDB FROM dbo.ATMCards CROSS JOIN dbo.Accounts AS Accounts_1 WHERE(dbo.ATMCards.accountID = Accounts_1 .accountID)AND (dbo.ATMCards.cardNumber = @cardNumber) ' – Kash

関連する問題