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