将Excel表格导入Access数据库时仅导入表头的问题排查
Access导入Excel仅插入表头行的问题修复
问题描述
使用Access数据库,已有将数据导出至Excel备份的代码。现编写的Excel导回Access的代码仅能创建表并导入表头行,DataGridView中可看到完整数据(说明已读取到全部内容),但数据库仅插入一行数据,需要实现将Excel中每个工作表的所有数据都导入Access。
问题根源
原代码仅在**表已存在(创建表时抛出异常)**的情况下才执行数据插入操作,而新创建表后没有触发任何数据插入逻辑,导致新建表只有结构没有数据;同时,即使进入插入分支,原代码的逻辑也没有确保全量数据被处理。
修复后的代码
private void button5_Click(object sender, EventArgs e) { // Excel连接字符串 string excelConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:/temp/TestFolder/Test.xlsx;Extended Properties='Excel 12.0;HDR=YES;'"; // Access连接字符串 string accessConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:/temp/TestFolder/TestDatabase.mdb;Persist Security Info=False;"; using (OleDbConnection excelConn = new OleDbConnection(excelConnStr)) using (OleDbConnection accessConn = new OleDbConnection(accessConnStr)) { excelConn.Open(); accessConn.Open(); // 获取Excel中的工作表列表 DataTable excelSchema = excelConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); foreach (DataRow row in excelSchema.Rows) { string sheetName = row["TABLE_NAME"].ToString(); // 处理带$后缀的工作表名 if (sheetName.EndsWith("$")) { string accessTableName = sheetName.Replace("$", ""); // 读取Excel工作表的完整数据 using (OleDbDataAdapter adapter = new OleDbDataAdapter($"SELECT * FROM [{sheetName}]", excelConn)) { DataTable excelData = new DataTable(); adapter.Fill(excelData); // 尝试创建Access表 bool tableExists = false; string createTableQuery = $"CREATE TABLE [{accessTableName}] ("; foreach (DataColumn column in excelData.Columns) { createTableQuery += $"[{column.ColumnName}] TEXT, "; } createTableQuery = createTableQuery.TrimEnd(',', ' ') + ")"; try { using (OleDbCommand createTableCommand = new OleDbCommand(createTableQuery, accessConn)) { createTableCommand.ExecuteNonQuery(); } } catch (Exception) { // 捕获异常说明表已存在 tableExists = true; } // 统一执行数据插入:无论表是新建还是已存在,都导入所有数据 using (OleDbDataAdapter accessAdapter = new OleDbDataAdapter($"SELECT * FROM [{accessTableName}]", accessConn)) using (OleDbCommandBuilder builder = new OleDbCommandBuilder(accessAdapter)) { accessAdapter.Update(excelData); } } } } } Console.WriteLine("数据导入成功。"); }
关键修改点
- 分离表创建与数据插入逻辑:不再依赖异常分支控制数据导入,确保无论表是否新建,都会执行全量数据插入。
- 新增
tableExists状态标记:明确记录表是否已存在,提升代码的可读性和可维护性。 - 提取统一的表名变量:避免重复执行字符串替换操作,减少冗余代码。
- 确保全量数据导入:
OleDbDataAdapter.Update()会自动识别DataTable中的所有数据行,将其插入到对应的Access表中。
内容的提问来源于stack exchange,提问作者Richard A Knox
相关产品推荐
相关产品推荐

