0

私の 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
            }
4

1 に答える 1

4

あなたの2つの問題は次のとおりです。

  1. すべての行を同じ値に更新しています。これは、update ステートメントに where 句がないためです。

  2. 価値を倍増させています。
    これはAccountTotal += CalculateIncome(); 、最初の実行で 100 になり、2 回目のループで 200 になるという行のためです。

于 2013-07-15T23:38:20.560 に答える