描述ADO .NET命令影響數(shù)據(jù)源說明
通過ADO .NET中瀏覽數(shù)據(jù)的方式并不是在ADO .NET命令中的方式,你仍需要?jiǎng)?chuàng)建鏈接,發(fā)送命令。在本文中,提到了表示直接SQL命令的類,你可以使用它們執(zhí)行存儲(chǔ)過程。
你應(yīng)當(dāng)將存儲(chǔ)過程的名字指定為SqlCommand對象的命令文本。命令文本可以通過SqlCommand的構(gòu)造函數(shù)或通過CommandText屬性指定。在下面的示例代碼中,存儲(chǔ)過程的名字是byroyalty。
為幫助SqlCommand辨認(rèn)出將執(zhí)行的命令是一個(gè)存儲(chǔ)過程,應(yīng)當(dāng)將CommandType屬性設(shè)置為特定的值。
- SqlCommand cmd = new SqlCommand("byroyalty", conn);
- cmd.CommandType = CommandType.StoredProcedure;
- SqlParameter par = new SqlParameter("@percentage", SqlDbType.Int);
- par.Direction = ParameterDirection.Input;
- par.Value = 15;
- cmd.Parameters.Add(par);
- SqlDataReader dr = cmd.ExecuteReader();
它是在CommandType枚舉值(即可以在ADO .NET命令中使用的所有可以得到的命令類型)中的一個(gè)值。存儲(chǔ)過程可能需要一個(gè)或多個(gè)參數(shù)才能運(yùn)行。在這種情況下,你需要使用SqlParameter類定義參數(shù)。
參數(shù)具有@前綴名,并是與SQL Server兼容的類型。另外,它還要有一個(gè)方向:輸入,輸出還是兩種都有,當(dāng)然它得是一個(gè)值。.NET 類型系統(tǒng)不同于SQL Server類型系統(tǒng),你必須求助于SqlDbType枚舉列表得到正確的類型。例如,下面的片斷對.NET32位整型求值。
一條命令在過一定時(shí)間后就會(huì)超時(shí)。如果你知道要經(jīng)過很長的操作,你就可能希望設(shè)置這種限制。象ADO中那樣,檢查的屬性是CommandTimeout,其默認(rèn)值是30秒。與ADO不同,ADO .NET使你可通過CommandBehavior枚舉指定命令的期望行為。
這樣的值指定了對結(jié)果的描述,并指定查詢?nèi)绾斡绊憯?shù)據(jù)源。在β1版本中,可以為每個(gè)命令設(shè)置CommandBehavior屬性。從β2版開始,只能使用CommandBehavior枚舉值作為ExecuteReader的參數(shù)。
對于其它選項(xiàng),你可以使用查詢命令限制獲得的關(guān)鍵字和結(jié)構(gòu)信息。在這種情況下,命令執(zhí)行時(shí)不會(huì)對選擇的行進(jìn)行鎖定。這種行為是由KeyInfo標(biāo)記設(shè)定的。作為可選項(xiàng),可能只需得到列信息,而不通過加鎖影響數(shù)據(jù)庫的狀態(tài)。這個(gè)選項(xiàng)是SchemaOnly。
另一個(gè)選項(xiàng),SingleResult,使你能夠指定只返回一個(gè)結(jié)果集,而不論命令可以得到多少個(gè)結(jié)果集。在這種情況下,命令只返回找到的***個(gè)結(jié)果集。第四個(gè)選項(xiàng)是CloseConnection,它強(qiáng)迫SqlDataReader對象與一個(gè)查詢命令聯(lián)結(jié)起來,以期望在Close方法的***一步自動(dòng)關(guān)閉鏈接。#t#
先前提到過,在ADO .NET命令中不支持服務(wù)器指針。如果需要使用服務(wù)器指針,并且負(fù)擔(dān)不起在沒有它的情況下重建應(yīng)用程序,唯一的辦法是通過ADO對象。要這樣做,需要導(dǎo)入ADODB類型庫,為不同的對象創(chuàng)建恰當(dāng)?shù)?NET封裝,然后與它們連接起來。然而,在這種情況下,你無法利用ADO .NET的優(yōu)勢。
這樣做原因很簡單。服務(wù)器指針必須與數(shù)據(jù)庫服務(wù)器的底層行為相適應(yīng)。當(dāng)處于鏈接時(shí),并不是所有的DBMS以同樣的方式工作。這樣不同特性的對數(shù)據(jù)庫不可知的實(shí)現(xiàn)已經(jīng)證明是非常困難的。為了避免出現(xiàn)更進(jìn)一步的問題,ADO .NET命令沒有為服務(wù)器指針暴露通用的類,從而從根本上消除了這種問題。
然而,用于SQL Server的管理提供者在將來的發(fā)行版中將支持服務(wù)器指針,其它類型的管理提供者也會(huì)發(fā)生同樣的事情。因此,ADO .NET對服務(wù)器指針支持的***回答是,它將提供支持,但是將通過其實(shí)現(xiàn)與底層工作方式非常匹配的類以一種嚴(yán)格的完全DBMS方式(提供支持)。