将2003 .mdb迁移至2007 .accdb时CREATE TABLE语句语法错误求助
解决Access数据库迁移中的CREATE TABLE语法错误
核心问题分析
- 语法不兼容:Access(包括.mdb和.accdb格式)不支持
CREATE TABLE ... AS SELECT语法,这是MySQL等数据库的写法,Access对应的表复制语法是SELECT ... INTO。 - 逻辑错误:你的代码用新库的连接执行
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
相关产品推荐
相关产品推荐

