批量更新有两种策略:
第一种方式:拼接所有更新字符串,在数据库一次性执行,这样减少数据更新时频繁的连接断开数据库。
第二种方式:把要更新的数据写入数据库全局临时表,然后利用sql语句更新,最后把原表中不存在的数据获取到再批量写入。
以下是第二种方式的实现。
该方式中有投机取巧的嫌疑,但是确实能对在单机大批量更新的操作有很大帮助。
1、tableName是要更新数据库的名称。
2、dataTable是以DataTable结构的数据,和被更新的数据表结构一致。
3、IDName更新依据,即当ID或name相同时更新其余项。
4、Connection数据库连接字符串。
5、本函数有很多写的不完善的地方,可以自己修改或按照思路重写。
/// <summary>
/// 批量更新函数
/// </summary>
/// <param name="tableName">被更新表表名</param>
/// <param name="dataTable">更新数据库表新数据</param>
/// <param name="IDName">更新依据</param>
/// <param name="Connection">数据库连接字符串</param>
static public void SqlBulkUpdate(string tableName, DataTable dataTable, string IDName, string Connection)
{
try
{
using (SqlConnection connection = new SqlConnection(Connection))
{
try
{
connection.Open();
string TempTableName = String.Format("##TempTable{0}", DateTime.Today.ToString("yyyyMMddhhmmss"));
string temp = String.Format("select * into {0} from {1} where 1 = 2;", TempTableName, tableName);
SqlCommand command = new SqlCommand(temp, connection);
command.ExecuteNonQuery();
command.Dispose();
SqlBulkCopyByDatatable(Connection,TempTableName, dataTable);
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.AppendFormat("update {0} set ", tableName);
for (int i = 0; i < dataTable.Columns.Count; i++)
{
stringBuilder.AppendFormat(" {0}." + dataTable.Columns[i].ColumnName + " = {1}." + dataTable.Columns[i].ColumnName + ", ", tableName, TempTableName);
}
stringBuilder.Remove(stringBuilder.Length - 2, 1);
stringBuilder.AppendFormat(" from {0} where {1}.{2} = {0}.{2}", TempTableName, tableName, IDName);
SqlCommand command2 = new SqlCommand(stringBuilder.ToString(), connection);
command2.ExecuteNonQuery();
command2.Dispose();
string insertStr = String.Format("select * from {0} as A where A.{2} not in (select B.{2} from {1} as B)", TempTableName, tableName, IDName);
DataSet insertSet = ExecDataSet(Connection,insertStr);
if (insertSet.Tables[0].Rows.Count > 0)
{
SqlBulkCopyByDatatable(Connection,tableName, insertSet.Tables[0]);
}
connection.Close();
connection.Dispose();
}
catch (Exception e)
{
//数据批量更新出错
connection.Close();
connection.Dispose();
}
}
}
catch (Exception e)
{//数据批量更新出错
}
}