簡(jiǎn)單介紹C# SQL Server
體驗(yàn)SQL語(yǔ)言的事務(wù)機(jī)制
作為大型的企業(yè)級(jí)數(shù)據(jù)庫(kù),C# SQL Server2000對(duì)事務(wù)提供了很好的支持。我們可以使用SQL語(yǔ)句來(lái)定義、提交以及回滾一個(gè)事務(wù)。
如下所示的SQL代碼定義了一個(gè)事務(wù),并且命名為"MyTransaction
這里用到了C# SQL Server2000自帶的示例數(shù)據(jù)庫(kù)pubs,提交事務(wù)后,將為所有暢銷(xiāo)計(jì)算機(jī)書(shū)籍支付的版稅增加 10%。
打開(kāi)C# SQL Server2000的查詢(xún)分析器,選擇pubs數(shù)據(jù)庫(kù),然后運(yùn)行這段程序,結(jié)果顯而易見(jiàn)。
可是如何在C#程序中運(yùn)行呢?我們記得在普通的SQL查詢(xún)中,一般需要把查詢(xún)語(yǔ)句賦值給SalCommand.CommandText屬性,這里也就像普通的SQL查詢(xún)語(yǔ)句一樣,將這些語(yǔ)句賦給SqlCommand.CommandText屬性即可。要注意的一點(diǎn)是,其中的"GO"語(yǔ)句標(biāo)志著SQL批處理的結(jié)束,編寫(xiě)SQL腳本是需要的,但是在這里是不必要的。我們可以編寫(xiě)如下的程序來(lái)驗(yàn)證這個(gè)想法:
- //TranSql.csusingSystem;
- usingSystem.Data;
- usingSystem.Data.SqlClient;
- namespaceAspcn
- {
- publicclassDbTranSql
- {
- file://將事務(wù)放到SQLServer中執(zhí)行
- publicvoidDoTran()
- {
- file://建立連接并打開(kāi)
- SqlConnectionmyConn=GetConn();myConn.Open();
- SqlCommandmyComm=newSqlCommand();
- try
- {
- myComm.Connection=myConn;
- myComm.CommandText="DECLARE@TranNameVARCHAR(20)";
- myComm.CommandText+="SELECT@TranName='MyTransaction'";
- myComm.CommandText+="BEGINTRANSACTION@TranName";
- myComm.CommandText+="USEpubs";
- myComm.CommandText+="UPDATEroyschedSETroyalty=royalty*1.10WHEREtitle_idLIKE'Pc%'";
- myComm.CommandText+="COMMITTRANSACTIONMyTransaction";
- myComm.ExecuteNonQuery();
- }
- catch(Exceptionerr)
- {
- thrownewApplicationException("事務(wù)操作出錯(cuò),系統(tǒng)信息:"+err.Message);
- }
- finally
- {
- myConn.Close();
- }
- }
- file://獲取數(shù)據(jù)連接
- privateSqlConnectionGetConn()
- {
- stringstrSql="DataSource=localhost;IntegratedSecurity=SSPI;userid=sa;password=";
- SqlConnectionmyConn=newSqlConnection(strSql);
- returnmyConn;
- }
- }
- publicclassTest
- {
- publicstaticvoidMain()
- {
- DbTranSqltranTest=newDbTranSql();
- tranTest.DoTran();
- Console.WriteLine("事務(wù)處理已經(jīng)成功完成。");
- Console.ReadLine();
- }
- }
- }
注意到其中的SqlCommand對(duì)象myComm,它的CommandText屬性?xún)H僅是前面SQL代碼字符串連接起來(lái)即可,當(dāng)然,其中的"GO"語(yǔ)句已經(jīng)全部去掉了。這個(gè)語(yǔ)句就像普通的查詢(xún)一樣,程序?qū)QL文本事實(shí)上提交給DBMS去處理了,然后接收返回的結(jié)果(如果有結(jié)果返回的話)。
很自然,我們最后看到了輸出"事務(wù)處理已經(jīng)成功完成",再用企業(yè)管理器查看pubs數(shù)據(jù)庫(kù)的roysched表,所有title_id字段以"PC"開(kāi)頭的書(shū)籍的royalty字段的值都增加了0.1倍。
這里,我們并沒(méi)有使用ADO.net的事務(wù)處理機(jī)制,而是簡(jiǎn)單地將執(zhí)行事務(wù)的SQL語(yǔ)句當(dāng)作普通的查詢(xún)來(lái)執(zhí)行,因此,事實(shí)上該事務(wù)完全沒(méi)有用到.net的相關(guān)特性。
了解.net中的事務(wù)機(jī)制
如你所知,在.net框架中主要有兩個(gè)命名空間(namespace)用于應(yīng)用程序同數(shù)據(jù)庫(kù)系統(tǒng)的交互:System.Data.SqlClient和System.Data.OleDb。前者專(zhuān)門(mén)用于連接Microsoft公司自己的SQL Server數(shù)據(jù)庫(kù),而后者可以適應(yīng)多種不同的數(shù)據(jù)庫(kù)。這兩個(gè)命名空間中都包含有專(zhuān)門(mén)用于管理數(shù)據(jù)庫(kù)事務(wù)的類(lèi),分別是System.Data.SqlClient.SqlTranscation類(lèi)和System.Data.OleDb.OleDbTranscation類(lèi)。
就像它們的名字一樣,這兩個(gè)類(lèi)大部分功能是一樣的,二者之間的主要差別在于它們的連接機(jī)制,前者提供一組直接調(diào)用C# SQL Server 的對(duì)象,而后者使用本機(jī) OLE DB 啟用數(shù)據(jù)訪問(wèn)。 事實(shí)上,ADO.net 事務(wù)完全在數(shù)據(jù)庫(kù)的內(nèi)部處理,且不受 Microsoft 分布式事務(wù)處理協(xié)調(diào)器 (DTC) 或任何其他事務(wù)性機(jī)制的支持。本文將主要介紹System.Data.SqlClient.SqlTranscation類(lèi),下面的段落中,除了特別注明,都將使用System.Data.SqlClient.SqlTranscation類(lèi)。
【編輯推薦】


















