You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将2003 .mdb迁移至2007 .accdb时CREATE TABLE语句语法错误求助

解决Access数据库迁移中的CREATE TABLE语法错误

核心问题分析

  1. 语法不兼容:Access(包括.mdb和.accdb格式)不支持CREATE TABLE ... AS SELECT语法,这是MySQL等数据库的写法,Access对应的表复制语法是SELECT ... INTO。
  2. 逻辑错误:你的代码用新库的连接执行SELECT * FROM [tableName],但新库中还不存在该表,即使语法正确也会触发“表不存在”的错误。

修正后的代码方案

使用Access支持的SELECT ... INTO跨库复制语法,同时优化连接管理:

// 替换为你的旧.mdb和新.accdb的实际连接字符串
string oldConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Path\\To\\OldDatabase.mdb";
string newConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Path\\To\\NewDatabase.accdb";

using (OleDbConnection oldConnection = new OleDbConnection(oldConnStr))
using (OleDbConnection newConnection = new OleDbConnection(newConnStr))
{
    oldConnection.Open();
    newConnection.Open();

    DataTable schemaTable = oldConnection.GetSchema("Tables");

    foreach (DataRow schemaRow in schemaTable.Rows)
    {
        string tableName = schemaRow["TABLE_NAME"].ToString();

        // 跳过系统表
        if (tableName.StartsWith("MSys"))
        {
            continue;
        }

        // 从旧库提取数据库路径,用于跨库查询
        string oldDbPath = oldConnStr.Split(';')[1].Split('=')[1];
        // Access标准跨库复制语法:创建新表并导入旧库数据
        string createTableSql = $"SELECT * INTO [{tableName}] FROM [{tableName}] IN '{oldDbPath}'";
        
        OleDbCommand createTableCmd = new OleDbCommand(createTableSql, newConnection);
        createTableCmd.ExecuteNonQuery();
    }
}
// using块会自动释放连接资源,无需手动调用Close

关键说明

  • SELECT ... INTO语法:这是Access中创建新表并同步导入数据的标准写法,IN '旧库路径'指定数据源为旧的.mdb数据库。
  • 统一用方括号包裹表名:不管表名是否包含特殊字符(如下划线、空格),都用[表名]包裹,避免触发保留字或特殊字符的语法错误。
  • 使用using语句管理连接:自动处理连接的打开和释放,避免资源泄漏和手动开关连接的繁琐。
  • 驱动版本匹配:旧.mdb库使用Microsoft.Jet.OLEDB.4.0驱动,新.accdb库使用Microsoft.ACE.OLEDB.12.0驱动,确保兼容性。

内容的提问来源于stack exchange,提问作者coder2468

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 09:43:14