江凌+楊平利+楊梅+袁媛
摘要: SQL Server 是當前較為常用的數(shù)據(jù)庫管理系統(tǒng)之一,具有速度快、功能強、易使用等特點,它主要解決數(shù)據(jù)的存儲與管理問題。為了更好地實現(xiàn)對SQL Server數(shù)據(jù)庫的訪問,提出了新的數(shù)據(jù)庫訪問技術即ADO.NET。在此介紹了ADO.NET的核心組件和體系結構,闡述了利用ADO.NET訪問數(shù)據(jù)庫的2種不同方式,結合實例展示了利用ADO.NET訪問SQL Server 2005的基本過程,并給出了關鍵代碼,實現(xiàn)了對數(shù)據(jù)的有效管理。
關鍵詞: ADO.NET; 數(shù)據(jù)庫訪問; SQL Server; 數(shù)據(jù)庫管理
中圖分類號: TN911?34; TP311文獻標識碼: A文章編號: 1004?373X(2014)08?0095?04
Programming of accessing SQL Server database based on ADO.NET
JIANG Ling, YANG Ping?li, Yang Mei, YUAN Yuan
(Northwest Institute of Nuclear Technology, Xian 710024, China)
Abstract:Being one of the most commonly?used database management systems, SQL Server has the characteristics of high speed, strong function and easy to use, and can solve the problems of data storage and management. In order to achieve a better way for accessing SQL Server, ADO.NET called as a new database access technology is proposed. The core components and the architecture of ADO.NET are simply introduced. Two different modes to access database using ADO.NET are explained. The basic process of using ADO.NET to access SQL Server is presented with an instance and the key codes are also given. The goal to efficiently manage data was achieved.
Keywords: ADO.NET; database access; SQL Server; database management
0引言
數(shù)據(jù)庫技術是計算機科學技術中發(fā)展最快的領域之一,也是應用最廣泛的技術之一,它已成為計算機信息系統(tǒng)與應用系統(tǒng)的核心技術和重要基礎。目前,數(shù)據(jù)庫系統(tǒng)已經(jīng)廣泛應用于各個領域,例如管理信息系統(tǒng)、辦公自動化系統(tǒng)、圖書情報檢索系統(tǒng)等。數(shù)據(jù)庫系統(tǒng)的特點主要有以下幾個方面[1]:
(1) 數(shù)據(jù)結構化。數(shù)據(jù)的共享性高,冗余度低,易擴充;
(2) 數(shù)據(jù)獨立性高。數(shù)據(jù)由數(shù)據(jù)庫管理系統(tǒng)(DBMS)統(tǒng)一管理和控制。
隨著應用程序的發(fā)展演變,越來越多的應用程序需要通過網(wǎng)絡傳遞數(shù)據(jù)。Microsoft結合.NET框架為數(shù)據(jù)訪問提供全新的編程模型——ADO.NET。通過ADO.NET不僅能夠使應用程序鏈接到數(shù)據(jù)源,檢索、操縱和更新數(shù)據(jù),而且能夠實現(xiàn)對非關系數(shù)據(jù)庫的訪問。本文主要介紹在Visual C#.NET中如何利用ADO.NET進行數(shù)據(jù)訪問,在數(shù)據(jù)庫的選用上,采用了微軟公司的SQL Server 2005。
1ADO.NET的體系結構
ADO.NET是.NET Framework提供給.NET開發(fā)人員的一組類,以目前業(yè)界認可與廣泛使用的XML為基礎,提供一致的方法來訪問各種數(shù)據(jù)源和完善的數(shù)據(jù)訪問服務,包括Microsoft SQL Server數(shù)據(jù)庫、ODBC、OLE DB數(shù)據(jù)源、Oracle數(shù)據(jù)源以及XML等[2]。
ADO.NET是一種全新的、強大的數(shù)據(jù)庫訪問技術[3]。它可將系統(tǒng)前端的用戶界面和后臺數(shù)據(jù)庫聯(lián)系起來,應用程序可以通過ADO.NET來鏈接各種數(shù)據(jù)源,檢索、插入、修改和刪除數(shù)據(jù)源中的數(shù)據(jù)以及以快速、只讀、只進的方式訪問數(shù)據(jù)[4]。用戶和系統(tǒng)之間一次典型的交互過程如圖1所示。
與傳統(tǒng)的訪問Web數(shù)據(jù)庫的方法相比較,ADO.NET數(shù)據(jù)訪問技術具有2個突出的優(yōu)點:一是緊密集成XML作為數(shù)據(jù)傳輸標準,使得ADO.NET能夠更加靈活地訪問各種不同類型的數(shù)據(jù);二是采用中斷式訪問模式,應用程序只是在需要訪問或者更新數(shù)據(jù)時才會鏈接到數(shù)據(jù)庫,一旦完成后就立即斷開,完成此任務的就是ADO.NET的2個核心組件。
圖1 ADO.NET的數(shù)據(jù)訪問過程
ADO.NET提供2個核心組件:.NET Framework數(shù)據(jù)提供程序和DataSet[5]。ADO.NET的體系結構如圖2所示。.NET Framework數(shù)據(jù)提供程序用于鏈接數(shù)據(jù)源、執(zhí)行SQL命令以及檢索數(shù)據(jù),檢索到的數(shù)據(jù)既可以直接處理,也可以放入DataSet對象中。.NET Framework數(shù)據(jù)提供程序通過在DataAdapter對象和DataSet之間建立聯(lián)系,使DataSet對象可以獲取來自多個數(shù)據(jù)源的數(shù)據(jù)。數(shù)據(jù)集DataSet是一個與數(shù)據(jù)源無關的內存數(shù)據(jù)表示方法,用于高速緩存關系型數(shù)據(jù)。它像是一個簡化的關系數(shù)據(jù)庫,可以包含數(shù)據(jù)表、數(shù)據(jù)列和數(shù)據(jù)行,以及表與表之間的關系,并且完全是在脫機模式下進行操作。
圖2 ADO.NET的體系結構
1.1NET Framework數(shù)據(jù)提供程序
.NET Framework數(shù)據(jù)提供程序包括Connection對象、Command對象、DataReader對象和DataAdapter對象。
(1) Connection對象:Connection管理與SQL Server數(shù)據(jù)庫的鏈接,用于鏈接Microsoft SQL Server 7.0版或以上版本。Connection對象是通過ConnectionString屬性的設置來鏈接數(shù)據(jù)庫。
(2) Command對象:在ADO.NET中,一般使用Command對象來執(zhí)行SQL命令并從數(shù)據(jù)源中返回結果。
(3) DataReader對象:用于從數(shù)據(jù)源中獲取只讀的、單項的數(shù)據(jù)流。
(4) DataAdapter對象:是DataSet和數(shù)據(jù)源之間的橋梁,它可以隱藏和Connection對象、Command對象溝通的細節(jié),完成DataSet和數(shù)據(jù)源之間的數(shù)據(jù)交換。
1.2DataSet組件
(1) DataSet包含Tables(表)集合和Relations(關系)集合。Tables集合由DataTable對象組成,而Relations集合由DataRelation對象組成。
(2) 在DataSet的Tables集合中,每個DataTable對象又包含Rows(行)集合、Columns(列集合)集合、ChildRelations(子關系)集合和ParentRelations(父關系)集合。
因為DataSet的結構和關系型數(shù)據(jù)庫類似,所以可以像訪問關系型數(shù)據(jù)庫那樣訪問DataSet。可以在DataSet內添加、刪除表,在表中使用Select方法查看數(shù)據(jù)、使用Delete方法刪除數(shù)據(jù)等。同時,DataSet可以看作由集合組成,因此還可以以集合的方法訪問DataSet中的數(shù)據(jù)。另外,DataSet還能夠完全看作XML格式的數(shù)據(jù),對DataSet可以按照XML數(shù)據(jù)的形式進行訪問。
對于不同的應用需要ADO.NET提供了2種模式來訪問數(shù)據(jù)源中的數(shù)據(jù):使用DataReader對象進行基于鏈接的訪問和使用DataAdapter對象進行非鏈接的訪問[6]。下面對2種訪問模式進行分析和比較。
1.3基于鏈接的訪問模式
基于鏈接的訪問模式會占用一個數(shù)據(jù)庫鏈接,然后讀取數(shù)據(jù)。它是通過DataReader對象來實現(xiàn)的,DataReader對象在已經(jīng)建立的數(shù)據(jù)鏈接的基礎上,提供對數(shù)據(jù)源的單向的、只讀的數(shù)據(jù)流。由于DataReader可以順序地處理從數(shù)據(jù)源返回的結果,而且不在內存中緩存,因此DataReader適合從數(shù)據(jù)源中檢索大量的、不需要進行更新操作的數(shù)據(jù)。
1.4非鏈接的訪問模式
非鏈接的訪問模式是以Dataset為中心的數(shù)據(jù)訪問模式。Dataset中的數(shù)據(jù)是與數(shù)據(jù)庫斷開鏈接的[7]。一旦將結果存儲在Dataset之后,Dataset和數(shù)據(jù)庫之間便不再有鏈接。對Dataset內容所做的修改不會直接影響到數(shù)據(jù)庫。它的優(yōu)點就在于處理非鏈接數(shù)據(jù)時是不需要始終與數(shù)據(jù)庫鏈接。
在Visual C#中利用ADO.NET訪問SQL Server 2005的基本過程。
首先,使用SQL Server 2005建立一個數(shù)據(jù)庫,假設該數(shù)據(jù)庫名為yjsCheck。在使用ADO.NET之前,需要先把有關的命名空間導入進來[8]。即將下面的代碼加入到要進行數(shù)據(jù)庫操作的C#程序中,其具體位置應該在類聲明之前。
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data.SqlTypes;
1.5鏈接數(shù)據(jù)庫
建立數(shù)據(jù)庫鏈接是最基本的數(shù)據(jù)庫操作任務之一,一般情況下可以使用ADO.NET的Connection對象來完成鏈接數(shù)據(jù)庫的操作。下面的代碼示例演示了使用SqlConnection對象如何創(chuàng)建和打開數(shù)據(jù)庫鏈接。
SqlConnection sqlConn = new SqlConnection("Data Source=abcSQLSERVER2005;initial catalog=yjsCheck;integrated security=SSPI");
sqlConn.Open();
其中,“Data Source=abcSQLSERVER2005”為鏈接的數(shù)據(jù)源名稱,“initial catalog=yjsCheck”為鏈接的數(shù)據(jù)庫名稱,“integrated security=SSPI”表示使用Windows集成安全身份認證。
鏈接數(shù)據(jù)庫并完成了對數(shù)據(jù)庫的操作之后,必須關閉與數(shù)據(jù)庫的鏈接。可以使用Connection對象的Close()或Dispose()方法來完成。
1.6檢索并顯示數(shù)據(jù)
從數(shù)據(jù)庫中檢索數(shù)據(jù)記錄一般使用下面的2種方式:一種是通過DataReader對象直接訪問;另一種則是通過數(shù)據(jù)集DataSet和DataAdapter對象訪問。
使用ADO.NET的DataReader對象能從數(shù)據(jù)庫中檢索數(shù)據(jù)。檢索出來的數(shù)據(jù)形成一個只讀只進的數(shù)據(jù)流。DataReader對象的Read方法可以前進到下一條記錄。代碼如下:
string myConn = "Data Source=abcSQLSERVER2005;initial catalog=yjsCheck;integrated security=SSPI";
string str = "select HostIP,Unit1 from Information ";
//查詢Information表中的HostIP字段和Unit字段
SqlConnection sqlConn = new SqlConnection(myConn);
//使用Connection對象創(chuàng)建和數(shù)據(jù)庫的鏈接
SqlCommand sqlComm = new SqlCommand(str, sqlConn);
//創(chuàng)建SqlCommand對象并執(zhí)行查詢的SQL命令
sqlConn.Open();//打開鏈接
SqlDataReader myReader; //創(chuàng)建SqlDataReader對象
myReader = sqlComm.ExecuteReader();
while (myReader.Read())
//循環(huán)遍歷SqlDataReader中的每條記錄,直到完成
{
……對數(shù)據(jù)庫操作代碼
}
myReader.Close();//關閉SqlDataReader對象
sqlConn.Close(); //關閉鏈接
從數(shù)據(jù)庫中讀取記錄的另一種方法是使用DataSet對象和DataAdapter對象。關鍵步驟如下:
(1) 創(chuàng)建數(shù)據(jù)庫的鏈接;
(2) 構造包含查詢語句的SqlDataAdapter對象;
(3) 調用Fill方法把數(shù)據(jù)填充到DataSet中;
(4) 關閉鏈接。
代碼如下:
string myConn = "Data Source=abcSQLSERVER2005;initial catalog=yjsCheck;integrated security=SSPI";
string str = "select HostIP,Unit1 from Information ";
//查詢Information表中的HostIP字段和Unit字段
SqlConnection sqlConn = new SqlConnection(myConn);
//使用Connection對象創(chuàng)建和數(shù)據(jù)庫的鏈接
SqlDataAdapter myDataAdapter = new SqlDataAdapter(str, sqlConn);
//創(chuàng)建SqlDataAdapter對象
sqlConn.Open();
DataSet ds = new DataSet(); //創(chuàng)建DataSet對象
myDataAdapter.Fill(ds, "Information");
//SqlDataAdapter對象通過Fill方法把數(shù)據(jù)添加到DataSet中
{
……對數(shù)據(jù)庫操作代碼
}
sqlConn.Close();
當需要確定應用程序應使用DataReader還是應使用DataSet時,應考慮應用程序所需的功能類型。DataSet用于組合并關聯(lián)來自多個源的數(shù)據(jù),對數(shù)據(jù)執(zhí)行大量的處理,而不需要與數(shù)據(jù)源保持打開的鏈接,從而將該鏈接釋放給其他客戶端使用。如果不需要DataSet所提供的功能,則可以使用DataReader以只進只讀方式返回數(shù)據(jù),從而提高應用程序的效率。
1.7添加和刪除數(shù)據(jù)
(1) 添加操作
代碼如下:
string myConn = "Data Source=abcSQLSERVER2005;initial catalog=yjsCheck;integrated security=SSPI";
string str = "insert into Information(Keywords,Degree) values (@keywords,@degree)";//SQL語句的插入操作SqlConnection sqlConn = new SqlConnection(myConn);
SqlCommand sqlComm = new SqlCommand(str, sqlConn);
sqlComm.Parameters.Add(new SqlParameter("@keywords",SqlDbType.NVarChar,100));
//使用SqlCommand對象的Parameters集合填充命令的值
sqlComm.Parameters["@keywords"].Value=textBox1.Text;
sqlComm.Parameters.Add(new SqlParameter("@degree",SqlDbType.Float));
sqlComm.Parameters["@degree"].Value=textBox2.Text;
sqlConn.Open();
try {
sqlComm.ExecuteNonQuery(); }
catch (SqlException ex)
{ MessageBox.Show("有誤:" + ex.Message.ToString());
}//異常處理
sqlConn.Close();
(2) 刪除操作
代碼如下:
將添加操作中的語句:
string str = "insert into Information(Keywords,Degree) values (@keywords,@degree)";//SQL語句的插入操作
改為:
string str = "delete from Information where Keywords=@keywords";//SQL語句的刪除操作
其他語句相同。
2結語
ADO.NET為數(shù)據(jù)庫的訪問提供了一種全新的、簡單高效的數(shù)據(jù)庫訪問技術[9],具有執(zhí)行速度快,編程方式靈活等優(yōu)點[10],功能強大,使用方便。它能夠對絕大部分數(shù)據(jù)源進行高效的訪問,是應用程序和數(shù)據(jù)庫之間的一座重要橋梁,本文對從事數(shù)據(jù)庫開發(fā)的技術人員有一定的借鑒作用。
參考文獻
[1] 薩師煊,王珊.數(shù)據(jù)庫系統(tǒng)概論[M].北京:高等教育出版社,2002.
[2] 申朝陽,宋顏浩.ASP.NET與數(shù)據(jù)庫技術高級指南[M].北京:中國水利水電出版社,2005.
[3] 張奇,李律松,衛(wèi)建偉,等.Visual C#數(shù)據(jù)庫項目案例導航[M].北京:清華大學出版社,2005.
[4] 路紅武.基于.NET企業(yè)信息資源管理系統(tǒng)的設計與實現(xiàn)[J].計算機與現(xiàn)代化,2005,18(6):21?23.
[5] 李律松,陳少剛,沈剛,等.Visual C#數(shù)據(jù)庫高級教程[M].北京:清華大學出版社,2005.
[6] 周曉娟.基于ADO.NET的數(shù)據(jù)庫訪問技術研究[J].現(xiàn)代商貿工業(yè),2009(24):293?295.
[7] SCEPPA David.ADO.NET2.0技術內幕[M].北京:清華大學出版社,2007.
[8] ROBINSON Simon, NAGEL Christian.C#高級編程[M].李敏波,譯.3版.北京:清華大學出版社,2005.
[9] 李成楠,楊晶.基于ADO.NET數(shù)據(jù)庫訪問技術淺析[J].科技創(chuàng)新導報,2012(12):33?35.
[10] 桑國珍.數(shù)據(jù)庫訪問技術的研究[J].現(xiàn)代電子技術,2010,33(20):83?85.
當需要確定應用程序應使用DataReader還是應使用DataSet時,應考慮應用程序所需的功能類型。DataSet用于組合并關聯(lián)來自多個源的數(shù)據(jù),對數(shù)據(jù)執(zhí)行大量的處理,而不需要與數(shù)據(jù)源保持打開的鏈接,從而將該鏈接釋放給其他客戶端使用。如果不需要DataSet所提供的功能,則可以使用DataReader以只進只讀方式返回數(shù)據(jù),從而提高應用程序的效率。
1.7添加和刪除數(shù)據(jù)
(1) 添加操作
代碼如下:
string myConn = "Data Source=abcSQLSERVER2005;initial catalog=yjsCheck;integrated security=SSPI";
string str = "insert into Information(Keywords,Degree) values (@keywords,@degree)";//SQL語句的插入操作SqlConnection sqlConn = new SqlConnection(myConn);
SqlCommand sqlComm = new SqlCommand(str, sqlConn);
sqlComm.Parameters.Add(new SqlParameter("@keywords",SqlDbType.NVarChar,100));
//使用SqlCommand對象的Parameters集合填充命令的值
sqlComm.Parameters["@keywords"].Value=textBox1.Text;
sqlComm.Parameters.Add(new SqlParameter("@degree",SqlDbType.Float));
sqlComm.Parameters["@degree"].Value=textBox2.Text;
sqlConn.Open();
try {
sqlComm.ExecuteNonQuery(); }
catch (SqlException ex)
{ MessageBox.Show("有誤:" + ex.Message.ToString());
}//異常處理
sqlConn.Close();
(2) 刪除操作
代碼如下:
將添加操作中的語句:
string str = "insert into Information(Keywords,Degree) values (@keywords,@degree)";//SQL語句的插入操作
改為:
string str = "delete from Information where Keywords=@keywords";//SQL語句的刪除操作
其他語句相同。
2結語
ADO.NET為數(shù)據(jù)庫的訪問提供了一種全新的、簡單高效的數(shù)據(jù)庫訪問技術[9],具有執(zhí)行速度快,編程方式靈活等優(yōu)點[10],功能強大,使用方便。它能夠對絕大部分數(shù)據(jù)源進行高效的訪問,是應用程序和數(shù)據(jù)庫之間的一座重要橋梁,本文對從事數(shù)據(jù)庫開發(fā)的技術人員有一定的借鑒作用。
參考文獻
[1] 薩師煊,王珊.數(shù)據(jù)庫系統(tǒng)概論[M].北京:高等教育出版社,2002.
[2] 申朝陽,宋顏浩.ASP.NET與數(shù)據(jù)庫技術高級指南[M].北京:中國水利水電出版社,2005.
[3] 張奇,李律松,衛(wèi)建偉,等.Visual C#數(shù)據(jù)庫項目案例導航[M].北京:清華大學出版社,2005.
[4] 路紅武.基于.NET企業(yè)信息資源管理系統(tǒng)的設計與實現(xiàn)[J].計算機與現(xiàn)代化,2005,18(6):21?23.
[5] 李律松,陳少剛,沈剛,等.Visual C#數(shù)據(jù)庫高級教程[M].北京:清華大學出版社,2005.
[6] 周曉娟.基于ADO.NET的數(shù)據(jù)庫訪問技術研究[J].現(xiàn)代商貿工業(yè),2009(24):293?295.
[7] SCEPPA David.ADO.NET2.0技術內幕[M].北京:清華大學出版社,2007.
[8] ROBINSON Simon, NAGEL Christian.C#高級編程[M].李敏波,譯.3版.北京:清華大學出版社,2005.
[9] 李成楠,楊晶.基于ADO.NET數(shù)據(jù)庫訪問技術淺析[J].科技創(chuàng)新導報,2012(12):33?35.
[10] 桑國珍.數(shù)據(jù)庫訪問技術的研究[J].現(xiàn)代電子技術,2010,33(20):83?85.
當需要確定應用程序應使用DataReader還是應使用DataSet時,應考慮應用程序所需的功能類型。DataSet用于組合并關聯(lián)來自多個源的數(shù)據(jù),對數(shù)據(jù)執(zhí)行大量的處理,而不需要與數(shù)據(jù)源保持打開的鏈接,從而將該鏈接釋放給其他客戶端使用。如果不需要DataSet所提供的功能,則可以使用DataReader以只進只讀方式返回數(shù)據(jù),從而提高應用程序的效率。
1.7添加和刪除數(shù)據(jù)
(1) 添加操作
代碼如下:
string myConn = "Data Source=abcSQLSERVER2005;initial catalog=yjsCheck;integrated security=SSPI";
string str = "insert into Information(Keywords,Degree) values (@keywords,@degree)";//SQL語句的插入操作SqlConnection sqlConn = new SqlConnection(myConn);
SqlCommand sqlComm = new SqlCommand(str, sqlConn);
sqlComm.Parameters.Add(new SqlParameter("@keywords",SqlDbType.NVarChar,100));
//使用SqlCommand對象的Parameters集合填充命令的值
sqlComm.Parameters["@keywords"].Value=textBox1.Text;
sqlComm.Parameters.Add(new SqlParameter("@degree",SqlDbType.Float));
sqlComm.Parameters["@degree"].Value=textBox2.Text;
sqlConn.Open();
try {
sqlComm.ExecuteNonQuery(); }
catch (SqlException ex)
{ MessageBox.Show("有誤:" + ex.Message.ToString());
}//異常處理
sqlConn.Close();
(2) 刪除操作
代碼如下:
將添加操作中的語句:
string str = "insert into Information(Keywords,Degree) values (@keywords,@degree)";//SQL語句的插入操作
改為:
string str = "delete from Information where Keywords=@keywords";//SQL語句的刪除操作
其他語句相同。
2結語
ADO.NET為數(shù)據(jù)庫的訪問提供了一種全新的、簡單高效的數(shù)據(jù)庫訪問技術[9],具有執(zhí)行速度快,編程方式靈活等優(yōu)點[10],功能強大,使用方便。它能夠對絕大部分數(shù)據(jù)源進行高效的訪問,是應用程序和數(shù)據(jù)庫之間的一座重要橋梁,本文對從事數(shù)據(jù)庫開發(fā)的技術人員有一定的借鑒作用。
參考文獻
[1] 薩師煊,王珊.數(shù)據(jù)庫系統(tǒng)概論[M].北京:高等教育出版社,2002.
[2] 申朝陽,宋顏浩.ASP.NET與數(shù)據(jù)庫技術高級指南[M].北京:中國水利水電出版社,2005.
[3] 張奇,李律松,衛(wèi)建偉,等.Visual C#數(shù)據(jù)庫項目案例導航[M].北京:清華大學出版社,2005.
[4] 路紅武.基于.NET企業(yè)信息資源管理系統(tǒng)的設計與實現(xiàn)[J].計算機與現(xiàn)代化,2005,18(6):21?23.
[5] 李律松,陳少剛,沈剛,等.Visual C#數(shù)據(jù)庫高級教程[M].北京:清華大學出版社,2005.
[6] 周曉娟.基于ADO.NET的數(shù)據(jù)庫訪問技術研究[J].現(xiàn)代商貿工業(yè),2009(24):293?295.
[7] SCEPPA David.ADO.NET2.0技術內幕[M].北京:清華大學出版社,2007.
[8] ROBINSON Simon, NAGEL Christian.C#高級編程[M].李敏波,譯.3版.北京:清華大學出版社,2005.
[9] 李成楠,楊晶.基于ADO.NET數(shù)據(jù)庫訪問技術淺析[J].科技創(chuàng)新導報,2012(12):33?35.
[10] 桑國珍.數(shù)據(jù)庫訪問技術的研究[J].現(xiàn)代電子技術,2010,33(20):83?85.