【问题标题】:Undesired result from SQL query in C# console applicationC# 控制台应用程序中 SQL 查询的不希望的结果
【发布时间】:2013-07-15 23:33:40
【问题描述】:

在我的 C# 应用程序中,我尝试读取 Accounts 表中的数据,以小数形式读取数据,对其执行计算,然后更新同一行。

现在它读取了列中的正确数据,但是在尝试更新时出现了两件事。

它将 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
            }

【问题讨论】:

  • 显然您的第一个问题来自您没有指定WHERE 子句这一事实,正如您自己指出的那样。 @ 在您的评论中与 Savings 是分开的,您在实际查询中也这样做了吗?
  • @Jeroen Vannevel 我将包含 WHERE 子句的代码放在原始帖子中,但我仍然遇到将所有值更新为相同的问题。
  • @HighCore 我正在将此程序与 Entity Framework 在 ASP.NET MVC 应用程序中创建的数据库一起使用。我还能做些什么来让这更容易吗?

标签: c# sql desktop-application sqlcommand


【解决方案1】:

你的两个问题是:

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

  2. 它使价值翻了一番。
    这是因为AccountTotal += CalculateIncome(); 行 它的作用是在第一次运行时将其设为 100,然后围绕它的第二次循环将其设为 200。

【讨论】:

  • 是什么导致它在同一行循环两次而不是转到下一行?是否需要对 while 循环进行更改才能解决此问题?
  • 我在 where 子句中添加了,现在它只将具有“AccountName”为 Savings 的每一行的值更新为相同。是否可以使查询更具体到单行?还是我需要为数据库重新设计我的模型以便它可以工作?
猜你喜欢
  • 2020-08-11
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 2012-06-20
  • 2010-11-20
相关资源
最近更新 更多