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