【问题标题】:How can I get a list of tables in an Access (Jet) database?如何获取 Access (Jet) 数据库中的表列表?
【发布时间】:2011-09-03 09:33:07
【问题描述】:

我需要查看我的 c# 程序使用的 Access 数据库中是否存在表。是否知道其他数据库的 SQL 命令将返回表列表。 Access/Jet数据库有这样的命令吗?

【问题讨论】:

    标签: c# .net sql ms-access jet


    【解决方案1】:

    那个对我有用

    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"]);
                    }
                }
    

    【讨论】:

      【解决方案2】:

      试试 GetSchema()

          connection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\access.mdb";    
      
          connection.Open();
      
          DataTable userTables = connection.GetSchema("Tables");
      

      【讨论】:

      • 这么多花哨的答案,这就是我想要的!谢谢!!
      【解决方案3】:

      这样的事情应该可以解决问题。子句Type = 1 指定表。请注意,这还将包括结果集中的系统表(它们以前缀“MSys”开头。

      SELECT Name FROM MSysObjects WHERE Type = 1
      

      【讨论】:

      • 试一试,我得到:Record(s) cannot be read; no read permission on 'MSysObjects'.
      • @hawbsl 听起来您可能需要修改 Access 数据库中的权限。工具菜单 -> 安全 -> 用户和组权限。为 MSysObjects 表上的管理员用户分配“读取数据”权限。
      • 像这样更改权限可能会违反故意设置的用户级安全性。解决方案不是更改底层对象的权限(这将使其对任何人开放),而是使用具有您需要的权限的用户名/密码。
      • @David-W-Fenton 我的理解是,Access 数据库中的“MSys”对象默认没有授予管理员用户权限,尤其是对于远程连接。我同意,如果该项目使用内置的 Access 安全功能,并且这将是一个长期存在的查询 \ 过程,最好使用具有适当权限的专用帐户。但是,我有一种感觉,这可能是一种糟糕且肮脏的查询请求,在这种情况下,添加另一个具有权限的用户帐户将是多余的。
      • 如果您没有使用默认管理员帐户读取系统表的权限,您将无权执行任何其他操作。可能使用了错误的工作组文件,这就是系统表读取失败的原因。
      【解决方案4】:

      完整代码:Get List of Tables in an Access Database - ADO.NET Tutorials

      // 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-17
        • 2010-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多