方法一:建立临时表进行数据更新和插入
Step1 创建临时表
/// <summary>
/// 创建临时表存储当前需要提交的数据
/// </summary>
/// <param name="databaseConnectionString">数据库连接字符串</param>
/// <param name="tableName">当前更新导入的表名</param>
/// <returns></returns>
public static string CreateTempTable(string databaseConnectionString, string tableName)
{
string tempTableName = string.Empty;
string sql = string.Empty;
//创建临时表存储当前需要提交的数据
for (int i = 0; i < 20; i++) //只是设定一个临时表的序号,如果是多台主机导入同一个数据库的时候,在数据库中可能会创建同名的临时表
{
sql = string.Format("SELECT * INTO {0} FROM {1} where 1=2", tableName + "_TEMP" + i, tableName);
try
{
ExecuteQuery(sql, databaseConnectionString);
tempTableName = tableName + "_TEMP" + i;
break;
}
catch //如果在创建当前的临时表的过程中发生了错误,如当前临时表已经存在或者被占用,则继续通过 序号i去创建下一张临时表,直到创建成功为止
{
continue;
}
}
return tempTableName;
}
Step2 临时表和数据库数据进行对比,提取数据库表中不存在的数据,然后插入当前数据库表中不存在的数据
/// <summary>
/// 将临时表和当前需要更新的表的数据进行对比,根据表内的唯一标识提取出在当前表中不存在的数据,然后批量插入新增的数据
/// </summary>
/// <param name="databaseConnectionString">数据库连接字符串</param>
/// /// <param name="dt">更新需要提交数据的datatable</param>
/// <param name="tableName">当前更新导入的表名</param>
/// <param name="tempTableName">临时表表名</param>
/// <returns></returns>
public static string GetUpdateData(string databaseConnectionString, DataTable dt, string tableName, string tempTableName)
{
string errMess = string.Empty;
try
{
string sql = string.Empty;
string found = string.Empty;
List<string> keyList = new List<string>();
//提取需要批量插入的数据的唯一标识列表
sql = string.Format("select key from {0} except select key from {1}", tempTableName, tableName);
found = string.Format("key= '{0}'", "@key"); //生成在当前的datatable查找的语句,key为查找的关键字,当前使用@key来代替所需的关键字
#region 批量插入数据库中不存在的数据
keyList = new List<string>(); //用于存储当前查询的唯一标识中在临时表中存在而在数据库表中不存在的数据列表
keyList = GetSqlAsString(sql, null, databaseConnectionString);
DataTable appendData = dt.Clone();
for (int i = 0; i < keyList.Count; i++)
{
DataRow[] dr = dt.Select(found.Replace("@key", keyList[i]));
foreach (var row in dr)
{
appendData.ImportRow(row);
}
}
SqlBulkCopyByDatatable(databaseConnectionString, tableName, appendData);
#endregion
return errMess;
}
catch (Exception ex)
{
errMess = ex.Message;
return errMess;
}
}
Step3 根据临时表更新当前导入表的数据
/// <summary>
/// 根据临时表更新当前导入表的数据
/// </summary>
/// <param name="databaseConnectionString">数据库连接字符串</param>
/// <param name="tableName">当前更新导入的表名</param>
/// <pa