在我的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();
}
这是程序运行之前和之后的视觉效果。
之前
后
工作代码
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
}
答案 0 :(得分:4)
你的两个问题是:
它将所有行更新为相同的值 这是因为更新语句中没有where子句。
它使价值翻倍。
这是因为行AccountTotal += CalculateIncome();
这样做的第一次运行使其为100,第二次循环使其为200.