/// <summary>
/// 通用数据传输方法(采用SqlBulkCopy快速批量插入,然后再进行处理)
/// </summary>
/// <param name="sourceSelectSql"></param>
/// <param name="sourceConn"></param>
/// <param name="destTableName"></param>
/// <param name="destConn"></param>
/// <param name="colMapFunc"></param>
/// <param name="lastSaveAction"></param>
public
void
TransferBulkCopy(
string
sourceSelectSql, SqlConnection sourceConn,
string
destTableName, SqlConnection destConn, Func<DataTable, Dictionary<
string
,
string
>> colMapFunc,
Func<
string
, DataTable, SqlConnection, SqlConnection,
bool
> lastSaveAction,
bool
closeConnection =
true
)
{
DataTable srcTable =
new
DataTable();
SqlDataAdapter srcAdapter =
new
SqlDataAdapter(sourceSelectSql, sourceConn);
srcAdapter.AcceptChangesDuringUpdate =
false
;
SqlCommandBuilder srcCmdBuilder =
new
SqlCommandBuilder(srcAdapter);
srcAdapter.Fill(srcTable);
if
(srcTable !=
null
&& srcTable.Rows.Count > 0)
{
string
tempDestTableName =
"#temp_"
+ destTableName;
ClsDatabase.gExecCommand(destConn,
string
.Format(
"select top 0 * into {0} from {1}"
, tempDestTableName, destTableName),
false
);
List<
string
> mapDestColNameList =
new
List<
string
>();
using
(SqlBulkCopy sqlBulkCopy =
new
SqlBulkCopy(destConn))
{
sqlBulkCopy.DestinationTableName = tempDestTableName;
foreach
(
var
map
in
colMapFunc(srcTable))
{
sqlBulkCopy.ColumnMappings.Add(map.Key, map.Value);
mapDestColNameList.Add(map.Value);
}
sqlBulkCopy.WriteToServer(srcTable);
}
srcTable.ExtendedProperties.Add(MapDestColNames_String, mapDestColNameList);
bool
needUpdate = lastSaveAction(tempDestTableName, srcTable, destConn, sourceConn);
if
(needUpdate)
{
if
(srcTable.Columns.Contains(
"TranFlag"
))
{
foreach
(DataRow row
in
srcTable.Rows)
{
row[
"TranFlag"
] =
true
;
}
}
srcAdapter.Update(srcTable);
}
}
if
(closeConnection)
{
DisposeConnections(sourceConn, destConn);
}
}