DataTable 批量更新数据 我有两个数据库,用一个DataTable存放了一个数据库中的表中的所有数据。现在我想把这个DataTable中的所有数据插入到另一个数据库中的表中。应该怎样做?SqlDataAdapter.Update方法怎样使用。有完整的例子更好 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ADO.Net2.0中提供了SqlBulkCopy类SqlBulkCopy 类• DestinationTableName:目标数据库的表名• BulkCopyTimeout:指定操作完成的Timeout时间• NotifyAfter:指定通知通知事件前处理的数据行数• WriteToServer方法:将数据源拷备到目标数据库• SqlBulkCopy DesBulkOp = newSqlBulkCopy(DesConString,SqlBulkCopyOptions.UseInternalTransaction);– 指定了目标数据库,使用SqlBulkCopyOptions.UseInternalTransaction是指迁移动作指定在一个Transaction当中,如果数据迁移中产生错误或异常将发生回滚。• 使用SqlBulkCopy 类只能向SQL Server 表写入数据。但是,数据源不限于SQL Server;可以使用任何数据源,只要数据可加载到DataTable 实例或可使用IDataReader实例读取数据。 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Data.SqlClient;using System.Configuration;namespace Demo17{ public partial class Form1 : Form { DateTime startTime; public Form1() { InitializeComponent(); } private void btnTest_Click(object sender, EventArgs e) { startTime = DateTime.Now; string SrcConString; string DesConString; SqlConnection SrcCon = new SqlConnection(); SqlConnection DesCon = new SqlConnection(); SqlCommand SrcCom = new SqlCommand(); SqlDataAdapter SrcAdapter = new SqlDataAdapter(); DataTable dt = new DataTable(); SrcConString = ConfigurationManager.ConnectionStrings["SrcDBConnectionString"].ConnectionString; DesConString = ConfigurationManager.ConnectionStrings["DesDBConnectionString"].ConnectionString; SrcCon.ConnectionString = SrcConString; SrcCom.Connection = SrcCon; SrcCom.CommandText = " SELECT * From Production.Product"; SrcCom.CommandType = CommandType.Text; SrcCom.Connection.Open(); SrcAdapter.SelectCommand = SrcCom; SrcAdapter.Fill(dt); SqlBulkCopy DesBulkOp; DesBulkOp = new SqlBulkCopy(DesConString, SqlBulkCopyOptions.UseInternalTransaction); DesBulkOp.BulkCopyTimeout = 500000000; DesBulkOp.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnRowsCopied); DesBulkOp.NotifyAfter = dt.Rows.Count; //DesBulkOp.ColumnMappings.Add("SrcCol", "DesCol"); try { DesBulkOp.DestinationTableName = "Product"; DesBulkOp.WriteToServer(dt); } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { SrcCon.Close(); DesCon.Close(); } } private void OnRowsCopied(object sender, SqlRowsCopiedEventArgs args) { lblCounter.Text += args.RowsCopied.ToString() + " rows are copied\r\n"; TimeSpan copyTime = DateTime.Now - startTime; lblCounter.Text += "Copy Time:" + copyTime.Seconds.ToString() + "." + copyTime.Milliseconds.ToString() + " seconds"; } }} //jp 为dataset1的其中一张表for(int i=0;i<dataset1.Tables["jp"].Rows.Count;i++){ cmd.CommandText="insert into 表名(字段1,字段2,字段...) select dataset1.Tables["jp"].Rows[i][1].ToString(),dataset1.Tables["jp"].Rows[i][2].ToString(),dataset1.Tables["jp"].Rows[i][3].ToString()...; cmd.ExecuteNonQuery();} 如果数据非常多的时候,这个效率应该是非常低的还是用SqlBulkCopy效率比较高,毕竟是.net平台下面已经有的类,处理数据的能力应该强得多,学习了一下 应用程序发布问题,急急急!!! 如何将List<Point2d> points对象中的所有X、Y坐标分量都乘以一个数c 怎么理解C#啊 C# winform listView控件如何用代码选中所有行? C#中关于目录选取的问题 (在线等)在NET2003中插入水晶报表后自动生成报表类,在2005中不生成 C#字符中如何加引号? 求一个c# 局域网语音聊天的实例 文本文件读写中遇到的问题 “WindowsFormsApplication1.Form1”的类型初始值设定项引发异常。 在一个DATAGRID里套了一个REPEATE,哪个能帮我解决下全选的问题呀 treeview问题
SqlBulkCopy 类
• DestinationTableName:目标数据库的表名
• BulkCopyTimeout:指定操作完成的Timeout时间
• NotifyAfter:指定通知通知事件前处理的数据行数
• WriteToServer方法:将数据源拷备到目标数据库
• SqlBulkCopy DesBulkOp = new
SqlBulkCopy(DesConString,
SqlBulkCopyOptions.UseInternalTransaction);
– 指定了目标数据库,使用
SqlBulkCopyOptions.UseInternalTransaction是指迁移动作指定
在一个Transaction当中,如果数据迁移中产生错误或异常将发生
回滚。
• 使用SqlBulkCopy 类只能向SQL Server 表写入数据。但
是,数据源不限于SQL Server;可以使用任何数据源,
只要数据可加载到DataTable 实例或可使用IDataReader
实例读取数据。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Configuration;namespace Demo17
{
public partial class Form1 : Form
{
DateTime startTime;
public Form1()
{
InitializeComponent();
} private void btnTest_Click(object sender, EventArgs e)
{
startTime = DateTime.Now;
string SrcConString;
string DesConString;
SqlConnection SrcCon = new SqlConnection();
SqlConnection DesCon = new SqlConnection();
SqlCommand SrcCom = new SqlCommand();
SqlDataAdapter SrcAdapter = new SqlDataAdapter();
DataTable dt = new DataTable();
SrcConString =
ConfigurationManager.ConnectionStrings["SrcDBConnectionString"].ConnectionString;
DesConString =
ConfigurationManager.ConnectionStrings["DesDBConnectionString"].ConnectionString;
SrcCon.ConnectionString = SrcConString;
SrcCom.Connection = SrcCon;
SrcCom.CommandText = " SELECT * From Production.Product";
SrcCom.CommandType = CommandType.Text;
SrcCom.Connection.Open();
SrcAdapter.SelectCommand = SrcCom;
SrcAdapter.Fill(dt);
SqlBulkCopy DesBulkOp;
DesBulkOp = new SqlBulkCopy(DesConString,
SqlBulkCopyOptions.UseInternalTransaction);
DesBulkOp.BulkCopyTimeout = 500000000;
DesBulkOp.SqlRowsCopied +=
new SqlRowsCopiedEventHandler(OnRowsCopied);
DesBulkOp.NotifyAfter = dt.Rows.Count;
//DesBulkOp.ColumnMappings.Add("SrcCol", "DesCol");
try
{
DesBulkOp.DestinationTableName = "Product";
DesBulkOp.WriteToServer(dt);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
SrcCon.Close();
DesCon.Close();
} }
private void OnRowsCopied(object sender, SqlRowsCopiedEventArgs args)
{
lblCounter.Text += args.RowsCopied.ToString() + " rows are copied\r\n";
TimeSpan copyTime = DateTime.Now - startTime;
lblCounter.Text += "Copy Time:" + copyTime.Seconds.ToString() + "." + copyTime.Milliseconds.ToString() + " seconds";
}
}
}
for(int i=0;i<dataset1.Tables["jp"].Rows.Count;i++)
{
cmd.CommandText="insert into 表名(字段1,字段2,字段...) select dataset1.Tables["jp"].Rows[i][1].ToString(),dataset1.Tables["jp"].Rows[i][2].ToString(),dataset1.Tables["jp"].Rows[i][3].ToString()...; cmd.ExecuteNonQuery();
}
如果数据非常多的时候,这个效率应该是非常低的还是用SqlBulkCopy效率比较高,毕竟是.net平台下面已经有的类,处理数据的能力应该强得多,学习了一下