摘要在上一篇文章《你必須知道的ADO.NET(六) 談?wù)凜ommand對象與數(shù)據(jù)檢索》中,我詳細講解了Command對象的基礎(chǔ)知識以及基本用法。作為ADO.NET中最具執(zhí)行力的對象,Command對象實屬變幻莫測。在本文中,我將與大家一起探討Command對象的高級應(yīng)用與技巧。 目錄1. 異步執(zhí)行命令在ADO.NET 2.0版本之前,執(zhí)行Command對象命令時,需要等待命令完成才能執(zhí)行其他操作。比如,執(zhí)行ExcuteNonQuery()方法,應(yīng)用程序?qū)3肿枞?,直到?shù)據(jù)操作成功完成或者異常終止以及連接超時。在ADO.NET 2.0版本引入異步執(zhí)行特性,顯然,ADO.NET更穩(wěn)健,更完美了。 異步執(zhí)行的根本思想是,在執(zhí)行命令操作時,無需等待命令操作完成,可以并發(fā)的處理其他操作。ADO.NET提供了豐富的方法來處理異步操作,BeginExecuteNonQuery和EndExcuteNonQuery就是一對典型的為異步操作服務(wù)的方法。BeginExecuteNonQuery方法返回System.IAsyncResult接口對象。我們可以根據(jù)IAsyncResult的IsCompleted屬性來輪詢(檢測)命令是否執(zhí)行完成。還是來看一個簡單的實例把!這個實例采用了《你必須知道的ADO.NET(六) 談?wù)凜omand對象與數(shù)據(jù)檢索》中的數(shù)據(jù)庫和數(shù)據(jù)表。在這個實例中,我們將在tb_SelCustomer中插入500行數(shù)據(jù),并計算執(zhí)行時間。代碼如下: View Code
處理結(jié)果如下:
2. 請使用參數(shù)化查詢在ADO.NET中,查詢語句是以字符串的形式傳遞給外部數(shù)據(jù)庫服務(wù)器的。這些字符串不僅包含了基本命令關(guān)鍵字,操作符,還包含了限制查詢的數(shù)值。與其他編程語言不同,.NET是基于強類型來管理查詢字符串數(shù)據(jù)的。通過提供類型檢查和驗證,命令對象可使用參數(shù)來將值傳遞給 SQL 語句或存儲過程。 與命令文本不同,參數(shù)輸入被視為文本值,而不是可執(zhí)行代碼。 這樣可幫助抵御“SQL 注入”攻擊,這種攻擊的攻擊者會將命令插入 SQL 語句,從而危及服務(wù)器的安全。參數(shù)化命令還可提高查詢執(zhí)行性能,因為它們可幫助數(shù)據(jù)庫服務(wù)器將傳入命令與適當?shù)木彺娌樵冇媱澾M行準確匹配。 對于不同的數(shù)據(jù)源來說,Parameter對象不同,但都派生自DbParameter對象。下表列舉了不同數(shù)據(jù)源對應(yīng)的Parameter對象。
Paramter對象的屬性很多,其中常見而且非常重要的主要有以下幾個:
以SQL Server為例,SqlCommand對象包含一個Paramters集合,Paramters集合中包含了所有所需的SqlParamter對象。當執(zhí)行命令時,ADO.NET同時將SQL文本,占位符和參數(shù)集合傳遞給數(shù)據(jù)庫。
下面我們看一個實例,修改 測試顧客1 的基本信息。修改的基本信息如下:
代碼如下: View Code
看了上面的代碼不知大家有何感想,是否覺得太多繁瑣呢?的確,我們可以用更簡潔的方法來實現(xiàn)。具體方法是,我們可以先構(gòu)造Parameter對象數(shù)組,然后遍歷添加到Command對象的Paramters集合中。代碼如下: View Code
上面兩種寫法,結(jié)果完全相同。查詢數(shù)據(jù)庫,我們可以得到以下結(jié)果:
3. 如何獲取插入行的ID?很多時候,我們需要知道插入行的ID是多少,以方便我們進行利用插入行的ID進行其他操作,比如在頁面上的展示等等。當然實現(xiàn)的方法有很多種,比如利用C#的out修飾符修飾參數(shù),我更傾向于用SQL Server數(shù)據(jù)庫原生的OUTPUT關(guān)鍵字。OUTPUT關(guān)鍵字返回INSERT操作的一個字段(一般是主鍵ID)。因此我們只要結(jié)合OUTPUT關(guān)鍵字以及ExecuteScalar方法,就很容易得到插入行的主鍵。還是看一個簡單的實例把!我們在tb_SelCustomer中插入一個新的顧客,并返回這個顧客的ID。代碼如下: View Code
運行結(jié)果如下:
4. 總結(jié)簡言之,Command對象的核心作用是執(zhí)行命令。在執(zhí)行命令過程中,面臨的情況是十分復(fù)雜的。盡管如此,Command對象擁有優(yōu)越的人力資源(屬性和方法),來應(yīng)對一切可能發(fā)生的事??梢哉f,Command對象的穩(wěn)定發(fā)揮,為ADO.NET打下了扎實的根基。到目前為止,我們基本上了解ADO.NET DataProvider組件所有的內(nèi)容。因此,后面我將重點講述ADO.NET的心臟----DataSet以及如何將數(shù)據(jù)源本地化。另外,我非常期待能得到您的推薦和關(guān)注。
|
|