私の C# アプリケーションでは、Accountsテーブル内のデータを読み取り、データを 10 進数として読み取り、その上で計算を実行してから、同じ行を更新しようとしています。
現在、列の正しいデータを読み取りますが、更新しようとすると 2 つの問題が発生します。
AccountTotal列のすべてのデータを同じ値に設定します。この値は最初の行では正しいですが、残りの行では正しくありません。
2 つ目の問題は、更新するデータを計算する際に発生すると思います。DB を更新しようとすると、希望する値の 2 倍の値が設定されます。例: 私のCalculateIncomeメソッドでは、アカウントの合計に 100 を追加したくありません。200 を追加します。
この 2 つの問題の原因は何ですか?
プログラムは次のとおりです。
class Program
{
static void Main(string[] args)
{
//Need to change when deploying on real database.
const string DB_NAME = "Bank.sdf";
const string DB_PATH = @"C:\Users\Lucas\eBankRepository\eBank\App_Data\" + DB_NAME; // Use ".\" for CWD or a specific path
const string CONNECTION_STRING = "Data Source=" + DB_PATH;
decimal AccountTotal;
var conn = new SqlCeConnection(CONNECTION_STRING);
SqlCeDataReader reader = null;
try
{
conn.Open();
//Basic Query of all accounts
SqlCeCommand Query = new SqlCeCommand("SELECT * FROM Accounts", conn);
reader = Query.ExecuteReader();
while (reader.Read())
{
AccountTotal = reader.GetDecimal(2); //Column in DB for Account Total
AccountTotal += CalculateIncome();
//Update Total
SqlCeCommand UpdateTotal = new SqlCeCommand("UPDATE Accounts SET AccountTotal = @UpdatedTotal", conn); // Error when using WHERE Clause "WHERE AccountName= @ Savings"
UpdateTotal.Parameters.AddWithValue("@UpdatedTotal", AccountTotal);
UpdateTotal.Connection = conn;
UpdateTotal.ExecuteNonQuery();
}
}
finally
{
if (reader != null)
{
reader.Close();
}
if (conn != null)
{
conn.Close();
}
}
}
public static decimal CalculateIncome()
{
return 100;
}
}
編集:
これは、コマンドに WHERE 句を含めた以前のコードです。このコードでは、口座名が「Savings」の行のみを更新しますが、各行の値はAccountTotalと同じになるように設定します。
while (reader.Read())
{
AccountTotal = reader.GetDecimal(2); //Column in DB for Account Total
AccountTotal += CalculateIncome();
//Update Total
SqlCeCommand UpdateTotal = new SqlCeCommand("UPDATE Accounts SET AccountTotal = @UpdatedTotal WHERE AccountName= @Savings", conn); // Error when using WHERE Clause "WHERE AccountName= @ avings"
UpdateTotal.Parameters.AddWithValue("@UpdatedTotal", AccountTotal);
UpdateTotal.Parameters.AddWithValue("@Savings", "Savings");
UpdateTotal.Connection = conn;
UpdateTotal.ExecuteNonQuery();
}
これは、プログラムの実行前と実行後のビジュアルでもあります。
前
後
作業コード
while (reader.Read())
{
AccountTotal = reader.GetDecimal(2); //Column in DB for Account Total
//Console.WriteLine(AccountTotal);
AccountTotal += CalculateIncome();
//Console.WriteLine(AccountTotal);
//Update Total
SqlCeCommand UpdateTotal = new SqlCeCommand("UPDATE Accounts SET AccountTotal = @UpdatedTotal WHERE AccountName = @Savings AND AccountID = @ID", conn);
UpdateTotal.Parameters.AddWithValue("@UpdatedTotal", AccountTotal);
UpdateTotal.Parameters.AddWithValue("@Savings", "Savings");
UpdateTotal.Parameters.AddWithValue("@ID", reader.GetInt32(0));
UpdateTotal.Connection = conn;
UpdateTotal.ExecuteNonQuery();
AccountTotal = 0; //Reset
}