【问题标题】:Sum values of 2 columns OLEDB ACCESS2列OLEDB ACCESS的总和值
【发布时间】:2020-05-01 19:35:45
【问题描述】:

各位,我正在做一个简单的捐赠项目。我需要将捐赠表的价值添加到收银员的总价值中。我做了一些测试,但不能。按照下面的代码。

    private void bntAddDonation_Click(object sender, EventArgs e)
    {
        connection = new OleDbConnection(db);

        try
        {
            connection.Open();

            query = "UPDATE CX SET CX.Valor_Caixa = (SELECT SUM (DONATION.Valor_Contribuicao) FROM Contribuicao DONATION WHERE DONATION.Id_Caixa = CX.Id_Caixa) FROM Caixa CX";

            cmd = new OleDbCommand(query, connection);

            cmd.ExecuteNonQuery();

            connection.Close();

            MessageBox.Show("Contribuição adicionada com sucesso!");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }

捕捉错误

查询表达式 '(SELECT SUM (DONATION.Valor_Contribuicao) FROM Contribuicao DONATION WHERE 中的语法错误(缺少运算符) DONATION.Id_Caixa = CX.Id_Caixa) 来自 CAIXA CX

【问题讨论】:

  • 如果您在普通 SQL 编辑器中运行 DML,它是否工作?添加一些 try-catch 块并查看发生了什么(如果有)异常。与您的问题不严格相关,但为了将来证明这一点,您希望实现 iDisposable 并将您的对象实例化包装在 using 语句中。此外,这正在取得进展,但除非这是一个疯狂的简单项目,否则请考虑在另一个项目中将您的数据层与您的 UI 分开。
  • 我需要将捐赠的金额添加到收银台。我上传了出现的异常。
  • 我在 SQL 中做了一个测试,它可以工作,但是在 OLEDB 中通过了一个异常
  • 您可能知道这一点,但您的问题在于 DML...这是什么 DBMS,Oracle?
  • @Hambone:看起来它正在尝试使用引用 CX 别名的非常时髦的嵌套查询,使用来自所有子 Contribuicao 记录的 Valor_Contribuicao 总和来更新每个 Caixa 记录.听起来对吗? DROPE:我要重申,存储一个总和很少合适,因为它可能会过时。关系数据库的好处之一是您可以即时计算衍生值,因此它们永远不会过时。

标签: c# sql visual-studio ms-access oledb


【解决方案1】:

除非我完全错过了您的表结构,否则您的更新语句不起作用。这是运行您在代码中列出的查询以及 .NET 抛出的相同错误的屏幕截图:

所以这是我的想法...创建一个查询,在目标表中提供您想要的总数。从字面上看你所拥有的,它看起来像这样:

SELECT CAIXA.Id_Caixa, Sum(Contribuicao.Valor_Contribuicao) AS SumOfValor_Contribuicao
FROM CAIXA INNER JOIN Contribuicao ON CAIXA.Id_Caixa = Contribuicao.Id_Caixa
GROUP BY CAIXA.Id_Caixa;

我不确定为什么甚至需要CAIXA,因为连接条件位于Id_Caixa 字段上,但为了保持连续性,我将其保留在那里。

我最初的想法是对这个查询进行更新查询(有点像视图),但它引发了一些奇怪的错误,我不得不将上面的查询转换为生成表查询:

SELECT CAIXA.Id_Caixa, Sum(Contribuicao.Valor_Contribuicao) AS SumOfValor_Contribuicao INTO Totals
FROM CAIXA INNER JOIN Contribuicao ON CAIXA.Id_Caixa = Contribuicao.Id_Caixa
GROUP BY CAIXA.Id_Caixa;

所以结果表被命名为Totals

从这里开始,一个简单的更新查询应该更新这些总数。请注意语法与您上面列出的非常不同...

UPDATE CAIXA
INNER JOIN Totals ON CAIXA.Id_Caixa = Totals.Id_Caixa
SET CAIXA.Valor_Caixa = [Totals].[SumOfValor_Contribuicao];

这对我有用,预先假设@madreflection 是正确的,我猜是这样。

您确定这是 MS Access 吗?这些都不像 Access。 Access 是否链接到其他一些后端数据库(因为如果是,这一切都会容易得多)。

【讨论】:

  • 谢谢,您的提示让我解决了我的问题。
  • 我很高兴。我好奇的部分想知道拼图是否缺少部分。如果你能分享 500 个字符或更少,我会欢迎反馈
猜你喜欢
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多