高手请教,在线等急!!!!!!!!!!!!! 本地数据表(dataset.table)利用adapter 更新数据库,很慢,有没有好的方法提高效率。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 那就别用adapter 自动更新数据库了,自己写更新的代码 用Update就是方便,想提高性能,自己写循环更新数据方法... 不知道你说的什么是本地表?SQL直接导入更新的话拼写update或者insert语句 怎么不明白呢;我在应用程序里有个DataTable我想把这个DataTable插入到服务器数据库中某个表中 批量复制操作提供情报了把数据加载到目标数据库中的最高效方式,但对数据库更新过程进行定制的机会也最少。例如,批量复制操作只能把数据加载到目标数据库的一个表中。而在许多真实情况下,目标数据库都使用多个表,数据也常常需要执行定制的SQL语句或定制的存储过程。 ADO.NET提供的DataAdapter对象就用于这种情况。DataAdapter对象可以用于提供定制的Update、Insert、Delete命令,以及使用DataTable。在DataAdpater上调用Update方式时,会遍历DataTable中的所有行,并根据每一行上设置的RowState标志解发相应的Update、Insert或Delete命令。 在以前版本的 ADO.NET 中,使用 DataSet 中的更改来更新数据库时,DataAdapter 的 Update 方法每次更新数据库的一行。因为该方法循环访问指定 DataTable 中的行,所以,会检查每个 DataRow,确定是否已修改。如果该行已修改,将根据该行的 RowState 属性值调用相应的 UpdateCommand、InsertCommand 或 DeleteCommand。每一次行更新都涉及网络与数据库之间的双向数据传输。 在 ADO.NET 2.0 中,DataAdapter 公开了 UpdateBatchSize 属性。将 UpdateBatchSize 设置为正整数值将使对数据库的更新以指定大小的批次进行发送。例如,如果将 UpdateBatchSize 设置为 10,会将 10 个独立的语句组合在一起并作为一批提交。将 UpdateBatchSize 设置为 0 将导致 DataAdapter 使用服务器可以处理的最大批次的大小。如果将其设置为 1,则禁用批量更新,因为此时每次发送一行。执行非常大的批次可能会降低性能。因此,在实现应用程序之前,应测试最佳的批次大小设置。启用了批量更新后,DataAdapter 的 UpdateCommand、InsertCommand 和 DeleteCommand 的 UpdatedRowSource 属性值应设置为 None 或 OutputParameters。在执行批量更新时,命令的 FirstReturnedRecord 或 Both 的 UpdatedRowSource 属性值无效。 下面的过程演示了DataAdapter 如何进行批量更新。它从NorthWind数据库的employees表中提取数据,更新他们的地址、国家、城市以及地区信息,再把这些修改过的信息保存回表中。使用的批量大小为3,在每个批处理中处理3个命令。如果要在以后处理更多的批处理记录,可以把这个数字改得更大一些,目前,Northwind数据库中的Employees表中只包含9个记录,把批量大小设置为3,可以对数据库服务器的3次请求完成对9个记录的更新。 protected void btnBulkCopy_Click(object sender, EventArgs e) { SqlDataAdapter EmpAdapter = new SqlDataAdapter(); DataTable EmpDT = new DataTable(); SqlConnection DBConSelect = new SqlConnection(); SqlConnection DBConUpdate = new SqlConnection(); SqlCommand SelectCommand = new SqlCommand(); SqlCommand UpdateCommand = new SqlCommand(); //对查询与更新使用不同的连接对象 DBConSelect.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; DBConUpdate.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; SelectCommand.CommandText = "select employeeid,address,city,region,country from employees"; SelectCommand.CommandType = CommandType.Text; SelectCommand.Connection = DBConSelect; UpdateCommand.CommandText = "Update employees set address=@address," + "city=@city,region=@region,country=@country"; UpdateCommand.CommandType = CommandType.Text; UpdateCommand.Connection = DBConUpdate; //添加参数 SqlParameter AddressParam; AddressParam = new SqlParameter("@address", SqlDbType.VarChar, 15, "Address"); SqlParameter CityParam; CityParam = new SqlParameter("@city", SqlDbType.VarChar, 15, "city"); SqlParameter Region; Region = new SqlParameter("@region", SqlDbType.VarChar, 15, "region"); SqlParameter CounParam; CounParam = new SqlParameter("@country", SqlDbType.VarChar, 15, "country"); UpdateCommand.Parameters.Add(AddressParam); UpdateCommand.Parameters.Add(CityParam); UpdateCommand.Parameters.Add(Region); UpdateCommand.Parameters.Add(CounParam); //执行 EmpAdapter.SelectCommand = SelectCommand; EmpAdapter.UpdateCommand = UpdateCommand; EmpAdapter.Fill(EmpDT); DBConSelect.Close(); //对所有记录里的相关字段进行赋值 foreach (DataRow dr in EmpDT.Rows) { dr["Address"] = "SIPIC"; dr["city"] = "Suzhou China"; dr["Region"] = "Asia"; dr["Country"] = "flower"; } EmpAdapter.RowUpdated += new SqlRowUpdatedEventHandler(EmpAdapter_RowUpdated); lblCounter.Text = ""; EmpAdapter.UpdateBatchSize = 100; UpdateCommand.UpdatedRowSource = UpdateRowSource.None; try { DBConUpdate.Open(); EmpAdapter.Update(EmpDT); //更新后记录 SelectCommand.Connection.Open(); reader = SelectCommand.ExecuteReader(CommandBehavior.CloseConnection); GridView2.DataSource = reader; GridView2.DataBind(); } catch (Exception ex) { lblCounter.Text += ex.Message + "<br>"; } finally { if (DBConUpdate.State == ConnectionState.Open) DBConUpdate.Close(); } } private void EmpAdapter_RowUpdated(object sender, SqlRowUpdatedEventArgs args) { lblCounter.Text += "更新已执行了" + args.RowCount.ToString() + "<br>"; } ComboBox赋值的问题 一小段代码的疑惑 急,急,急web页面用什么代替TrackBar 来做个播放器的进度条?? 在不绑定到控件的情况下,如何查看DataTable中有哪些列? c#写的通过串口写AT指令发短信的程序,大家帮忙看看! 静态方法与非静态方法的内存分配与性能 ########通过Web服务传过来的数据集,怎么更新 再请大家做几道选择道. 用户权限分配设置问题 关于Microsoft Agent Version 2.0的问题 问个DLL模块化及代码保护(代码混淆)的问题 高手眼中的小问题
用Update就是方便,想提高性能,自己写循环更新数据方法...
更新的话拼写update或者insert语句
我在应用程序里有个DataTable
我想把这个DataTable插入到服务器数据库中某个表中
ADO.NET提供的DataAdapter对象就用于这种情况。DataAdapter对象可以用于提供定制的Update、Insert、Delete命令,以及使用DataTable。在DataAdpater上调用Update方式时,会遍历DataTable中的所有行,并根据每一行上设置的RowState标志解发相应的Update、Insert或Delete命令。
在以前版本的 ADO.NET 中,使用 DataSet 中的更改来更新数据库时,DataAdapter 的 Update 方法每次更新数据库的一行。因为该方法循环访问指定 DataTable 中的行,所以,会检查每个 DataRow,确定是否已修改。如果该行已修改,将根据该行的 RowState 属性值调用相应的 UpdateCommand、InsertCommand 或 DeleteCommand。每一次行更新都涉及网络与数据库之间的双向数据传输。
在 ADO.NET 2.0 中,DataAdapter 公开了 UpdateBatchSize 属性。将 UpdateBatchSize 设置为正整数值将使对数据库的更新以指定大小的批次进行发送。例如,如果将 UpdateBatchSize 设置为 10,会将 10 个独立的语句组合在一起并作为一批提交。将 UpdateBatchSize 设置为 0 将导致 DataAdapter 使用服务器可以处理的最大批次的大小。如果将其设置为 1,则禁用批量更新,因为此时每次发送一行。
执行非常大的批次可能会降低性能。因此,在实现应用程序之前,应测试最佳的批次大小设置。启用了批量更新后,DataAdapter 的 UpdateCommand、InsertCommand 和 DeleteCommand 的 UpdatedRowSource 属性值应设置为 None 或 OutputParameters。在执行批量更新时,命令的 FirstReturnedRecord 或 Both 的 UpdatedRowSource 属性值无效。
下面的过程演示了DataAdapter 如何进行批量更新。它从NorthWind数据库的employees表中提取数据,更新他们的地址、国家、城市以及地区信息,再把这些修改过的信息保存回表中。使用的批量大小为3,在每个批处理中处理3个命令。如果要在以后处理更多的批处理记录,可以把这个数字改得更大一些,目前,Northwind数据库中的Employees表中只包含9个记录,把批量大小设置为3,可以对数据库服务器的3次请求完成对9个记录的更新。 protected void btnBulkCopy_Click(object sender, EventArgs e)
{
SqlDataAdapter EmpAdapter = new SqlDataAdapter();
DataTable EmpDT = new DataTable();
SqlConnection DBConSelect = new SqlConnection();
SqlConnection DBConUpdate = new SqlConnection();
SqlCommand SelectCommand = new SqlCommand();
SqlCommand UpdateCommand = new SqlCommand(); //对查询与更新使用不同的连接对象
DBConSelect.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
DBConUpdate.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
SelectCommand.CommandText = "select employeeid,address,city,region,country from employees";
SelectCommand.CommandType = CommandType.Text;
SelectCommand.Connection = DBConSelect; UpdateCommand.CommandText = "Update employees set address=@address," + "city=@city,region=@region,country=@country";
UpdateCommand.CommandType = CommandType.Text;
UpdateCommand.Connection = DBConUpdate; //添加参数
SqlParameter AddressParam;
AddressParam = new SqlParameter("@address", SqlDbType.VarChar, 15, "Address"); SqlParameter CityParam;
CityParam = new SqlParameter("@city", SqlDbType.VarChar, 15, "city"); SqlParameter Region;
Region = new SqlParameter("@region", SqlDbType.VarChar, 15, "region"); SqlParameter CounParam;
CounParam = new SqlParameter("@country", SqlDbType.VarChar, 15, "country"); UpdateCommand.Parameters.Add(AddressParam);
UpdateCommand.Parameters.Add(CityParam);
UpdateCommand.Parameters.Add(Region);
UpdateCommand.Parameters.Add(CounParam); //执行
EmpAdapter.SelectCommand = SelectCommand;
EmpAdapter.UpdateCommand = UpdateCommand; EmpAdapter.Fill(EmpDT); DBConSelect.Close(); //对所有记录里的相关字段进行赋值
foreach (DataRow dr in EmpDT.Rows)
{
dr["Address"] = "SIPIC";
dr["city"] = "Suzhou China";
dr["Region"] = "Asia";
dr["Country"] = "flower";
} EmpAdapter.RowUpdated += new SqlRowUpdatedEventHandler(EmpAdapter_RowUpdated); lblCounter.Text = "";
EmpAdapter.UpdateBatchSize = 100; UpdateCommand.UpdatedRowSource = UpdateRowSource.None; try
{
DBConUpdate.Open();
EmpAdapter.Update(EmpDT);
//更新后记录
SelectCommand.Connection.Open();
reader = SelectCommand.ExecuteReader(CommandBehavior.CloseConnection);
GridView2.DataSource = reader;
GridView2.DataBind();
}
catch (Exception ex)
{
lblCounter.Text += ex.Message + "<br>";
}
finally
{
if (DBConUpdate.State == ConnectionState.Open)
DBConUpdate.Close();
}
} private void EmpAdapter_RowUpdated(object sender, SqlRowUpdatedEventArgs args)
{
lblCounter.Text += "更新已执行了" + args.RowCount.ToString() + "<br>";
}