如题 A B两个数据库结构相同 先想把A库某表的数据做成DATESET 利用语句放到B库相应表中 怎么做呢?

解决方案 »

  1.   

    我以前也遇到过这种问题,别人说只能用语句一个一个的导入,暂时没有发现其他的好方法。
    我试过一种方法,就是循环你需要导入数据的数据库,然后判断这个dataset中是否包含这个数据表,如果包含,再写一个函数,判断其有哪些行,各个行的属性不同的话写入的insert语句也是不同的,调用这个函数写入数据。
    比较复杂哈
      

  2.   

    不懂,为什么不直接操作数据库而非要通过DataSet来做呢?
      

  3.   


    没有必要,如果创建了主键的话,直接insert就可以了,因为相同的记录会有约束的,也根本insert不进
      

  4.   

    先克隆这个DataSet
    然后将第一个DataSet记录LoadDataRow到克隆的DataSet中,再更新克隆的DataSet到B表中
    DataSet dsA=new DataSet();
    DataSet dsB=dsA.Clone();
    foreach(DataRow dr in dsA.Tables[0].Rows)
    {
    dsB.Tables[0].LoadDataRow(dr.ItemArray,false);
    }//更新dsB到B表
      

  5.   

    更新到B表用UPDATE吗?我试过了好像不可以呀
      

  6.   

    //.net2.0中使用SqlBulkCopy进行大批量数据迁移,封装为通用类//在.Net1.1中无论是对于批量插入整个DataTable中的所有数据到数据库中,
    //还是进行不同数据源之间的迁移,都不是很方便。而在.Net2.0中,
    //SQLClient命名空间下增加了几个新类帮助我们通过DataTable或DataReader批量迁移数据。
    //数据源可以来自关系数据库或者XML文件,甚至WebService返回结果。
    //其中最重要的一个类就是SqlBulkCopy类,使用它可以很方便的帮助我们把数据源的数据迁移到目标数据库中。
    //下面我们先通过一个简单的例子说明这个类的使用:
    public class SqlBulkCopyEntity
        {        string lblCounter;        DateTime startTime;
            TimeSpan copyTime;
            public void Bulk(string srcConstr, string desConstr, ref string errorMsg)
            {
                startTime = DateTime.Now;  //当前系统时间
                SqlConnection srcCon = new SqlConnection(srcConstr);
                //SqlConnection desCon = new SqlConnection(desConstr);
                SqlCommand srcCmd = new SqlCommand("select * from srctable", srcCon);
                SqlDataAdapter srcDa = new SqlDataAdapter(srcCmd);
                DataTable dt = new DataTable();
                srcDa.Fill(dt);
                //生成SqlBulkCopy实例,在构造函数中指定目标数据库,
                //使用SqlBulkCopyOptions.UseInternalTransaction是指迁移动指定作在一个Transaction中,如果数据迁移中产生错误或异常将发生回滚。
                SqlBulkCopy desBulk = new SqlBulkCopy(desConstr, SqlBulkCopyOptions.UseInternalTransaction);
                //指定操作完成的Timout超时时间
                desBulk.BulkCopyTimeout = 500000000;            //NotifyAfter属性指定通知通知事件前处理的数据行数,
                //在这里指定为表的行数,并添加SqlRowsCopied事件输出整个迁移过程的时间。
                //WriteToServer方法就是将数据源拷备到目标数据库。
                //在使用WriteToServer方法之前必须先指定DestinationTableName属性,
                //也就是目标数据库的表名,
                desBulk.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnRowsCopied);
                desBulk.NotifyAfter = dt.Rows.Count;            //我们还可以自己定义一个Transaction,例如:
                //SqlTransaction Transaction;
                //Transaction =
                //SrcCom.Connection.BeginTransaction();
                //SqlBulkCopy DesBulkOp;
                //DesBulkOp = new SqlBulkCopy(new SqlConnection(DesConString),
                //SqlBulkCopyOptions.Default,
                //Transaction);            //try
                //{
                //    //..
                //}
                //catch { }
                //finally
                //{
                //    Transaction.Commit();
                //}
                //另外还有一个SqlBulkCopyColumnMapping类,可以让数据源字段映射到目标数据中命名不同的字段上。也就是说如果目标数据和源数据的列名不同时,可以用这个类进行映射:
                //SqlBulkCopyColumnMapping ColMap = new SqlBulkCopyColumnMapping("SrcCol", "DesCol");
                //DesBulkOp.ColumnMappings.Add(ColMap);
                //或者可以直接添加映射:
                //DesBulkOp.ColumnMappings.Add("SrcCol", "DesCol");
                try
                {
                    desBulk.DestinationTableName = dt.TableName;
                    desBulk.WriteToServer(dt);//将数据拷贝到目标数据库,在使用WriteToServer之前必须指定DestinationTablename(目标数据库的表名)
                }
                catch (Exception ex)
                {
                    errorMsg = ex.Message;
                }
                finally
                {
                    #region 关闭连接
                    srcCon.Close();
                    //desCon.Close();
                    #endregion
                }
            }        private void OnRowsCopied(object sender, SqlRowsCopiedEventArgs args)
            {
                lblCounter += args.RowsCopied.ToString() + "行被复制!rows are copied";
                copyTime = DateTime.Now - startTime;
                lblCounter += "Copy Time:" + copyTime.Seconds.ToString() + "." + copyTime.Milliseconds.ToString() + "秒!seconds";
            }    }
      

  7.   


    public class SqlBulkCopyEntity
        {        string lblCounter;        DateTime startTime;
            TimeSpan copyTime;
            public void Bulk(string srcConstr, string desConstr, ref string errorMsg)
            {
                startTime = DateTime.Now;  //当前系统时间
                SqlConnection srcCon = new SqlConnection(srcConstr);
                //SqlConnection desCon = new SqlConnection(desConstr);
                SqlCommand srcCmd = new SqlCommand("select * from srctable", srcCon);
                SqlDataAdapter srcDa = new SqlDataAdapter(srcCmd);
                DataTable dt = new DataTable();
                srcDa.Fill(dt);
                //生成SqlBulkCopy实例,在构造函数中指定目标数据库,
                //使用SqlBulkCopyOptions.UseInternalTransaction是指迁移动指定作在一个Transaction中,如果数据迁移中产生错误或异常将发生回滚。
                SqlBulkCopy desBulk = new SqlBulkCopy(desConstr, SqlBulkCopyOptions.UseInternalTransaction);
                //指定操作完成的Timout超时时间
                desBulk.BulkCopyTimeout = 500000000;            //NotifyAfter属性指定通知通知事件前处理的数据行数,
                //在这里指定为表的行数,并添加SqlRowsCopied事件输出整个迁移过程的时间。
                //WriteToServer方法就是将数据源拷备到目标数据库。
                //在使用WriteToServer方法之前必须先指定DestinationTableName属性,
                //也就是目标数据库的表名,
                desBulk.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnRowsCopied);
                desBulk.NotifyAfter = dt.Rows.Count;            //我们还可以自己定义一个Transaction,例如:
                //SqlTransaction Transaction;
                //Transaction =
                //SrcCom.Connection.BeginTransaction();
                //SqlBulkCopy DesBulkOp;
                //DesBulkOp = new SqlBulkCopy(new SqlConnection(DesConString),
                //SqlBulkCopyOptions.Default,
                //Transaction);            //try
                //{
                //    //..
                //}
                //catch { }
                //finally
                //{
                //    Transaction.Commit();
                //}
                //另外还有一个SqlBulkCopyColumnMapping类,可以让数据源字段映射到目标数据中命名不同的字段上。也就是说如果目标数据和源数据的列名不同时,可以用这个类进行映射:
                //SqlBulkCopyColumnMapping ColMap = new SqlBulkCopyColumnMapping("SrcCol", "DesCol");
                //DesBulkOp.ColumnMappings.Add(ColMap);
                //或者可以直接添加映射:
                //DesBulkOp.ColumnMappings.Add("SrcCol", "DesCol");
                try
                {
                    desBulk.DestinationTableName = dt.TableName;
                    desBulk.WriteToServer(dt);//将数据拷贝到目标数据库,在使用WriteToServer之前必须指定DestinationTablename(目标数据库的表名)
                }
                catch (Exception ex)
                {
                    errorMsg = ex.Message;
                }
                finally
                {
                    #region 关闭连接
                    srcCon.Close();
                    //desCon.Close();
                    #endregion
                }
            }        private void OnRowsCopied(object sender, SqlRowsCopiedEventArgs args)
            {
                lblCounter += args.RowsCopied.ToString() + "行被复制!rows are copied";
                copyTime = DateTime.Now - startTime;
                lblCounter += "Copy Time:" + copyTime.Seconds.ToString() + "." + copyTime.Milliseconds.ToString() + "秒!seconds";
            }    }