ADO.NET常用对象
一、Connection對象
Connection對象也稱為數(shù)據(jù)庫連接對象,Connection對象的功能是負(fù)責(zé)對數(shù)據(jù)源的連接。所有Connection對象的基類都是DbConnection類。
Connection對象有兩個重要屬性:
(1)ConnectionString:表示用于打開 SQL Server 數(shù)據(jù)庫的字符串;
(2)State:表示 Connection 的狀態(tài),有Closed和Open兩種狀態(tài)。
Connection對象有兩個重要方法:
(1)Open()方法:指示打開數(shù)據(jù)庫;
(2)Close()方法:指示關(guān)閉數(shù)據(jù)庫。
SqlConnection connection = new SqlConnection( "server=localhost;database=pubs;uid=sa;pwd=''";); //注意,DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")是將當(dāng)前時間格式化為類似于2008-10-09 00:00:03的形式的字符串 Response.Write("時間"+ DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+"當(dāng)前數(shù)據(jù)庫連接狀態(tài)是:"+connection.State +"<br/>"); connection.Open(); Response.Write("時間" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "當(dāng)前數(shù)據(jù)庫連接狀態(tài)是:" + connection.State + "<br/>"); connection.Close(); Response.Write("時間" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "當(dāng)前數(shù)據(jù)庫連接狀態(tài)是:" + connection.State + "<br/>");【技巧】利用Visual Studio數(shù)據(jù)源控件生成數(shù)據(jù)庫連接字符串。根據(jù)向?qū)А靶陆ㄟB接”后,會出現(xiàn)一個“添加連接”的對話框,在這里可以根據(jù)實(shí)際需要更改數(shù)據(jù)源。這個連接向?qū)渲眠B接到Access數(shù)據(jù)庫文件、ODBC數(shù)據(jù)源、SQL Server數(shù)據(jù)庫、SQL Server手機(jī)版數(shù)據(jù)庫、SQL Server數(shù)據(jù)庫文件、Oracle數(shù)據(jù)庫文件及其它數(shù)據(jù)庫。 在這里我們選擇Microsoft SQL Server選項,連接到SQL Server數(shù)據(jù)庫。如果我們在局域網(wǎng)中,我們可以點(diǎn)擊“添加連接”界面中的刷新按鈕來查看局域網(wǎng)中有哪些SQL Server數(shù)據(jù)庫可以連接。連接到數(shù)據(jù)庫可以用下面的方式:
(1)如果要連接的數(shù)據(jù)庫服務(wù)器與開發(fā)者的機(jī)器在同一個局域網(wǎng)里,可以使用局域網(wǎng)IP地址或者局域網(wǎng)中的電腦主機(jī)名;
(2)如果要連接的數(shù)據(jù)庫服務(wù)器與開發(fā)者的機(jī)器不在同一個局域網(wǎng)內(nèi),那么就要求數(shù)據(jù)庫服務(wù)器必須有一個公網(wǎng)IP,我們可以使用公網(wǎng)IP來連接,如果數(shù)據(jù)庫服務(wù)器還有互聯(lián)網(wǎng)域名,那么用互聯(lián)網(wǎng)域名也是可以的。
(3)如果要連接的數(shù)據(jù)庫服務(wù)器與開發(fā)者所使用的機(jī)器是同一臺機(jī)器,那么可以使用以下幾種方式之一:”(local)”或者”.”或者”127.0.0.1”。 需要注意的是,如果在一臺機(jī)器上運(yùn)行者同一種數(shù)據(jù)庫的不同版本,比如說在”xxxxx”這臺主機(jī)上同時運(yùn)行著SQL 2000、SQL 2005和SQL Express三種版本,并且它們所使用的Windows服務(wù)名分別為”SQL2000”、”SQL2005”和”SQLExpress”,那么我們要連接到SQL 2000這個數(shù)據(jù)庫上所使用的服務(wù)器名就應(yīng)該填寫”xxxxx\SQL2000”這種“主機(jī)名\實(shí)例名”的方式或者“主機(jī)IP\實(shí)例名”,這種情況在同時安裝了Visual Studio 和SQL 的朋友那里很常見,因為SQL Express是針對學(xué)生的功能有限的免費(fèi)版本,這個版本的數(shù)據(jù)庫在安裝Visual Studio 時默認(rèn)是一同安裝的。點(diǎn)擊一下“測試連接”按鈕,如果彈出連接成功的提示消息就表示這個數(shù)據(jù)庫連接是可用的。點(diǎn)擊“確定”按鈕,回到“配置數(shù)據(jù)源”界面,這時候點(diǎn)擊連接字符串旁邊的”+”按鈕就可以看到數(shù)據(jù)庫的連接字符串信息。
?
二、Command對象
Command對象也稱為數(shù)據(jù)庫命令對象,Command對象主要執(zhí)行包括添加、刪除、修改及查詢數(shù)據(jù)的操作的命令。也可以用來執(zhí)行存儲過程。用于執(zhí)行存儲過程時需要將Command對象的CommandType 屬性設(shè)置為CommandType.StoredProcedure,默認(rèn)情況下CommandType 屬性為CommandType.Text,表示執(zhí)行的是普通SQL語句。
Command主要有三個方法:
ExecuteNonQuery():執(zhí)行一個SQL語句,返回受影響的行數(shù),這個方法主要用于執(zhí)行對數(shù)據(jù)庫執(zhí)行增加、更新、刪除操作,注意查詢的時候不是調(diào)用這個方法。
ExecuteReader ():執(zhí)行一個查詢的SQL語句,返回一個DataReader對象。
SqlConnection Conn = new SqlConnection(); Conn.ConnectionString = "server=localhost;database=pubs;uid=sa;pwd=''"; Conn.Open(); SqlCommand Comm = new SqlCommand("select * from Authors", Conn); SqlDataReader dr = Comm.ExecuteReader(); dg.DataSource = dr; dg.DataBind(); Conn.Close();?ExecuteScalar ():從數(shù)據(jù)庫檢索單個值。這個方法主要用于統(tǒng)計操作。ExecuteScalar ()這個方法是針對SQL語句執(zhí)行的結(jié)果是一行一列的結(jié)果集,這個方法只返回查詢結(jié)果集的第一行第一列。
OleDbConnection conn = new OleDbConnection(); conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source=" + Server.MapPath("person.mdb"); conn.Open(); string strSQL = "select avg(數(shù)學(xué)) from grade"; OleDbCommand Comm = new OleDbCommand(strSQL, conn); double d = (double)Comm.ExecuteScalar();Message.Text = "所有人數(shù)學(xué)的平均成績?yōu)?#xff1a;"+d.ToString()+"分"; conn.Close();【注意】在操作數(shù)據(jù)庫的時候,為了提高性能,都遵循一個原則:數(shù)據(jù)庫連接對象應(yīng)該盡可能晚打開,盡可能早關(guān)閉。在上面的例子中,在Command對象需要執(zhí)行數(shù)據(jù)庫操作之前才打開數(shù)據(jù)庫連接對象,執(zhí)行數(shù)據(jù)庫操作之后馬上就關(guān)閉了數(shù)據(jù)庫連接對象。
三、DataReader對象
DataReader對象是一個讀取行的只讀流的方式,綁定數(shù)據(jù)時比使用數(shù)據(jù)集方式性能要高,因為它是只讀的,所以如果要對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行修改就需要借助其它方法將所作的更改保存到數(shù)據(jù)庫。
DataReader對象不能通過直接實(shí)例化,必須借助與相關(guān)的Command對象來創(chuàng)建實(shí)例,例如用SqlCommand的實(shí)例的ExecuteReader()方法可以創(chuàng)建SqlDataReader實(shí)例。因為DataReader對象讀取數(shù)據(jù)時需要與數(shù)據(jù)庫保持連接,所以在使用完DataReader對象讀取完數(shù)據(jù)之后應(yīng)該立即調(diào)用它的Close()方法關(guān)閉,并且還應(yīng)該關(guān)閉與之相關(guān)Connection對象。在.net類庫中提供了一種方法,在關(guān)閉DataReader對象的同時自動關(guān)閉掉與之相關(guān)的Connection對象,使用這種方法是可以為ExecuteReader()方法指定一個參數(shù),如: SqlDataReader reader =command.ExecuteReader(CommandBehavior.CloseConnection); CommandBehavior是一個枚舉,上面使用了CommandBehavior枚舉的CloseConnection值,它能在關(guān)閉SqlDataReader時關(guān)閉相應(yīng)的SqlConnection對象。
并且DataReader對象讀取數(shù)據(jù)有三種方式:
一種是按查詢的時候列的索引用指定的方式來讀取列值,無需做相應(yīng)轉(zhuǎn)換,如GetByte(int i)就是讀取第i列的值并且轉(zhuǎn)換成byte類型的值。第這種方法的優(yōu)點(diǎn)是指定列后直接將該列的直接讀取出來了,無需再轉(zhuǎn)換,缺點(diǎn)是一旦指定的列不能按照指定的方式轉(zhuǎn)換時就會拋出異常,比如數(shù)據(jù)庫里字段的類型是string類型或者該字段的值為空時按照GetByte(i)這種方式讀取會拋出異常。
第二種方式就是按照列索引的方式讀取,在讀取的時候并不進(jìn)行值轉(zhuǎn)換,如:reader[5]就是讀取第5列的值(這里reader是一個Reader對象的實(shí)例),這樣得到的值是一個object類型的值,這也很好理解,因為在數(shù)據(jù)庫可能存儲各種類型的值,而object是所有類的基類,所以這個方法不會拋出異常。如果要得到它的正確類型,還需要根據(jù)數(shù)據(jù)庫里的字段進(jìn)行進(jìn)行相應(yīng)轉(zhuǎn)換。
最后一種是按照列名的方式去讀,并且在讀的時候也不進(jìn)行相應(yīng)轉(zhuǎn)換,得到的是object類型的值。 綜合前面三種方式各有特點(diǎn),第一種方式最直接,但是有可能拋出異常,第二種方式比第一種稍微靈活一些,我們可以根據(jù)讀取到值為空(在.net里用DBNull類來表示,可以表示數(shù)據(jù)庫中任意數(shù)據(jù)類型的空值),我們就不進(jìn)行相應(yīng)的類型轉(zhuǎn)換,避免出現(xiàn)異常。第三種方式按照列的名字來讀取數(shù)據(jù),也需要按照第二種方式進(jìn)行一定的轉(zhuǎn)換。就性能來說第一種最高,第二種稍低,第三種最低(這很好理解,假設(shè)要在一個旅館里找人直通過房間號找肯定比通過名字找快),就靈活性來說第三種最靈活,第二種次之,第一種最不靈活(假如在后來編寫SQL語句中更改了列的索引,第一種和第二種都可能出現(xiàn)問題)。實(shí)際開發(fā)中根據(jù)實(shí)際情況選擇合適的方式。
使用 DataReader 檢索數(shù)據(jù)的步驟:
1、創(chuàng)建 Command 對象
2、調(diào)用 ExecuteReader() 創(chuàng)建 DataReader 對象
3、使用 DataReader 的 Read() 方法逐行讀取數(shù)據(jù)
4、讀取某列的數(shù)據(jù),(type)dataReader[ ]
5、關(guān)閉 DataReader 對象
注意:DataReader 使用后必須關(guān)閉
參考代碼:
string sql = "SELECT StudentName FROM Student WHERE StudentName LIKE '李%'";SqlCommand command = new SqlCommand(sql, connection);connection.Open();SqlDataReader dataReader = command.ExecuteReader();Console.WriteLine("查詢結(jié)果:");while (dataReader.Read()){Console.WriteLine((string)dataReader["StudentName"]);}dataReader.Close();四、DataAdapter對象
DataAdapter對象也稱之為數(shù)據(jù)適配器對象,DataAdapter對象利用數(shù)據(jù)庫連接對象(Connection)連接的數(shù)據(jù)源,使用數(shù)據(jù)庫命令對象(Command)規(guī)定的操作從數(shù)據(jù)源中檢索出數(shù)據(jù)送往數(shù)據(jù)集對象(DataSet),或者將數(shù)據(jù)集中經(jīng)過編輯后的數(shù)據(jù)送回數(shù)據(jù)源。 數(shù)據(jù)適配器將數(shù)據(jù)填入數(shù)據(jù)集時調(diào)用方法Fill(),語句如下:
dataAdapter1.Fill (dataTable);
或者
//填充dataSet11數(shù)據(jù)集中的"Products"表
dataAdapter1.Fill (dataSet11, "Products");
當(dāng)dataAdapter1調(diào)用Fill() 方法時將使用與之相關(guān)聯(lián)的命令組件所指定的 SELECT 語句從數(shù)據(jù)源中檢索行。然后將行中的數(shù)據(jù)添加到 DataSet 中的DataTable 對象中或者直接填充到DataTable的實(shí)例中,如果 DataTable 對象不存在,則自動創(chuàng)建該對象。 當(dāng)執(zhí)行上述SELECT語句時,與數(shù)據(jù)庫的連接必須有效,但不需要用語句將連接對象打開。如果調(diào)用Fill()方法之前與數(shù)據(jù)庫的連接已經(jīng)關(guān)閉,則將自動打開它以檢索數(shù)據(jù),執(zhí)行完畢后再自動將其關(guān)閉。如果調(diào)用Fill()方法之前連接對象已經(jīng)打開,則檢索后繼續(xù)保持打開狀態(tài)。
注意:一個數(shù)據(jù)集中可以放置多張數(shù)據(jù)表。但是每個數(shù)據(jù)適配器只能夠?qū)?yīng)于一張數(shù)據(jù)表。
五、DataSet對象
DataSet對象也稱為數(shù)據(jù)集對象,DataSet對象用于表示那些儲存在內(nèi)存中的數(shù)據(jù),它相當(dāng)于一個內(nèi)存中的數(shù)據(jù)庫。它可以包括多個DataTable對象及DataView對象。DataSet主要用于管理存儲在內(nèi)存中的數(shù)據(jù)以及對數(shù)據(jù)的斷開操作。 由于DataSet對象提供了一個離線的數(shù)據(jù)源,這樣減輕了數(shù)據(jù)庫以及網(wǎng)絡(luò)的負(fù)擔(dān),在設(shè)計程序的時候可以將DataSet對象作為程序的數(shù)據(jù)源。
六、DataTable對象
DataTable 是 ADO.NET 庫中的核心對象,就像普通的數(shù)據(jù)庫中的表一樣,它也有行和列。它主要包括DataRow和DataColumn,分別代表行和列。
(1) 數(shù)據(jù)行(DataRow)
數(shù)據(jù)行是給定數(shù)據(jù)表中的一行數(shù)據(jù),或者說是數(shù)據(jù)表中的一條記錄。它可能代表一個學(xué)生、一位用戶、一張訂單或者一件貨物的相關(guān)數(shù)據(jù)。DataRow對象的方法提供了對表中數(shù)據(jù)的插入、刪除、更新和查看等功能。提取數(shù)據(jù)表中的行的語句如下:
DataRow dr = dt.Rows[n];
其中:DataRow代表數(shù)據(jù)行類;dr是數(shù)據(jù)行對象;dt代表數(shù)據(jù)表對象; n代表行的序號(序號從0開始)。
(2) 數(shù)據(jù)列(DataColumn)
數(shù)據(jù)表中的數(shù)據(jù)列(又稱字段)定義了表的數(shù)據(jù)結(jié)構(gòu),例如,可以用它確定列中的數(shù)據(jù)類型和大小,還可以對其他屬性進(jìn)行設(shè)置。例如,確定列中的數(shù)據(jù)是否是只讀的、是否是主鍵、是否允許空值等;還可以讓列在一個初始值的基礎(chǔ)上自動增殖,增值的步長還可以自行定義。 某列的值需要在數(shù)據(jù)行的基礎(chǔ)上進(jìn)行。語句如下:
?如若想取出數(shù)據(jù)表(dt)中第3條記錄中的“姓名”字段,并將該字段的值放入一輸入框(textBox1)中時,語句可以寫成:?
DataRow dRow = dt.Rows[2 ]; // 從數(shù)據(jù)表提取行 string textBox1.Text=dRow["CompanyName"].ToString(); // 從行中取出字段的值?一個基本的例子
//實(shí)例化Connection對象 SqlConnection connection = new SqlConnection("Data Source=(local);Initial Catalog=數(shù)據(jù)庫名;Persist Security Info=True;User ID=sa;Password=sa"); connection.open(); //要執(zhí)行查詢,則先需要實(shí)例化Command對象, SqlCommand command = new SqlCommand("select * from UserInfo where sex=0", connection); SqlDataAdapter adapter = new SqlDataAdapter(command); /* 下面的被注釋掉的代碼與上面的代碼是等效的 SqlDataAdapter adapter = new SqlDataAdapter("select * from UserInfo where sex=0",connection); */ DataTable data = new DataTable(); adapter.Fill(data); /* 下面的被注釋掉語句與上面填充DataTable的效果是一樣的,我更傾向于沒有注釋掉的部分 DataSet ds = new DataSet();//實(shí)例化DataSet adapter.Fill(ds, "UserInfo");//填充ds中的"UserInfo"表 DataTable data = ds.Tables["UserInfo"]; */ connection.close();轉(zhuǎn)載于:https://www.cnblogs.com/aito/archive/2010/08/25/1808471.html
總結(jié)
以上是生活随笔為你收集整理的ADO.NET常用对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MapReduce with Mongo
- 下一篇: 移动界面设计点滴:工欲善其事,必先利其器