Pages

2015-06-25

DbCommand.Prepare批次執行SQL

DbCommand.Prepare() 可以產生暫時性的Store Procedure,若有大量的資料需批次更新,會獲得比較好的效能。使用SQL Profiler查看,它會多了exec sp_prepexec指令,這就是產生一個暫存的SP,而後續的異動,就只是傳參數進去就好,不需要再傳完整的SQL Script. 須要注意的是DbParameter須要明確宣告型別,且資料長度得自己張羅,有被截斷不會回報錯誤。

如果 CommandType 屬性設定為 TableDirect,則 Prepare 不會執行任何動作略過。 如果 CommandType 設定為 StoredProcedure,對 Prepare 的呼叫應該會成功,但它可能不會執行任何作業。由於建立臨時性的SP也是需要成本,因此若筆數不多且SQL內容不複雜的話,就不需要使用Prepare()方式了。

cmd.CommandText = string.Format(@"
UPDATE [STR_StockSpec] SET
[SpecQty] = [SpecQty] + @BuyQty
WHERE SpecId = @SpecId
");

// 產生暫存Store Procedure,尚不會執行
cmd.Prepare();

// DbParameters
// DbCommand.Prepare method requires all parameters to have an explicitly set type.
var paramSpecId = DB.AddParameter(cmd, "@SpecId", 0, null, DbType.Int32);
var paramBuyQty = DB.AddParameter(cmd, "@BuyQty", 0, null, DbType.Int32);

foreach (var item in items)
{
paramSpecId.Value = item.SpecId;
paramBuyQty.Value = item.BuyQty;

// 執行SQL
cmd.ExecuteNonQuery();

}

No comments: