使用 C# OleDB 连接检查访问数据库中是否存在某个 table

Check for existence of a certain table in access DB using C# OleDB connection

我正在努力寻找一个有效的答案来解决我正在寻找的问题。 基本上,我想检查是否例如:

"tableNO1" 存在,或者如果每隔 table 存在...

顺便说一下,我正在使用 Access 2002-2003,如果这有帮助的话:) 您认为我应该升级到最新版本吗?

背景: 我正在尝试创建 运行-time 按钮,每个按钮都有一个 DB table,当我关闭程序时,我为每个 [=28= 创建的 tables ]-时间创建的按钮将被保存。再次启动程序后,我应该单击一个按钮,该按钮将添加这些具有 DB table 的按钮(每个按钮都有一个专用的 table)。例如,如果之前在程序中创建了 9 个 运行-time 按钮 - 每个按钮都会有一个 DB table。我将有一个最多 9 个按钮,每个按钮都将被命名为 tableNO(n) n=number of table 当我第一次单击创建 运行 次按钮的按钮时,它将创建一个名为“tableNO1”的按钮,第二次将创建“tableNO2”,等等...

提前致谢。

好的,有几种方法可以做到这一点,但我建议使用以下代码:

   public Boolean TableExist(string sTable)
    {
        using (OleDbConnection conn = new OleDbConnection(Properties.Settings.Default.AccessDB2))
        {
            conn.Open();
            string[] sRestrict = new string[] {null,null,null,null};
            sRestrict[2] = sTable;
            DataTable MySchema = new DataTable();
            MySchema = conn.GetSchema("Columns",sRestrict);

            return (MySchema.Rows.Count > 0);
        }
    }

以上也是如何将模式 (table def) 作为 table.

因此,说

if (TableExist("tblHotels")
{
     // your code here
}

现在,因为您可以(很可能)使用循环,那么出于性能原因,您可能会考虑将有效连接传递给 TableExist 函数,因此对于您的循环而言,不是 re-create 每个连接时间 - 因为这会减慢速度。

请注意,“很多”经常建议这样做:

SELECT * FROM MSysObjects WHERE [Name] = 'tableNO1' AND Type = 1

默认情况下,上述问题是 MySysObjects 需要提升的权限。可以打开数据库,然后使用安全设置访问 MySysOjbects 的权限可以更改 - 但它比上面的工作更多 code/function.