我想在网格视图中列出 MS Access 数据库中的所有表及其行数。我正在使用如下查询:
SELECT MSysObjects.Name, CLng(DCount('*',[name])) AS RecordCount
FROM MSysObjects WHERE (((MSysObjects.Type)=1)
AND (MSysObjects.Name NOT LIKE 'MSys*'))
ORDER BY MSysObjects.Name;
在 MS Access 查询窗格中,这工作得很好。但是,当我通过 .NET 中的 OleDbCommand 对象运行查询时,尽管查询生成了一个结果集,但我得到了一行包含 MSysNavPaneGroupCategories 的数据。当我尝试时,这一行总是抛出错误:
DataRow row = null;
do
{
row = dt.NewRow();
row["TableName"] = (string)dr["Name"];
row["RecordCount"] = (int)dr["RecordCount"]; // Fails here when dr["Name"]==MSysNavPaneGroupCategories
dt.Rows.Add(row);
} while (dr.Read());
错误信息是:
System.InvalidOperationException 未处理。
提供程序无法确定 Int32 值。例如,行刚刚创建,Int32 列的默认值不可用,消费者尚未设置新的 Int32 值。源="系统.数据"
所以我的解决方法是制作一个 TEMP 表并从中读取(或为该列设置一个默认值......这克服了错误,但仍将流氓表包含在结果集中)。
这里发生了什么?MSysNavPaneGroupCategories 甚至不应该进入结果集。
MSysNavPaneGroupCategories 系统表上没有太多信息。
这个 url说 MSysNavPaneGroupCategories 是三个系统表之一
定义导航窗格中的所有内容。
.. 在 Access 2007 中。
导航窗格是 Microsoft Office Access 2007 中的新功能,是一个中心位置,您可以从中轻松查看和访问所有数据库对象(数据库对象:Access 数据库包含表、查询、表单、报表、页面、宏、和模块。Access 项目包含窗体、报表、页面、宏和模块等对象。)、运行报表或直接在表中输入数据。
...在 Access 2007 中。
当它是 Access 2007 功能时,为什么该表会显示在 Access 2K 数据库表列表中,为什么它会出现在与条件不匹配的查询中?