需求:讀取傳入的DataSet,將DataSet裏的DataTable插入數據庫
分析:
1.數據量大,不推薦循環sql insert
2.多表操作,事務
/// <summary>
/// 添加數據
/// </summary>
/// <returns></returns>
public static void AddTaxInfo(DataSet infoSet)
{
using (var conn = new SqlConnection(_connectionString))
{
conn.Open();
SqlTransaction sqlbulkTransaction = conn.BeginTransaction();
try
{
//插入主表
using (var bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, sqlbulkTransaction))
{
var table_Main = infoSet.Tables["Core_TaxMain"];
foreach (DataColumn dc in table_Main.Columns)
{
bulkCopy.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);
}
bulkCopy.DestinationTableName = "Core_TaxMain";
//複製Table
bulkCopy.WriteToServer(table_Main);
}
//插入系表
using (var bulkCopy_ = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, sqlbulkTransaction))
{
var table_Detail = infoSet.Tables["Core_TaxDetail"];
foreach (DataColumn dc in table_Detail.Columns)
{
bulkCopy_.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);
}
bulkCopy_.DestinationTableName = "Core_TaxDetail";
bulkCopy_.WriteToServer(table_Detail);
}
//一個事務
sqlbulkTransaction.Commit();
}
catch (Exception)
{
sqlbulkTransaction.Rollback();
throw;
}
}
}
改進:上面的方法完全能夠滿足需求,只是創建bulkcopy對象顯得重複,於是把數據庫連接對象封裝了一下。
封裝好的類將寫在另一篇博客裏自己寫的數據庫工具類,這裏直接調用:
public static void AddTaxInfo(DataSet infoSet)
{
var table_Main = infoSet.Tables["Core_TaxMain"];//主表
var table_Detail = infoSet.Tables["Core_TaxDetail"];//系表
using (SqlAccess client = new SqlAccess(_connectionString))//SqlAcess是封裝類,類似SqlHelper
{
client.BeginTransaction();
foreach (DataColumn dc in table_Main.Columns)
{
client.BulkCopyColumnMapping.Add(dc.ColumnName, dc.ColumnName);
}
client.SetBulkCopy("a").WriteToServer(table_Main);
foreach (DataColumn dc in table_Detail.Columns)
{
client.BulkCopyColumnMapping.Add(dc.ColumnName, dc.ColumnName);
}
client.SetBulkCopy("b").WriteToServer(table_Detail);
client.Commit();
}