检查 MS Access 数据库表,如果不存在则创建它

Posted

技术标签:

【中文标题】检查 MS Access 数据库表,如果不存在则创建它【英文标题】:Check for MS Access database table if not exist create it 【发布时间】:2011-01-25 12:34:55 【问题描述】:

如何以编程方式?

【问题讨论】:

【参考方案1】:

您可以遍历表名以检查特定表。请参阅下面的代码以获取表名。

        string connectionstring = "Your connection string";
        string[] restrictionValues = new string[4]null,null,null,"TABLE";
        OleDbConnection oleDbCon = new OleDbConnection(connectionString);
        List<string> tableNames = new List<string>();

        try
        
            oleDbCon.Open();
            DataTable schemaInformation = oleDbCon.GetSchema("Tables", restrictionValues);

            foreach (DataRow row in schemaInformation.Rows)
            
               tableNames.Add(row.ItemArray[2].ToString());
            
        
        finally
        
            oleDbCon.Close();
                   

【讨论】:

+1,比仅仅捕获错误更优雅。请删除 catch throw; ,不过:这是一个 NOOP。【参考方案2】:

要检查表是否存在,您可以像这样扩展 DbConnection:

public static class DbConnectionExtensions

    public static bool TableExists(this DbConnection conn, string table)
    
        conn.open();
        var exists = conn.GetSchema("Tables", new string[4]  null, null, table, "TABLE" ).Rows.Count > 0;
        conn.close();
        return exists;
    

然后您可以在任何派生类中调用 TableExists,例如 OleDbConnection、SQLiteConnection 或 SqlConnection。

【讨论】:

【参考方案3】:

如果表存在则执行以下代码,否则将返回错误,否则将创建一个新表:

try

        OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + frmMain.strFilePath + "\\ConfigStructure.mdb");
        myConnection.Open();
        OleDbCommand myCommand = new OleDbCommand();
        myCommand.Connection = myConnection;
        myCommand.CommandText = "CREATE TABLE <yourtable name>(<columns>)";
        myCommand.ExecuteNonQuery();
        myCommand.Connection.Close();

catch(OleDbException e)
  
    if(e.ErrorCode == 3010 || e.ErrorCode == 3012)
    // if error then table exist do processing as required

如果表已存在,则返回这些错误代码 - 全部为 check here。

【讨论】:

【参考方案4】:

一个简单的方法是

public bool CheckTableExistance(string TableName)
    
        // Variable to return that defines if the table exists or not.
        bool TableExists = false;

        // Try the database logic
        try
        
            // Make the Database Connection
            ConnectAt();

            // Get the datatable information
            DataTable dt = _cnn.GetSchema("Tables");

            // Loop throw the rows in the datatable
            foreach (DataRow row in dt.Rows)
            
                // If we have a table name match, make our return true
                // and break the looop
                if (row.ItemArray[2].ToString() == TableName)
                
                    TableExists = true;
                    break;
                
            

            //close database connections!
            Disconnect();
            return TableExists;
        
        catch (Exception e)
        
            // Handle your ERRORS!
            return false;
        
    

【讨论】:

【参考方案5】:

为了完整起见,我会指出,不久前我发布了 4 种不同的编码方式 TableExists() function within Access。在 MSysObjects 上运行 SQL SELECT 的版本可以在 Access 外部运行,但在某些情况下,您可能会遇到安全错误(因为不允许您访问 Jet/ACE 系统表)。

【讨论】:

以上是关于检查 MS Access 数据库表,如果不存在则创建它的主要内容,如果未能解决你的问题,请参考以下文章

MS SQL 2008/Access 2002 VBA - 检查数据库的当前记录,如果不存在则输入

如何通过VBscript检查MS Access中是不是存在表

C# & MS Access - SQL 用于在应用程序开始时创建表、列和添加值

如何批量检查 MS-Access 中的重复项并记录更改?

MS Access 记录数始终为 1,即使没有记录

从 Excel VBA-检查访问表是不是存在/如果不存在,则创建/复制