C#數(shù)據(jù)庫編程(一) 因?yàn)?a href="javascript:;" oncg="javascript:tagshow(event, '%ce%c4%d5%c2');" target="_self">文章太長了,所以只能打包上傳了,。 最近在學(xué)習(xí)C#數(shù)據(jù)庫編程,感覺書上學(xué)到的和網(wǎng)上查的資料都比較凌亂,,于是就想把這些知識(shí)整理一下,。也希望能給像我一樣正處于入門階段的朋友有所幫助。 用.Net框架編寫的應(yīng)用程序需要訪問數(shù)據(jù)庫時(shí),,將使用ADO.NET來實(shí)現(xiàn)數(shù)據(jù)庫訪問,。ADO.NET類型在System.Data命名空間下及其子空間下,它包括為訪問SQL Server, OLE DB, ODBC和Oracle數(shù)據(jù)庫而優(yōu)化的類型,,而且這些都是基于通用類的,。因此,使用ADO.NET訪問不同的DBMS是相似的,。 ADO.NET主要用來實(shí)現(xiàn)兩個(gè)功能:數(shù)據(jù)訪問和數(shù)據(jù)表示,。 ADO.NET包含7個(gè)重要的基類,其中4個(gè)是數(shù)據(jù)訪問類,,3個(gè)是數(shù)據(jù)表示類,。 數(shù)據(jù)訪問類: 1.DbConnection 它主要用來提供與數(shù)據(jù)庫的連接。 2.DbCommand DbCommand對(duì)象可以用來執(zhí)行SQL語句,、運(yùn)行存儲(chǔ)過程等,。 3.DbDataReader 此類用來讀取執(zhí)行命令所獲得的數(shù)據(jù)。 4.DbDataAdapter DbDataAdapter叫數(shù)據(jù)適配器,,它既可以將數(shù)據(jù)庫中的數(shù)據(jù)傳輸給包含在DataSet中的表,,也可以將DataSet對(duì)象中的數(shù)據(jù)傳輸給數(shù)據(jù)庫以更新數(shù)據(jù)源。它相當(dāng)于是DataSet和數(shù)據(jù)庫的中介,。 數(shù)據(jù)表示類(數(shù)據(jù)表示類于上面的數(shù)據(jù)訪問類有點(diǎn)不同,,數(shù)據(jù)表示類是獨(dú)立于各數(shù)據(jù)庫平臺(tái)的,它們沒有專門用于特定數(shù)據(jù)庫管理系統(tǒng)的子類): 1.DataTable 此類用于存儲(chǔ)數(shù)據(jù)表。但它存儲(chǔ)的表不一定對(duì)映數(shù)據(jù)庫中的表,,它是一個(gè)臨時(shí)保存數(shù)據(jù)的虛擬表,。 2.DataRelation 它用來處理多個(gè)DataTable對(duì)象之間的數(shù)據(jù)關(guān)系。 3.DataSet 它是DataTable和DataRelation對(duì)象的集合,。我們可以把它當(dāng)作內(nèi)存中的數(shù)據(jù)庫,,它是從數(shù)據(jù)源檢索到的數(shù)據(jù)在內(nèi)存中的緩存。它是一個(gè)功能強(qiáng)大的類,,這一方面體現(xiàn)在它有很多屬性和方法,,另一方面體現(xiàn)在與其他對(duì)象如:Web應(yīng)用程度、Windows應(yīng)用程序,、Web服務(wù)和XML文檔的結(jié)合使用上,。 當(dāng)然訪問數(shù)據(jù)和數(shù)據(jù)綁定也可通過控件和向?qū)硗瓿桑@往往達(dá)不到我們所需要實(shí)現(xiàn)的控制程度或不能像我們希望的那樣有效,。在這種情況下,,我們一般會(huì)選擇以編程的方式訪問數(shù)據(jù)庫。 1.數(shù)據(jù)庫連接 第一步是配置連接對(duì)象,,然后才可以對(duì)連接對(duì)象執(zhí)行命令,,獲得數(shù)據(jù)。 SqlConnection conn = new SqlConnection(); 創(chuàng)建實(shí)例后,,可用SqlConnection.ConnectionString屬性給連接對(duì)象配置連接字符串。 conn. ConnectionString= “ConnectionString”; 當(dāng)然,,我們也可以使用構(gòu)造函數(shù)將以上兩個(gè)步驟合二為一: SqlConnection conn= new SqlConnection(“ConnectionString”); 在創(chuàng)建SqlConnection對(duì)象時(shí),,應(yīng)提供與所使用數(shù)據(jù)庫通信所需的信息,如數(shù)據(jù)源的位置,、用于登錄的用戶名和密碼以及要訪問的數(shù)據(jù)庫系統(tǒng)中的某個(gè)具體的數(shù)據(jù)庫名,。(e.g:Data Source=CHINA-C17C0CDAC\\SQLEXPRESS;User id=sa;PWD=test;Database=FolktaleDB這是一個(gè)連接數(shù)據(jù)庫的字符串)其他ADO.NET的數(shù)據(jù)訪問及表示類都依靠它與數(shù)據(jù)庫進(jìn)行通信,沒有它后面的一切皆是浮云,。 SqlConnection類有提供屬性,,便于我們判斷當(dāng)前的連接狀態(tài)。因?yàn)樵谌魏翁囟〞r(shí)刻,,連接可以是打開也可是關(guān)閉的,。只有在連接打開時(shí)才能訪問數(shù)據(jù)庫,但數(shù)據(jù)庫連接消耗資源,,因此只有代碼使用時(shí)才打開連接,,在其他時(shí)候應(yīng)該關(guān)閉,否則可能引起內(nèi)存泄露或也可能阻止其它程序訪問數(shù)據(jù)庫,。 連接狀態(tài)可以通過SqlConnection.State來判斷,,此屬性會(huì)返回一個(gè)枚舉值(Open/Closed)。 if(conn.State ==ConnectionState.Open) { //Do things } 如果使用SqlConnection.Open()打開了連接,則一定要用SqlConnection.Close()方法來關(guān)閉它,,否則它不會(huì)自動(dòng)關(guān)閉的,。當(dāng)然后面會(huì)講到通過數(shù)據(jù)閱讀器關(guān)閉連接。 或者我們也可以使用Using塊,,享受自動(dòng)關(guān)閉,。在Using塊中,最后一行代碼執(zhí)行完后,,將自動(dòng)關(guān)閉連接,。 Using(SqlConnection conn=new SqlConnection(“ConnectionString”)) { conn.Open(); . . . } 這個(gè)Using是怎么做到不需要我們手工關(guān)閉的呢?因?yàn)樗軐?dǎo)致SqlConnection對(duì)象的Dispose()方法被調(diào)用,,這樣該方法就把連接給關(guān)閉了,。 通常我們的代碼中一般會(huì)這樣寫: SqlConnection conn=new SqlConnection(“ConnectionString”) try { conn.Open(); } catch { //Handle exception } finally { conn.Close(); } 2.數(shù)據(jù)庫命令 SqlCommand對(duì)象通過SqlConnection對(duì)象對(duì)數(shù)據(jù)庫執(zhí)行命令。SqlCommand類有4個(gè)構(gòu)造函數(shù),。其中最簡(jiǎn)單的是無參構(gòu)造函數(shù),。然后是帶一個(gè)查詢語句的參數(shù)。但一般常用的是第三種,,它帶查詢語句和SqlConnection對(duì)象,。 SqlConnection connection = new SqlConnection (connectionString) SqlCommand command = new SqlCommand(queryString, connection); 如果構(gòu)造函數(shù)沒有參數(shù),則可以通過SqlCommand.CommandText屬性來設(shè)置,。 3.數(shù)據(jù)閱讀器 SqlDataReader類,,它提供的數(shù)據(jù)游標(biāo)是只向前的,所以它只能以串行的方式一次讀取一行數(shù)據(jù),,而且不能讀完幾行后再返回去讀取,,它只能一行一行的往下讀。 SqlDataReader類與一般的類有一點(diǎn)不同,,它沒有可用來創(chuàng)建實(shí)例的公有構(gòu)造函數(shù),,所以只能使用SqlCommand.ExecuteReader()來創(chuàng)建SqlDataReader實(shí)例。 e.g SqlCommandcmd =newSqlCommand("Select * from Ending",conn); SqlDataReaderreader = cmd.ExecuteReader(); 通常也可在創(chuàng)建SqlDataReader類實(shí)例,,設(shè)定在關(guān)閉數(shù)據(jù)閱讀器的同時(shí)關(guān)閉連接,。 SqlDataReaderreader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 創(chuàng)建SqlDataReader實(shí)例后,既可用來讀取數(shù)據(jù),,又可用來獲取架構(gòu)數(shù)據(jù),。要獲取架構(gòu)數(shù)據(jù),可使用SqlDataReader.GetSchemaTable()方法,。當(dāng)然,,還有實(shí)用的方法: SqlDataReader.FieldCount()返回一個(gè)int值,獲取行中的列數(shù) SqlDataReader.GetName()獲取指定列的名稱 SqlDataReader.GetDataTypeName()獲取指定列的數(shù)據(jù)類型名 下面,,就結(jié)合一個(gè)實(shí)例來體會(huì)下,,上述方法的使用和SqlDataReader是如何來讀取數(shù)據(jù)的,。 classProgram { staticvoidMain(string[] args) { stringstrString ="Data Source= CHINA-C17C0CDAC\\SQLEXPRESS;User id=sa;PWD=test;Database=FolktaleDB "; //此句一開始提示有轉(zhuǎn)義錯(cuò)誤,是因?yàn)?span lang="EN-US">Data Source中有一個(gè)\,,在前面再加了個(gè)\這樣就OK了 //其中Data Source是打開SQL Server時(shí),,自動(dòng)顯示的服務(wù)器名 //Database是需要聯(lián)系的數(shù)據(jù)庫的名字 SqlConnectionconn =newSqlConnection(strString); stringtableName="Address"; stringquery="Select * from "+tableName; SqlCommandcmd=newSqlCommand(query,conn); try { conn.Open(); //SqlConnection.State可判斷現(xiàn)在連接狀態(tài) if(conn.State ==ConnectionState.Open) { Console.WriteLine("OK"); } //創(chuàng)建SqlDataReader對(duì)象時(shí),不能像其他對(duì)象一樣new出來,,只能使用SqlCommand.ExecuteReader()方法來獲得 SqlDataReaderreader = cmd.ExecuteReader(); //SqlDataReader在使用前,,必須加載行,運(yùn)用Read()方法,,如果首次調(diào)用此方法,,會(huì)加載第一行,并返回一個(gè)bool值,,表示是否成功 //所以,,一般直接把這個(gè)方法放在whiel循環(huán)中 //如果在加載前試圖讀取數(shù)據(jù),則會(huì)產(chǎn)生InvalidOperationException異常,,所以,,在試用前也可用SqlDataReader.HasRows屬性來判斷 while(reader.Read()) { //sqlDataReader.FieldCount:獲取數(shù)據(jù)閱讀器中行的列數(shù),結(jié)果為一個(gè)int值 //sqlDataReader.GetName();獲取指定列的名稱 for(intindex = 0; index < reader.FieldCount; index++) { //reader[index].ToString()都是用來提取列里面的數(shù)據(jù)的 Console.WriteLine(reader.GetName(index)+": "+reader[index].ToString()+";"); } Console.WriteLine(); } reader.Close(); } catch(Exceptionex) |
|