C#控制台应用程序中SQL查询的不良结果

时间:2013-07-15 23:33:40

标签: c# sql desktop-application sqlcommand

在我的C#应用​​程序中,我正在尝试读取帐户表中的数据,将数据读取为小数,对其执行计算,然后更新同一行。

现在它会在列中读取正确的数据,但在尝试更新时会出现两个问题。

它将 AccountTotal 列中的所有数据设置为相同的值。该值对于第一行是正确的,但对于其余行是不正确的。

我相信在计算要更新的数据时会出现第二个问题。当我尝试更新数据库时,它将值设置为我想要的两倍。例如:在我的 CalculateIncome 方法中,我不想在帐户总数中添加100,它会增加200。

造成这两个问题的原因是什么?

以下是该计划:

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();
            }

这是程序运行之前和之后的视觉效果。

之前 Before

After

工作代码

            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
            }

1 个答案:

答案 0 :(得分:4)

你的两个问题是:

  1. 它将所有行更新为相同的值 这是因为更新语句中没有where子句。

  2. 它使价值翻倍。
    这是因为行AccountTotal += CalculateIncome(); 这样做的第一次运行使其为100,第二次循环使其为200.