在SQL Server 中插入一條數據使用Insert語句,但是如果想要批量插入一堆數據的話,迴圈使用Insert不僅效率低,而且會導致SQL一系統性能問題。下麵介紹SQL Server支持的兩種批量數據插入方法:Bulk和表值參數(Table-Valued Parameters)。 bulk方法 ...
在SQL Server 中插入一條數據使用Insert語句,但是如果想要批量插入一堆數據的話,迴圈使用Insert不僅效率低,而且會導致SQL一系統性能問題。下麵介紹SQL Server支持的兩種批量數據插入方法:Bulk和表值參數(Table-Valued Parameters)。
-
bulk方法 主要思想是通過在客戶端把數據都緩存在Table中,然後利用SqlBulkCopy一次性把Table中的數據插入到資料庫。
代碼如下:
public static void BulkToDB(DataTable dt) //將DataTable 數據批量插入到數據表
{
SqlConnection sqlConn = new SqlConnection(
ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);
SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn);
bulkCopy.DestinationTableName = "BulkTestTable"; //數據表名字
bulkCopy.BatchSize = dt.Rows.Count;
for (int i = 0; i < dt.Columns.Count; i++)//插入的數據列名和資料庫表欄位映射
{
bulkCopy.ColumnMappings.Add(dt.Columns[i].ToString(), dt.Columns[i].ToString());
}
try {
sqlConn.Open();
if (dt != null && dt.Rows.Count != 0)
bulkCopy.WriteToServer(dt);
} catch (Exception ex) {
throw ex;
}
finally
{
sqlConn.Close();
if (bulkCopy != null)
bulkCopy.Close();
}
}
-
表值參數(Table-Valued Parameters)。表值參數是SQL Server 2008新特性,簡稱TVPs
代碼如下:
public static void TableValuedToDB(DataTable dt) //將DataTable 數據批量插入到數據表
{
SqlConnection sqlConn = new SqlConnection(
ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);
const string TSqlStatement =
"insert into BulkTestTable (Id,UserName,Pwd)" +
" SELECT nc.Id, nc.UserName,nc.Pwd" +
" FROM @NewBulkTestTvp AS nc";
SqlCommand cmd = new SqlCommand(TSqlStatement, sqlConn);
SqlParameter catParam = cmd.Parameters.AddWithValue("@NewBulkTestTvp", dt);
catParam.SqlDbType = SqlDbType.Structured;
//表值參數的名字叫BulkUdt,在上面的建立測試環境的SQL中有。
catParam.TypeName = "dbo.BulkUdt";
try
{
sqlConn.Open();
if (dt != null && dt.Rows.Count != 0)
{
cmd.ExecuteNonQuery();
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
sqlConn.Close();
}
}
/*創建表值參數類型 */
CREATE TYPE BulkUdt AS TABLE ( LocationName VARCHAR(50) , CostRate INT );// 這裡面的欄位跟 要批量插入數據的數據表欄位一致即可。
這兩種方法可以批量將數據插入SQlSERVER ,後者的速度比前者快些。