1. ADO.NET概述
1.1. ADO.NET 對象模型
ADO.NET是微軟數據庫的範圍架構,它是數據庫應用程序和數據源之間溝通的一座橋樑,主要提供一個面向對象的數據訪問結構,在使用C#開發應用程序時,就主要使用的是ADO.NET計算訪問數據庫。
Connection對象提供與數據庫的連接功能;
Command對象用來返回數據、修改數據、運行存儲過程、發送以及檢索參數信息等數據庫命令;
DataReader對象用於通過Command對象從數據庫中檢索信息;
DataAdapter對象用於連接DataSet對象和數據源,使用Command對象在數據源中執行命令,以便將數據加載到DataSet對象中,並且確保DataSet中數據的更改與數據源保持一致;
DataSet對象是ADO.NET的核心,是一個數據庫容器,可以把它當做是一個存放在內存中的數據庫,它支持斷開式、分佈式數據方案。
1.2. 數據訪問命名空間
在C#中開發數據庫應用程序時主要有以下命名空間
System.Data //提供對錶示ADO.NET結構的類的訪問
System.Data.Common //包含由各種.NET Framework數據提供程序共享的類
System.Data.odbc //ODBC數據提供程序,用來訪問ODBC數據源的類集合
System.Data.OleDb //OLE DB數據提供程序,用於訪問OLE DB數據源的類集合
System.Data.SqlClient //SQL服務器數據提供程序,用於訪問SQL Server數據庫的類集合
System.Data.SqlTypes //提供SQL Server中本機數據類型
System.Data.OracleClient //用於Oracle的數據提供程序,用於訪問Oracle數據源的類集合
本博客主要使用System.Data.SqlClient
命名空間進行編程
2. Connection數據連接對象
2.1. Connection對象
Connection對象主要用作提供與數據庫的連接功能,所有對數據庫的訪問操作都是從建立數據庫連接開始的。
它的一些屬性描述了數據源和用戶身份驗證。
例如:連接SQL Server數據庫
string connectionString="Server=服務器名;User Id=用戶;Pwd=密碼;DataBase=數據庫名稱";
連接Access 數據庫
string connectionString="provide=提供者; Data Source=Access文件路徑";
2.2. 應用SQLConnection對象連接數據庫
調用Connection對象的Open方法或Close方法可以打開或關閉數據庫連接,而且必須在設置好數據庫連接字符串後才能調用Open方法,否則Connection對象不知道要與哪個數據庫建立連接。
一個典型的數據庫連接字符串如下所示:
// 連接SQL Server數據庫,服務器名爲localhost,要連接的數據庫爲master,user id是sa,密碼是admin
String str = "Server=localhost;Database=master;User Id=sa;pwd=admin;";
有了數據庫連接字符串之後就可以進行數據庫連接了,如下面代碼所示:
// .aspx文件
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</div>
<div>
<asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
</div>
</form>
</body>
// .aspx.cs文件
using System.Data.SqlClient; // 添加命名空間
protected void Page_Load(object sender, EventArgs e){
String str = "Server=mySQLServer;Database=master;User Id=sa;pwd=admin";
SqlConnection sqlConnection = new SqlConnection(str);
sqlConnection.Open();
// 若數據庫連接成功則顯示數據庫已連接
if (sqlConnection.State == System.Data.ConnectionState.Open) {
Label1.Text = "數據庫已連接";
sqlConnection.Close(); // 關閉連接
}
if (sqlConnection.State == System.Data.ConnectionState.Closed) {
Label2.Text = "數據庫連接已關閉";
}
}
運行結果如下圖所示,數據庫連接成功,然後又關閉了連接。
3. Command命令執行對象
3.1. Command對象
連接好數據庫後要對數據庫進行操作,就需要用到Command對象。
使用Connection對象與數據源建立連接後,可以使用Command對象對數據源執行查詢、添加、刪除和修改等各種操作,操作實現的方式可以是使用SQL語句,也可以是使用存儲過程。
根據.NET Framework數據提供程序的不同,Command對象可以分成4種,分別是SqlCommand、OleDbCommand、 OdbcCommand和OracleCommand,在實際的編程過程中應該根據訪問的數據源不同,選擇相對應的Command對象。
Command對象常用的一些屬性如下表所示:
屬性 | 說明 |
---|---|
CommandType | 設置Command對象要執行命令的類型 |
CommandText | 設置要執行的SQL語句、存儲過程名或則表名 |
CommandTimeOut | 設置在終止對執行命令的嘗試並生成錯誤之前的等待時間 |
Connection | 設置Command對象使用的Connection對象的名稱 |
Parameters | 獲取Command對象需要使用的參數集合 |
以及Command對象的常用方法,如下表所示:
方法 | 說明 |
---|---|
ExecuteNonQuery | 用於執行insert、delete或者update命令,並返回命令影響數據的行數;另外也可以用來執行一些數據定義命令,比如create、alter、drop表和索引等 |
ExecuteScalar | 用於執行select命令,返回數據中第一個記錄的第一個字段的值,該方法通常用來執行那些用到count或sum函數的select命令 |
ExecuteReader | 執行select命令,並返回一個DataReader對象,這個DataReader對象是一個向前只讀的數據集,可用於循環取出所有select查詢到的數據 |
3.2. 應用Command對象操作數據
以操作SQL Server數據庫爲例,向數據庫中添加記錄時,首先要創建SqlConnection對象連接數據庫,然後定義添加數據的SQL字符串,最後調用SqICommand對象的ExecuteNonQuery方法執行數據的添加操作。
例如,下面的代碼用Command對象往SQL Server數據庫插入一條數據(數據庫和表要提取創建)
// .aspx文件
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="圖書編號"></asp:Label>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</div>
<div>
<asp:Label ID="Label2" runat="server" Text="圖書名稱"></asp:Label>
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
</div>
<div>
<asp:Button ID="Button1" runat="server" Text="添加" OnClick="Button1_Click" />
</div>
</form>
</body>
// .aspx.cs文件
protected void Page_Load(object sender, EventArgs e){}
protected void Button1_Click(object sender, EventArgs e){
// 創建數據庫連接對象
String connectStr = "Server=DEITIVOD;Database=db_LibraryMS;User Id=sa;pwd=admin";
SqlConnection sqlConnection = new SqlConnection(connectStr);
// 插入語句
String insertStr = "insert into tb_bookinfo(book_code, book_name) values ('" + TextBox1.Text +"','" + TextBox2.Text +"')";
SqlCommand sqlCommand = new SqlCommand(insertStr, sqlConnection);
// 打開數據庫連接
sqlConnection.Open();
// 執行插入語句
sqlCommand.ExecuteNonQuery();
// 關閉數據庫連接
sqlConnection.Close();
Response.Write("添加成功"); // 如果沒有發生錯誤則提示添加成功
}
運行結果如下圖所示
進入SQL Server中查看數據庫,有如下結果:
3.3. 應用Command對象調用存儲過程
存儲過程在數據庫應用中十分常見,因此學會調用存儲過程是十分有必要的
下面用一段代碼詳細演示如何調用存儲過程,首先在SQLServer中創建存儲過程
找到數據庫->可編程性->存儲過程->右鍵->新建->存儲過程,輸入以下代碼
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE proc_AddData
@book_code varchar(10),
@book_name varchar(10)
AS
BEGIN
insert into tb_bookinfo(book_code, book_name) values (@book_code, @book_name);
END
GO
如何用ASP寫如下代碼:
// .aspx文件
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="圖書編號"></asp:Label>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</div>
<div>
<asp:Label ID="Label2" runat="server" Text="圖書名稱"></asp:Label>
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
</div>
<div>
<asp:Button ID="Button1" runat="server" Text="添加" OnClick="Button1_Click" />
</div>
</form>
</body>
// .aspx.cs 文件
protected void Page_Load(object sender, EventArgs e){}
protected void Button1_Click(object sender, EventArgs e){
// 創建數據庫連接對象
String connectStr = "Server=DEITIVOD;Database=db_LibraryMS;User Id=sa;pwd=admin";
SqlConnection sqlConnection = new SqlConnection(connectStr);
SqlCommand sqlCommand = new SqlCommand();
sqlCommand.Connection = sqlConnection;
sqlCommand.CommandType = CommandType.StoredProcedure; // 指定SQLCommand要處理的對象爲存儲過程
sqlCommand.CommandText = "proc_AddData"; // 指定存儲過程名
// 傳入兩個參數
sqlCommand.Parameters.Add("@book_code", SqlDbType.VarChar, 10).Value = TextBox1.Text;
sqlCommand.Parameters.Add("@book_name", SqlDbType.VarChar, 10).Value = TextBox2.Text;
// 打開數據庫連接
sqlConnection.Open();
// 執行插入語句
sqlCommand.ExecuteNonQuery();
// 關閉數據庫連接
sqlConnection.Close();
Response.Write("添加成功");
}
執行代碼後,進入SQLServer查看數據庫,如圖所示,插入成功
4. DataReader數據讀取對象
4.1. DataReader對象概述
DataReader對象是一個簡單的數據集,它主要用於從數據源中讀取只讀的數據集,其常用於檢索大量數據。使用DataReader對象讀取數據時,必須一直保持與數據庫的連接,即不能用Close方法關閉數據庫連接,所以也被稱爲連線模式。
DataReader對象常用的屬性和方法有:
屬性 | 說明 |
---|---|
HasRows | 判斷數據庫中是否有數據 |
FieldCount | 獲取當前行的列數 |
RecordsAffected | 獲取執行SQL語句所更改、添加或刪除的行數 |
方法 | 說明 |
---|---|
Read | 使DataReader對象前進到下一條記錄 |
Close | 關閉DataReader對象 |
Get | 用來讀取數據集的當前行的某一列的數據 |
4.2. 使用DataReader對象檢索數據
使用DataReader對象讀取數據時,首先需要使用其HasRows屬性判斷是否有數據可供讀取,如果有數據,返回True,否則返回False
然後再使用DataReader對象的的Read方法來循環讀取數據表中的數據:最後通過訪問DataReader對象的列索引來獲取讀取到的值,例如,sqldr[“ID”]用來 獲取數據表中ID列的值。
下面的代碼實現了利用SQLDataReader對象從數據庫中查詢記錄的功能:
// .aspx文件
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
</div>
<div>
<asp:Button ID="Button1" runat="server" Text="查詢" OnClick="Button1_Click" />
</div>
<div>
<asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None">
<AlternatingRowStyle BackColor="White" ForeColor="#284775" />
<EditRowStyle BackColor="#999999" />
<FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
<RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
<SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
<SortedAscendingCellStyle BackColor="#E9E7E2" />
<SortedAscendingHeaderStyle BackColor="#506C8C" />
<SortedDescendingCellStyle BackColor="#FFFDF8" />
<SortedDescendingHeaderStyle BackColor="#6F8DAE" />
</asp:GridView>
</div>
</form>
</body>
// .aspx.cs文件
protected void Page_Load(object sender, EventArgs e){}
protected void Button1_Click(object sender, EventArgs e){
// 創建數據庫連接對象
String connectStr = "Server=DEITIVOD;Database=db_LibraryMS;User Id=sa;pwd=admin";
SqlConnection sqlConnection = new SqlConnection(connectStr);
// 從tb_bookinfo表裏查詢book_code值爲TextBox3.Text的記錄
SqlCommand sqlCommand = new SqlCommand(
"select * from tb_bookinfo where book_code ='" + TextBox3.Text + "';", sqlConnection);
// 打開數據庫連接
sqlConnection.Open();
// 創建SQLDataReader對象
SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
GridView1.DataSource = sqlDataReader;
GridView1.DataBind();
// 關閉SQLDateReader對象
sqlDataReader.Close();
// 關閉數據庫連接
sqlConnection.Close();
Response.Write("查詢成功");
}
執行結果如下圖所示:
5. DataSet對象和DataAdapter對象
5.1. DataSet和DataAdapter對象概述
DataSet對象
DataSet對象是ADO.NET的核心成員,它是支持ADO.NET斷開式、分佈式數據方案的核心對象,也是實現基於非連接的數據查詢的核心組件。DataSet對象是創建在內存中的集合對象,它可以包含任意數量的數據表以及所有表的約束、索引和關係等,它實質上相當於在內存中的一個小型關係數據庫,DataSet對象通常與DataAdapter對象配合使用。
一個DataSet對象包含一組DataTable對象和DataRelation對象,其中每個DataTable對象都由DataColumn(數據列對象)、DataRow(數據行對象)和Constraint(數據約束對象)集合對象組成。
DataAdapter對象
DataAdapter對象(即數據適配器)是一種用來充當DataSet對象與實際數據源之間橋樑的對象,可以說只要有DataSet對象的地方就有DataAdapter對象,它也是專門爲DataSet對象服務的。
DataAdapter對 象的工作方式一般有兩種:
- 通過Command對象執行SQL語句,從而從數據源中檢索數據,並將檢索到的結果集填充到DataSet對象中
- 把用戶對DataSet對象作出的更改寫入到數據源中。
DataAdapter對象常用的屬性和方法有:
屬性 | 說明 |
---|---|
SelectCommand | 在數據源中查詢記錄的命令 |
InsertCommand | 將新記錄插入到數據源中的命令 |
UpdateCommand | 用於更新數據源中記錄的命令 |
DeleteCommapd | 用於從數據集中刪除記錄的命令 |
方法 | 說明 |
---|---|
Fill | 從數據源中提取數據以填充數據集 |
Update | 更新數據源 |
5.3. 填充DataSet數據集
使用DataAdapter對象填充DataSet數據集時,需要用到其Fill方法,該方法最常用的3種重載形式如下:
- int Fill(DataSet dataset):添加或更新參數所指定的DataSet數據集,返回值是影響的行數。
- int Fill(DataTable datatable):將數據填充到一個數據表中。
- int Fill(DataSet dataset,String tableName):填充指定的DataSet數據集中的指定表。
下面代碼使用了DataAdapter對象填充DataSet數據庫,以獲取並顯示數據表中的所有記錄
// .aspx文件
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None">
<AlternatingRowStyle BackColor="White" ForeColor="#284775" />
<EditRowStyle BackColor="#999999" />
<FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
<RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
<SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
<SortedAscendingCellStyle BackColor="#E9E7E2" />
<SortedAscendingHeaderStyle BackColor="#506C8C" />
<SortedDescendingCellStyle BackColor="#FFFDF8" />
<SortedDescendingHeaderStyle BackColor="#6F8DAE" />
</asp:GridView>
</div>
</form>
</body>
// .aspx.cs文件
protected void Page_Load(object sender, EventArgs e){
// 創建數據庫連接對象
String connectStr = "Server=DEITIVOD;Database=db_LibraryMS;User Id=sa;pwd=admin";
SqlConnection sqlConnection = new SqlConnection(connectStr);
String selectStr = "select * from tb_bookinfo;";
// 創建SqlDataAdapter對象
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(selectStr, sqlConnection);
// 創建SqlDataSet對象
DataSet dataSet = new DataSet();
sqlDataAdapter.Fill(dataSet);
// 將dataSet中的數據綁定到GridView中
GridView1.DataSource = dataSet;
GridView1.DataBind();
}
執行效果如下所示:
從上面的代碼中可以看出,使用DataAdapter和DataSet查詢數據時,並不需要顯式地打開和關閉數據庫連接,這就是無連接模式優點。
5.4. DataSet對象與DataReader對象的區別
ADO.NET中提供了兩個對象用於檢索關係數據:DataSet對象與DataReader對象,其中DataSet對象是將用戶需要的數據從數據庫中複製下來,並存儲在內存中,用戶是對內存中的數據直接操作
而DataReader對象則像一根管道,連接到數據庫上,抽取出用戶需要的數據後,管道斷開,所以用戶在使用DataReader對象讀取數據時,一定要保證數據庫的連接狀態是開啓的,而使用DataSet對象時就沒有這個必要。