訪問數(shù)據(jù)庫是大多數(shù)應(yīng)用程序的一部分,而且隨著C#和ADO.NET的發(fā)布,這個過程已經(jīng)變得相當(dāng)?shù)暮唵?本文將展示下面四個基本的數(shù)據(jù)庫操作:
1.讀數(shù)據(jù).這包括諸如整數(shù),字符串和日期等不同的數(shù)據(jù)類型. 2.寫數(shù)據(jù).就象讀數(shù)據(jù)一樣我們會寫這些通常的數(shù)據(jù)類型.這是通過SQL語句來實現(xiàn)的. 3.更新或是修改數(shù)據(jù).我們還是使用簡單SQL語句. 4.刪除數(shù)據(jù).使用SQL.
這些操作是對一個微軟Access 2000數(shù)據(jù)庫進(jìn)行的,但是SQL或是其它ADO數(shù)據(jù)源可以通過簡單的改變連接字符串來使用.
開始第一步 為了使用ADO類,我們需要包括進(jìn)ADO.NET命名空間(namespace)和一些精巧的日期類.在你要進(jìn)行數(shù)據(jù)庫操作的地方加入下列幾行代碼.它應(yīng)該被放置在命名空間引入代碼行的下面而在類定義的上面.
using System.Data; // 申明變量 using System.Data.ADO; // 數(shù)據(jù)庫 using System.Globalization; // 日期
根據(jù)你所參與的工程的類型,你可能需要增加對System.Data命名空間的引用.你可以根據(jù)在你添加上面的代碼以后編譯器是否產(chǎn)生錯誤來判斷.要添加System.Data命名空間,你可以: 1.在Solution explorer-References 分支中右鍵單擊. 2.選擇"添加引用" 3.選擇.NET Framework標(biāo)簽. 4.雙擊System.data.dll條目 5.單擊OK 6.System.Data現(xiàn)在應(yīng)該出現(xiàn)在了Solution explorer的引用列表中了.
因為連接字符串在大多數(shù)操作中都要使用,所以我建議你將它設(shè)置成你要編寫的類的成員.注意:在你的程序中,數(shù)據(jù)庫文件的路徑有可能不同.
//屬性 public const string DB_CONN_STRING = "Driver={Microsoft Access Driver (*.mdb)}; "+ "DBQ=D:\\CS\\TestDbReadWrite\\SimpleTest.mdb";
讀數(shù)據(jù) 現(xiàn)在一切都變得有趣起來.讀數(shù)據(jù)可以通過ADODataReader類來實現(xiàn).(參看Chris Maunder的文章"ADO.NET ADODataReader類"來獲取關(guān)于這個類的更多信息.)讀數(shù)據(jù)的步驟如下:
1.我們用ADOConnection來打開一個數(shù)據(jù)庫. ADOConnection conn = new ADOConnection(DB_CONN_STRING); conn.Open(); 2.我們編寫一個SQL語句來定義將要取出的數(shù)據(jù).這個數(shù)據(jù)執(zhí)行的結(jié)果是返回一個ADODataReader 對象.注意Execute方法中的out關(guān)鍵字.這在C#中意味著通過引用傳遞參數(shù).
ADODataReader dr; ADOCommand cmd = new ADOCommand( "SELECT * FROM Person", conn ); cmd.Execute( out dr);
3.我們循環(huán)遍歷ADODataReader中的每一個記錄直到我們完成要做的工作.注意:數(shù)據(jù)被直接作為一個字符串返回同時數(shù)據(jù)域名稱用來指明讀的數(shù)據(jù)域. while( dr.Read() ) { System.Console.WriteLine( dr["FirstName"] ); } 4.我們收工 但是,作為好的程序員我們還需要加進(jìn)許多try/catch/finally語句來確保我們處理了所有的錯誤. try { .... 數(shù)據(jù)庫操作 ... } catch( Exception ex ) { System.Console.WriteLine( "READING:" ); System.Console.WriteLine( " ERROR:" + ex.Message ); System.Console.WriteLine( " SQL :" + sSqlCmd ); System.Console.WriteLine( " Conn.:" + DB_CONN_STRING ); } finally { // 關(guān)閉連接 if( conn.State == DBObjectState.Open ) conn.Close(); }
讀取不同的數(shù)據(jù)類型 dr["stuff"]這個語句通常能夠返回一個數(shù)據(jù).但是要返回一個int或者DateTime對象的話通常需要進(jìn)行數(shù)據(jù)轉(zhuǎn)換.這通常可以通過使用ADODataReader許多內(nèi)建轉(zhuǎn)換器中的一個來實現(xiàn).也就是:
int nOrdinalAge = dr.GetOrdinal( "Age" ); int nAge = dr.GetInt32( nOrdinalAge );
DateTime tUpdated = (DateTime)dr["Updated"];
注意GetOrdinal定位數(shù)據(jù)域用名字來讀取數(shù)據(jù)的用法.如果數(shù)據(jù)域是空白的(還沒有填入任何數(shù)據(jù)),上面的代碼會拋出一個異常.要捕捉這種情況,我們可以用IsNull方法檢查是否有數(shù)據(jù)存在,如下所示:
int nOrdinalAge = dr.GetOrdinal( "Age" ); if( dr.IsNull( nOrdinalAge ) ) { System.Console.WriteLine( " Age : Not given!" ); } else { int nAge = dr.GetInt32( nOrdinalAge ); System.Console.WriteLine( " Age : " + nAge ); }
插入,修改,刪除和其他SQL命令 插入,修改,刪除過程可以非常容易的通過SQL語句來實現(xiàn).下面的代碼執(zhí)行一條SQL命令來插入一條記錄.
// SQL 命令 String sSQLCommand = "INSERT INTO Person (Age, FirstName, Description, Updated) " + "VALUES( 55, 'Bob', 'Is a Penguin', '2001/12/25 20:30:15' );"; // 創(chuàng)建command對象 ADOCommand cmdAdder = new ADOCommand( sSQLCommand, DB_CONN_STRING); cmdAdder.ActiveConnection.Open(); // Execute the SQL command int nNoAdded = cmdAdder.ExecuteNonQuery(); System.Console.WriteLine( "\nRow(s) Added = " + nNoAdded + "\n" );
注意:try/catch代碼沒有在上面的例子里出現(xiàn),但是應(yīng)該包括上面的代碼.
插入 上面的代碼通過建立一個SQL命令然后執(zhí)行它來插入一條記錄.一些在編寫SQL命令時應(yīng)注意的事項如下: 1.數(shù)值數(shù)據(jù)應(yīng)該直接表示.沒有單引號('). 2.字符串的表示應(yīng)該包括在單引號中('blah'). 3.確保字符串中不包含任何嵌入的單(雙)引號.這會使事情混淆. 4.日期和時間數(shù)據(jù)用包裹在單引號中的國際通用形式來表示('YYYY/MM/DD HH:MM:SS').
修改
UPDATE命令指明要修改的數(shù)據(jù)和修改的動作.ExecuteNonQuery()的返回值指出改變的記錄的個數(shù),所以如果有5個Peter's在表單中的話下面的代碼將返回5. String sSQLCommand = "UPDATE Person SET Age = 27 WHERE FirstName = 'Peter'";
刪除 DELETE命令指明要刪除的記錄.ExecuteNonQuery()的返回值指出改變的記錄的個數(shù),所以如果有2個Bobo在表單中的話下面的代碼將返回2.兩個Bobo都會被刪除.
String sSQLCommand = "DELETE FROM Person WHERE FirstName = 'Bobo'";
|