前言

需求是将一个数据库的部分基础表数据迁移到一个新库,因此,我想遍历一个表名数组,获取每个表的所有数据写入到新库数据表。LinqToBb好像没有类似db.Query(sql)直接返回DataTable的写法。查询相关资料后做了一些整理。

方法

  internal class DbClient : DataConnection
    {
        public DbClient(string connectionString) : base(LinqToDB.ProviderName.Oracle, connectionString)
        {

        }
    }
 foreach (var item in listBox2.Items)//遍历表名
            {
                using (var db = new DbClient(textBox1.Text))//textBox1.text是原数据连接字符串
                {
                    string sql = $"select * from {item}";
                    var table = db.ExecuteReader(sql);
                    DataTable dt = new DataTable();
                    dt.Load(table.Reader);//先读DataReader,再附加DataTable
                    //textBox2是目标库连接字符串
                    Oracle.ManagedDataAccess.Client.OracleBulkCopy bulkCopy = new OracleBulkCopy(textBox2.Text, OracleBulkCopyOptions.UseInternalTransaction);
                    bulkCopy.DestinationTableName = item.ToString();
                    foreach (DataColumn col in dt.Columns)
                    {
                        bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
                    }
                    bulkCopy.WriteToServer(dt);
                    bulkCopy.Dispose();
                }
                counter++;
                OnNotice?.Invoke(this, $"{item}已完入({counter / listBox2.Items.Count})");
            }

注意DestinationTableName 一定要设置。

Logo

数据库是今天社会发展不可缺少的重要技术,它可以把大量的信息进行有序的存储和管理,为企业的数据处理提供了强大的保障。

更多推荐