You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#操作Access查询报错:聚合参数含备注/OLE/超链接字段

解决Access聚合Memo字段的错误问题

这个报错是Access Jet SQL的经典限制——它不允许对Memo、OLE或超链接类型的字段使用Sum()这类聚合函数。你的Activities.Duration字段大概率被设置成了Memo类型,这就直接触发了这个错误。下面给你两种可行的解决思路:

方案1:修改字段类型(推荐)

如果Duration字段本来就是用来存储数值(时长)的,最彻底的办法是直接在Access数据库里修改字段类型:

  • 打开Activities表的设计视图
  • 把Duration的字段类型从「Memo」改成「数字」(比如选Double、Integer,根据你的时长精度需求)或者「货币」
  • 保存表结构后,你的原查询就能正常运行了,不需要修改任何代码

这种方案从根源上解决了问题,因为字段类型和存储的数据类型匹配才是合理的设计。

方案2:在查询中转换字段类型(无法改表时用)

如果因为历史数据、权限等原因没法修改字段类型,可以在SQL查询里用CDbl()(转换成双精度数字)或者CCur()(转换成货币类型)把Memo字段转成数值后再聚合:

SELECT Jobs.Client, Jobs.Name, Jobs.Area, Jobs.DevHours, 
Sum(CDbl([Activities.Duration])) AS SumOfDuration 
FROM Jobs INNER JOIN Activities ON Jobs.ID = Activities.JobId 
GROUP BY Jobs.Client, Jobs.Name, Jobs.Area, Jobs.DevHours;

额外提醒

如果Duration字段里存在空值或者非数值内容,CDbl()会报错,这时候可以用Nz()函数把空值替换成0:

Sum(CDbl(Nz([Activities.Duration], 0))) AS SumOfDuration

修改完查询后,你原来的C#代码不需要做任何调整,直接运行就能正常填充DataTable了:

string query = @"SELECT Jobs.Client, Jobs.Name, Jobs.Area, Jobs.DevHours, 
Sum(CDbl(Nz([Activities.Duration], 0))) AS SumOfDuration 
FROM Jobs INNER JOIN Activities ON Jobs.ID = Activities.JobId 
GROUP BY Jobs.Client, Jobs.Name, Jobs.Area, Jobs.DevHours;";

OleDbCommand command = new OleDbCommand { CommandText = query, Connection = connection };
OleDbDataAdapter da = new OleDbDataAdapter(command);
DataTable table = new DataTable();
da.Fill(table);

内容的提问来源于stack exchange,提问作者Hossein Beikmarzeh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:52:31