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
相关产品推荐
相关产品推荐

