急,关于将dataset数据一次性传入SQL数据表问题..... 我有一个数据集ds,怎么样将数据集一次性传入sql数据表:以前使用遍历方法,现在由于数据量越来越大,如果再这样下去可能系统将会死掉. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 参考自动批量更新DataSet中的数据到数据库 [WebMethod(Description = "Update服务提供的方法,将包含修改后数据的DateSet与本地数据库同步更新,成功返回更新的行数,失败返回-1。"), SoapHeader("currentUser")] public int Update(DataSet ds) { if (!ValidateUser(currentUser.UserName, currentUser.UserPass)) { return -1; } else { int res = 0; using (SqlConnection sqlconn = new SqlConnection("Data Source=.;Initial Catalog=xxxx;User ID=sa;Password=sa")) { sqlconn.Open(); / / //使用加强读写锁事务 SqlTransaction tran = sqlconn.BeginTransaction(IsolationLevel.ReadCommitted); try { foreach (DataRow dr in ds.Tables[0].Rows) { //所有行设为修改状态 dr.SetModified(); } //为Adapter定位目标表 SqlCommand cmd = new SqlCommand(string.Format("select * from {0} where 1=0 ", ds.Tables[0].TableName), sqlconn, tran); SqlDataAdapter da = new SqlDataAdapter(cmd); SqlCommandBuilder sqlCmdBuilder = new SqlCommandBuilder(da); da.AcceptChangesDuringUpdate = false; SqlCommand updatecmd = new SqlCommand(string.Format(" UPDATE [{0}] SET [Name] = @Name WHERE ([ID] = @ID) ", ds.Tables[0].TableName)); //不修改源DataTable updatecmd.UpdatedRowSource = UpdateRowSource.None; da.UpdateCommand = updatecmd; da.UpdateCommand.Parameters.Add("@Name", SqlDbType.NVarChar, 50, "Name"); da.UpdateCommand.Parameters.Add("@ID", SqlDbType.Int, 4, ds.Tables[0].Columns[0].ColumnName); da.UpdateBatchSize = 10000; res = da.Update(ds.Tables[0]); ds.AcceptChanges(); tran.Commit(); sqlconn.Close(); } catch { tran.Rollback(); return -1; } } return res; } } ds 数据集其实也就相当于表了遍历效率太低,最简单的方式就是按格式存储在文件中。。用SQLServer的导入导出文本文件即可。。效率高,速度快。参考:http://www.360doc.com/content/10/0427/12/114824_25102588.shtml #region 批量插入 /// <summary> /// 将DataTable中数据批量插入远程服务器的数据表中 /// </summary> /// <param name="dt">源数据集</param> /// <param name="Conn">目标服务器的数据连接字符串</param> /// <param name="FieldStr">要插入的字段</param> /// <param name="TableName">目标服务器的表名</param> //protected void SqlBulkCopyData(DataTable dt, string Conn, string[] FieldStr, String TableName) //{ // //使用SqlBulkCopy把内存表DataTable里的数据插入答卷数据表 // SqlBulkCopy bcp = new SqlBulkCopy(Conn); // //指定目标数据库的表名 // bcp.DestinationTableName = TableName; // //指定源列和目标列 // foreach (string field in FieldStr) // { // bcp.ColumnMappings.Add(field, field); // } // //写入数据库表 // bcp.WriteToServer(dt); // bcp.Close(); //} #endregion 如果你的Dataset的数据很多,那不肯能每条数据都需要更新吧,你应该只更新那些修改的数据 关于winform窗体中webBrowser控件 求单机机器码验证程序 asp.net中的dropdownlist问题 c#中更新ACCESS数据库的问题 如何在winform下使用这个存储过程? 怎么子窗体中直接刷新父窗体的DataGrid控件里面的数据,这个问题问了很多次了,但是没有好的答案。 关于VS和SQL的问题安装(希望有经验的大哥指点) 誰能提供 winfrom 登陸代碼 开发自定义控件的问题 关于MSCHART的问题,急,请高手帮忙 自学菜鸟求助:直接插入排序该如何理解? imagelist图片失真
[WebMethod(Description = "Update服务提供的方法,将包含修改后数据的DateSet与本地数据库同步更新,成功返回更新的行数,失败返回-1。"), SoapHeader("currentUser")]
public int Update(DataSet ds)
{
if (!ValidateUser(currentUser.UserName, currentUser.UserPass))
{
return -1;
}
else
{
int res = 0;
using (SqlConnection sqlconn = new SqlConnection("Data Source=.;Initial Catalog=xxxx;User ID=sa;Password=sa"))
{
sqlconn.Open();
/ / //使用加强读写锁事务
SqlTransaction tran = sqlconn.BeginTransaction(IsolationLevel.ReadCommitted);
try
{
foreach (DataRow dr in ds.Tables[0].Rows)
{
//所有行设为修改状态
dr.SetModified();
}
//为Adapter定位目标表
SqlCommand cmd = new SqlCommand(string.Format("select * from {0} where 1=0 ", ds.Tables[0].TableName), sqlconn, tran);
SqlDataAdapter da = new SqlDataAdapter(cmd);
SqlCommandBuilder sqlCmdBuilder = new SqlCommandBuilder(da);
da.AcceptChangesDuringUpdate = false;
SqlCommand updatecmd = new SqlCommand(string.Format(" UPDATE [{0}] SET [Name] = @Name WHERE ([ID] = @ID) ", ds.Tables[0].TableName));
//不修改源DataTable
updatecmd.UpdatedRowSource = UpdateRowSource.None;
da.UpdateCommand = updatecmd;
da.UpdateCommand.Parameters.Add("@Name", SqlDbType.NVarChar, 50, "Name");
da.UpdateCommand.Parameters.Add("@ID", SqlDbType.Int, 4, ds.Tables[0].Columns[0].ColumnName);
da.UpdateBatchSize = 10000;
res = da.Update(ds.Tables[0]);
ds.AcceptChanges();
tran.Commit();
sqlconn.Close();
}
catch
{
tran.Rollback();
return -1;
}
}
return res;
}
}
遍历效率太低,最简单的方式就是按格式存储在文件中。。
用SQLServer的导入导出文本文件即可。。效率高,速度快。参考:
http://www.360doc.com/content/10/0427/12/114824_25102588.shtml
#region 批量插入
/// <summary>
/// 将DataTable中数据批量插入远程服务器的数据表中
/// </summary>
/// <param name="dt">源数据集</param>
/// <param name="Conn">目标服务器的数据连接字符串</param>
/// <param name="FieldStr">要插入的字段</param>
/// <param name="TableName">目标服务器的表名</param>
//protected void SqlBulkCopyData(DataTable dt, string Conn, string[] FieldStr, String TableName)
//{
// //使用SqlBulkCopy把内存表DataTable里的数据插入答卷数据表
// SqlBulkCopy bcp = new SqlBulkCopy(Conn); // //指定目标数据库的表名
// bcp.DestinationTableName = TableName; // //指定源列和目标列
// foreach (string field in FieldStr)
// {
// bcp.ColumnMappings.Add(field, field);
// }
// //写入数据库表
// bcp.WriteToServer(dt); // bcp.Close(); //} #endregion