C#复制Access数据库表结构和数据到另一个数据库表
一、参考资料(以下为AccessSQL语句)
1.1.复制表
select * into table2 from table1 --创建了一张新表:table2 ,把table1表中的所有数据 连同表结构都一并复制 到table2中 --可以再通俗的理解为,先复制了个一模一样的表,然后把表名改成table2了
truncate table table2
--清空该表中的所有数据
insert into table2 select * from table1 --把table1表中的数据复制到table2中,这个前提是 table2表已存在,表结构与table1相同
如果table2与table1结构不相同↓↓↓
insert into table2 (column1, column2, column3) select column1, column2, column3 from table1
1.2.跨文件查询表,如果是同一台机器上,可以使用如下两种方式访问另一个MDB:
(1)其中表名是在db2中的表名 SELECT * from 表名 in 'C:\db2.mdb ' (2)其中表名是在db2中的表名 select * from [;database=C:\db2.mdb].表名
追加到本机的另一个MDB中:
insert into 目标MDB的表名(字段列表) in 'C:\db2.mdb ' select 字段列表 from 当前MDB的表名 或 insert into [;database=C:\db2.mdb].目标MDB的表名(字段列表) select 字段列表 from 当前MDB的表名
二、C#跨数据库复制表方法;CommandSQL为自定义方法
/// <summary> /// 将另外的数据库表复制到当前数据库连接对象,创建一个相同结构相同数据指并指定名称的表 /// </summary> /// <param name="newTableName">当前数据库连接创建的新表名称</param> /// <param name="sourceTableName">复制源数据库表的名称</param> /// <param name="sourceSqlPath">源数据库路径</param> /// <param name="sourceSqlName">源数据库名称</param> /// <returns>若源数据库不存在或异常返回false,否则返回true</returns> public bool CopyDataTable(string newTableName, string sourceTableName, string sourceSqlPath, string sourceSqlName) { try { if (File.Exists(sourceSqlPath + sourceSqlName + ".mdb")) { CommandSQL("SELECT * into " + newTableName + " from " + sourceTableName + " in '" + @sourceSqlPath + sourceSqlName + ".mdb'"); return true; } else { return false; } } catch(Exception ex) { MessageBox.Show("复制数据库 " + sourceSqlPath + sourceSqlName + " 的 " + sourceTableName + " 表时发生异常:\r\n\r\n" + ex.Message); return false; } }
三、C#快速将DataTable写入access数据库表方法
/// <summary> /// 将与指定的数据库表相同结构的DataTable表数据快速更新到数据库中 /// </summary> /// <param name="sqlPath">数据库路径</param> /// <param name="sqlName">数据库名称(无需填入后缀)</param> /// <param name="tableName">数据库表名</param> /// <param name="updateTable">与数据库表相同结构的DataTable数据表</param> /// <returns>更新成功返回true,失败或异常返回false</returns> public static bool UpdateDataTable(string sqlPath, string sqlName, string tableName, DataTable updateTable) { try { if (File.Exists(sqlPath + sqlName + ".mdb")) { using (OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sqlPath + sqlName + ".mdb")) { conn.Open(); OleDbDataAdapter oleDap = new OleDbDataAdapter("select * from " + tableName, conn); OleDbCommandBuilder oleCbd = new OleDbCommandBuilder(oleDap); DataTable writeTable = new DataTable(); oleDap.Fill(writeTable); for (int r = 0; r < updateTable.Rows.Count; r++) { DataRow wDr = writeTable.NewRow(); for (int c = 0; c < updateTable.Columns.Count; c++) { wDr[c] = updateTable.Rows[r][c]; } writeTable.Rows.Add(wDr); } oleDap.UpdateCommand = oleCbd.GetUpdateCommand(); oleDap.Update(writeTable); } return true; } else//数据库文件不存在,直接返回false { return false; } } catch (Exception ex) { MessageBox.Show("更新数据库 " + sqlPath + sqlName + " 的 " + tableName + " 表时发生异常:\r\n\r\n" + ex.Message); return false; } } /// <summary> /// 将与指定的数据库表相同结构的DataTable表数据快速更新到数据库中 /// </summary> /// <param name="tableName">数据库表名</param> /// <param name="updateTable">与数据库表相同结构的DataTable数据表</param> /// <returns>更新成功返回true,失败或异常返回false</returns> public bool UpdateDataTable(string tableName, DataTable updateTable) { try { OleDbDataAdapter oleDap = new OleDbDataAdapter("select * from " + tableName, useConn); OleDbCommandBuilder oleCbd = new OleDbCommandBuilder(oleDap); DataTable writeTable = new DataTable(); oleDap.Fill(writeTable); for (int r = 0; r < updateTable.Rows.Count; r++) { DataRow wDr = writeTable.NewRow(); for (int c = 0; c < updateTable.Columns.Count; c++) { wDr[c] = updateTable.Rows[r][c]; } writeTable.Rows.Add(wDr); } oleDap.UpdateCommand = oleCbd.GetUpdateCommand(); oleDap.Update(writeTable); oleCbd.Dispose(); oleDap.Dispose(); return true; } catch (Exception ex) { MessageBox.Show("更新数据库的 " + tableName + " 表时发生异常:\r\n\r\n" + ex.Message); return false; } }