Microsoft SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表既可以在同一个服务器上,也可以在不同服务器上)。 SqlBulkCopy 类允许编写提供类似功能的托管代码解决方案。 还有其他将数据加载到 SQL Server 表的方法(例如 INSERT 语句),但相比之下 SqlBulkCopy 提供明显的性能优势。
使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。 但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据。
当把 SqlDateTime 类型的 DataTable 列批量加载到类型为 SQL Server 2008 中新增的日期/时间类型的 SQL Server 列时,SqlBulkCopy 将失败。
public static VendorItemLastCostList BatchAddVendorItemLastCost(VendorItemLastCostList request)
{
if (request != null && request.VendorItemLastCostLists != null)
{
DateTime dt = DateTime.Now;
DataTable table = new DataTable();
table.TableName = "VendorItemLastCostForUpload";
// table.Columns.Add(new DataColumn("TransactionNumber", typeof(Int32)));
table.Columns.Add(new DataColumn("VendorNumber", typeof(String)));
table.Columns.Add(new DataColumn("ItemNumber", typeof(String)));
table.Columns.Add(new DataColumn("CurrencyCode", typeof(String)));
table.Columns.Add(new DataColumn("LastCost", typeof(Decimal)));
table.Columns.Add(new DataColumn("InUser", typeof(String)));
table.Columns.Add(new DataColumn("Indate", typeof(DateTime)));
foreach (var item in request.VendorItemLastCostLists)
{
DataRow dr= table.NewRow();
dr["VendorNumber"] = item.VendorNumber;
dr["ItemNumber"] = item.ItemNumber;
dr["CurrencyCode"] = item.CurrencyCode;
dr["LastCost"] = item.LastCost;
dr["InUser"] = item.LoginName;
dr["Indate"] = dt.ToString("yyyy-MM-dd HH:mm:ss") ;
table.Rows.Add(dr);
}
string conn = @"";
//使用SqlBulkCopyOptions.UseInternalTransaction是指迁移动作指定在一个Transaction当中,如果数据迁移中产生错误或异常将发生回滚。
using (SqlBulkCopy bcp=new SqlBulkCopy(conn,SqlBulkCopyOptions.UseInternalTransaction))
{
try
{
//DB TableName
bcp.DestinationTableName = "VendorItemLastCostForUpload";
bcp.BulkCopyTimeout = 120;
//Memeory DataTable ColumnName mapping DB table column name
bcp.ColumnMappings.Add("VendorNumber", "VendorNumber");
bcp.ColumnMappings.Add("ItemNumber", "ItemNumber");
bcp.ColumnMappings.Add("CurrencyCode", "CurrencyCode");
bcp.ColumnMappings.Add("LastCost", "LastCost");
bcp.ColumnMappings.Add("InUser", "InUser");
bcp.ColumnMappings.Add("Indate", "Indate");
bcp.WriteToServer(table);
bcp.Close();
request.IsSuccess = true;
}
catch (Exception ex)
{
Logger.WriteErrorLog(ex.Message);
}
finally
{
request.InDate = dt.ToString("yyyy-MM-dd HH:mm:ss");
}
}
}
return request;
}