从一个数据中获取的dataset 怎样更新到另外一个数据库中相同的表中 如题 A B两个数据库结构相同 先想把A库某表的数据做成DATESET 利用语句放到B库相应表中 怎么做呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我以前也遇到过这种问题,别人说只能用语句一个一个的导入,暂时没有发现其他的好方法。我试过一种方法,就是循环你需要导入数据的数据库,然后判断这个dataset中是否包含这个数据表,如果包含,再写一个函数,判断其有哪些行,各个行的属性不同的话写入的insert语句也是不同的,调用这个函数写入数据。比较复杂哈 不懂,为什么不直接操作数据库而非要通过DataSet来做呢? 没有必要,如果创建了主键的话,直接insert就可以了,因为相同的记录会有约束的,也根本insert不进 先克隆这个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表 更新到B表用UPDATE吗?我试过了好像不可以呀 //.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"; } } 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"; } } C/S软件 500条线程是否太多? C#如何获得网站发来的数据? C# 制作桌面快捷方式 类似苹果 没想明白,屏蔽基类的相关属性 日文操作系统下,可否装一套日文的.net studio及日文的framework,同时装一套中文的.net studio及中文的framework 如何让WinForm固定在屏幕某一位置,不可以拖动? C#中的问题求解 求教: c# & windows form的几个小问题. 不是错误的错误 c# 访问db2的问题,急 小问题求救 DownloadString中文
我试过一种方法,就是循环你需要导入数据的数据库,然后判断这个dataset中是否包含这个数据表,如果包含,再写一个函数,判断其有哪些行,各个行的属性不同的话写入的insert语句也是不同的,调用这个函数写入数据。
比较复杂哈
没有必要,如果创建了主键的话,直接insert就可以了,因为相同的记录会有约束的,也根本insert不进
然后将第一个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表
//还是进行不同数据源之间的迁移,都不是很方便。而在.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";
} }
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";
} }