如何在Access(Jet)数据库中获取表列表?

11

我需要查看我的C#程序使用的Access数据库中是否存在表格。我知道其他数据库有SQL命令可以返回表格列表。Access/Jet数据库是否有此类命令?

4个回答

12

尝试使用 GetSchema()。

    connection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\access.mdb";    

    connection.Open();

    DataTable userTables = connection.GetSchema("Tables");

这么多华丽的答案,而这就是我想要的!谢谢!! - CindyH

7

完整代码: 使用ADO.NET获取Access数据库中的表列表 - ADO.NET教程

// Microsoft Access provider factory
DbProviderFactory factory =
    DbProviderFactories.GetFactory("System.Data.OleDb");

DataTable userTables = null;

using (DbConnection connection =
            factory.CreateConnection())
{
    // c:\test\test.mdb
    connection.ConnectionString = "Provider=Microsoft
        .Jet.OLEDB.4.0;Data Source=c:\\test\\test.mdb";

    // We only want user tables, not system tables
    string[] restrictions = new string[4];
    restrictions[3] = "Table";

    connection.Open();

    // Get list of user tables
    userTables =
        connection.GetSchema("Tables", restrictions);
}

// Add list of table names to listBox
for (int i=0; i < userTables.Rows.Count; i++)
    listBox1.Items.Add(userTables.Rows[i][2].ToString())

这是您需要的答案:http://social.msdn.microsoft.com/Forums/en/adodotnetdataproviders/thread/d2eaf851-fc06-49a1-b7bd-bca76669783e

该链接是关于ADOD.NET数据提供程序的技术讨论。

2

类似这样的代码可实现此功能。条件句 Type = 1 指定表格。需注意,它会包括系统表格在结果集中(它们以 "MSys" 前缀开头)。

SELECT Name FROM MSysObjects WHERE Type = 1

1
刚试了一下,出现了这个错误:无法读取记录;没有'MSysObjects'的读取权限。 - hawbsl
@hawbsl 似乎你需要在Access数据库中修改权限。选中“工具”菜单 -> “安全” -> “用户和组权限”。将“读取数据”权限分配给MSysObjects表上的管理员用户。 - Tim Lentine
像这样更改权限可能会违反有意设置的用户级安全性。解决方案不是更改基础对象上的权限(这将使其对任何人都开放),而是使用具有所需权限的用户名/密码。 - David-W-Fenton
1
@David-W-Fenton 我的理解是,Access数据库中的“MSys”对象默认情况下甚至不授予管理员用户权限,特别是对于远程连接。如果此项目使用内置的Access安全功能,并且这将是一个长期运行的查询/进程,则使用具有适当权限的专用帐户最佳。然而,我感觉这可能是一种简单粗暴的查询请求,在这种情况下添加另一个带有权限的用户帐户会过度。 - Tim Lentine
如果您没有使用默认管理员帐户读取系统表的权限,那么您将无法执行任何其他操作。很可能正在使用错误的工作组文件,这是导致系统表读取失败的原因。 - David-W-Fenton

0

那个对我有用

using (OleDbConnection con = new OleDbConnection(connectionString))
            {
                con.Open();
                DataTable dt = con.GetSchema("Tables");
                var selectNames = dt.Rows.Cast<DataRow>().Where(c => !c["TABLE_NAME"].ToString().Contains("MSys")).ToArray();
                foreach (var item in selectNames)
                {
                     // add names to comboBox
                    comboBox1.Items.Add(item["TABLE_NAME"]);
                }
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接