C#复制Access数据库表结构和数据到另一个数据库表

发布时间 2023-06-29 16:13:49作者: 青丝·旅人

一、参考资料(以下为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;
            }
        }