C# DataTable 批量数据处理 增、删、改
2016-04-16 16:14
543 查看
1.批量新增,采用高效的SqlBulkCopy
[csharp]
view plain
copy
print?
using (SqlBulkCopy sbc = new SqlBulkCopy(db.ConnectionString))
{
sbc.DestinationTableName = dataTable.TableName;
sbc.BatchSize = dataTable.Rows.Count;
sbc.BulkCopyTimeout = 300;
sbc.WriteToServer(dataTable);
}
2.批量新增、修改、删除,采用SqlDataAdapter,如下代码段可根据DataTable.RowState (关于RowState参考我的另一篇文章介绍)状态进行新增及删除,
但是发现 批量修改不好使,具体看第3点
[csharp]
view plain
copy
print?
SqlConnection conn = new SqlConnection(strConnection));
SqlCommand myCommand = new SqlCommand("select * from "+strTblName+" where 1=2"),(SqlConnection) conn);
SqlDataAdapter myAdapter = new SqlDataAdapter(myCommand );
SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);
myAdapter.InsertCommand = myCommandBuilder .GetInsertCommand();
myAdapter.UpdateCommand = myCommandBuilder .GetUpdateCommand();
myAdapter.DeleteCommand = myCommandBuilder .GetDeleteCommand();
try
{
lock(this) //处理并发情况(分布式情况)
{
conn.Open();
myAdapter.Update(ds,strTblName);
conn.Close();
}
3.解决SqlDataAdapter.update 无法批量修改的问题
[csharp]
view plain
copy
print?
DataSet ds = new DataSet();
ds.Tables.Add(table);
string _tableName = table.TableName;
int result = 0;
using (SqlConnection sqlconn = new SqlConnection(db.ConnectionString))
{
sqlconn.Open();
//使用加强读写锁事务
SqlTransaction tran = sqlconn.BeginTransaction(IsolationLevel.ReadCommitted);
try
{
ds.Tables[0].AcceptChanges();
foreach (DataRow dr in ds.Tables[0].Rows)
{
//所有行设为修改状态
dr.SetModified();
}
//为Adapter定位目标表
SqlCommand cmd = new SqlCommand(string.Format("select * from {0} where {1}", _tableName, " 1=2"), sqlconn, tran);
SqlDataAdapter da = new SqlDataAdapter(cmd);
SqlCommandBuilder sqlCmdBuilder = new SqlCommandBuilder(da);
sqlCmdBuilder.ConflictOption = ConflictOption.OverwriteChanges;
da.AcceptChangesDuringUpdate = false;
string columnsUpdateSql = "";
SqlParameter[] paras = new SqlParameter[table.Columns.Count];
int parasIndex = 0;
//需要更新的列设置参数是,参数名为"@+列名"
for (int i = 0; i < table.Columns.Count; i++)
{
//此处拼接要更新的列名及其参数值
columnsUpdateSql += ("[" + table.Columns[i].ColumnName + "]" + "=@" + table.Columns[i].ColumnName + ",");
if (table.Columns[i].DataType.Name == "DateTime")
{
paras[i] = new SqlParameter("@" + table.Columns[i].ColumnName, SqlDbType.DateTime, 23, table.Columns[i].ColumnName);
}
else if (table.Columns[i].DataType.Name == "Int64")
{
paras[i] = new SqlParameter("@" + table.Columns[i].ColumnName, SqlDbType.NVarChar, 19, table.Columns[i].ColumnName);
}
else
{
paras[i] = new SqlParameter("@" + table.Columns[i].ColumnName, SqlDbType.NVarChar, 2000, table.Columns[i].ColumnName);
}
}
if (!string.IsNullOrEmpty(columnsUpdateSql))
{
//此处去掉拼接处最后一个","
columnsUpdateSql = columnsUpdateSql.Remove(columnsUpdateSql.Length - 1);
}
//此处生成where条件语句
string limitSql = ("[" + table.Columns[0].ColumnName + "]" + "=@" + table.Columns[0].ColumnName);
SqlCommand updateCmd = new SqlCommand(string.Format(" UPDATE [{0}] SET {1} WHERE {2} ", _tableName, columnsUpdateSql, limitSql));
//不修改源DataTable
updateCmd.UpdatedRowSource = UpdateRowSource.None;
da.UpdateCommand = updateCmd;
da.UpdateCommand.Parameters.AddRange(paras);
//da.UpdateCommand.Parameters.Add("@" + table.Columns[0].ColumnName, table.Columns[0].ColumnName);
//每次往返处理的行数
da.UpdateBatchSize = table.Rows.Count;
result = da.Update(ds, _tableName);
ds.AcceptChanges();
tran.Commit();
}
catch(Exception ex)
{
tran.Rollback();
throw ex;
}
finally
{
sqlconn.Dispose();
sqlconn.Close();
}
}
[csharp]
view plain
copy
print?
using (SqlBulkCopy sbc = new SqlBulkCopy(db.ConnectionString))
{
sbc.DestinationTableName = dataTable.TableName;
sbc.BatchSize = dataTable.Rows.Count;
sbc.BulkCopyTimeout = 300;
sbc.WriteToServer(dataTable);
}
2.批量新增、修改、删除,采用SqlDataAdapter,如下代码段可根据DataTable.RowState (关于RowState参考我的另一篇文章介绍)状态进行新增及删除,
但是发现 批量修改不好使,具体看第3点
[csharp]
view plain
copy
print?
SqlConnection conn = new SqlConnection(strConnection));
SqlCommand myCommand = new SqlCommand("select * from "+strTblName+" where 1=2"),(SqlConnection) conn);
SqlDataAdapter myAdapter = new SqlDataAdapter(myCommand );
SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);
myAdapter.InsertCommand = myCommandBuilder .GetInsertCommand();
myAdapter.UpdateCommand = myCommandBuilder .GetUpdateCommand();
myAdapter.DeleteCommand = myCommandBuilder .GetDeleteCommand();
try
{
lock(this) //处理并发情况(分布式情况)
{
conn.Open();
myAdapter.Update(ds,strTblName);
conn.Close();
}
3.解决SqlDataAdapter.update 无法批量修改的问题
[csharp]
view plain
copy
print?
DataSet ds = new DataSet();
ds.Tables.Add(table);
string _tableName = table.TableName;
int result = 0;
using (SqlConnection sqlconn = new SqlConnection(db.ConnectionString))
{
sqlconn.Open();
//使用加强读写锁事务
SqlTransaction tran = sqlconn.BeginTransaction(IsolationLevel.ReadCommitted);
try
{
ds.Tables[0].AcceptChanges();
foreach (DataRow dr in ds.Tables[0].Rows)
{
//所有行设为修改状态
dr.SetModified();
}
//为Adapter定位目标表
SqlCommand cmd = new SqlCommand(string.Format("select * from {0} where {1}", _tableName, " 1=2"), sqlconn, tran);
SqlDataAdapter da = new SqlDataAdapter(cmd);
SqlCommandBuilder sqlCmdBuilder = new SqlCommandBuilder(da);
sqlCmdBuilder.ConflictOption = ConflictOption.OverwriteChanges;
da.AcceptChangesDuringUpdate = false;
string columnsUpdateSql = "";
SqlParameter[] paras = new SqlParameter[table.Columns.Count];
int parasIndex = 0;
//需要更新的列设置参数是,参数名为"@+列名"
for (int i = 0; i < table.Columns.Count; i++)
{
//此处拼接要更新的列名及其参数值
columnsUpdateSql += ("[" + table.Columns[i].ColumnName + "]" + "=@" + table.Columns[i].ColumnName + ",");
if (table.Columns[i].DataType.Name == "DateTime")
{
paras[i] = new SqlParameter("@" + table.Columns[i].ColumnName, SqlDbType.DateTime, 23, table.Columns[i].ColumnName);
}
else if (table.Columns[i].DataType.Name == "Int64")
{
paras[i] = new SqlParameter("@" + table.Columns[i].ColumnName, SqlDbType.NVarChar, 19, table.Columns[i].ColumnName);
}
else
{
paras[i] = new SqlParameter("@" + table.Columns[i].ColumnName, SqlDbType.NVarChar, 2000, table.Columns[i].ColumnName);
}
}
if (!string.IsNullOrEmpty(columnsUpdateSql))
{
//此处去掉拼接处最后一个","
columnsUpdateSql = columnsUpdateSql.Remove(columnsUpdateSql.Length - 1);
}
//此处生成where条件语句
string limitSql = ("[" + table.Columns[0].ColumnName + "]" + "=@" + table.Columns[0].ColumnName);
SqlCommand updateCmd = new SqlCommand(string.Format(" UPDATE [{0}] SET {1} WHERE {2} ", _tableName, columnsUpdateSql, limitSql));
//不修改源DataTable
updateCmd.UpdatedRowSource = UpdateRowSource.None;
da.UpdateCommand = updateCmd;
da.UpdateCommand.Parameters.AddRange(paras);
//da.UpdateCommand.Parameters.Add("@" + table.Columns[0].ColumnName, table.Columns[0].ColumnName);
//每次往返处理的行数
da.UpdateBatchSize = table.Rows.Count;
result = da.Update(ds, _tableName);
ds.AcceptChanges();
tran.Commit();
}
catch(Exception ex)
{
tran.Rollback();
throw ex;
}
finally
{
sqlconn.Dispose();
sqlconn.Close();
}
}
相关文章推荐
- c#委托和事件的介绍
- 关于C# 写Windows服务程序
- C#一般处理程序设置和读取session(session报错“未将对象引用设置到对象的实例”解决)
- C#使用ICSharpCode.SharpZipLib压缩后进行web批量下载文件
- c# 正则表达式
- C#反射操作工具类
- C#之线程和并发
- 将C#文档注释生成.chm帮助文档
- C# 反射功能
- C#匿名方法和Lambda表达式
- C#第五次上机
- LeetCode #9 Palindrome Number C# Solution
- LeetCode #8 String to Integer (ATOI) C# Solution
- LeetCode #7 Reverse Integer C# Solution
- LeetCode #6 ZigZag Conversion C# Solution
- default 关键字泛型代码中的默认关键字(C# 编程指南)
- C#实现软件开机自启动原理与代码
- C#编程基础笔记-FileDialog
- C#一般处理程序设置和读取session(session报错未将对象引用设置到对象的实例解决)
- .NET设计模式(1):1.1 单例模式(Singleton Pattern)