ADO.NET 數據庫訪問技術 以SQL Server爲例詳解

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對 象的工作方式一般有兩種:

  1. 通過Command對象執行SQL語句,從而從數據源中檢索數據,並將檢索到的結果集填充到DataSet對象中
  2. 把用戶對DataSet對象作出的更改寫入到數據源中。

DataAdapter對象常用的屬性和方法有:

屬性 說明
SelectCommand 在數據源中查詢記錄的命令
InsertCommand 將新記錄插入到數據源中的命令
UpdateCommand 用於更新數據源中記錄的命令
DeleteCommapd 用於從數據集中刪除記錄的命令
方法 說明
Fill 從數據源中提取數據以填充數據集
Update 更新數據源

5.3. 填充DataSet數據集

使用DataAdapter對象填充DataSet數據集時,需要用到其Fill方法,該方法最常用的3種重載形式如下:

  1. int Fill(DataSet dataset):添加或更新參數所指定的DataSet數據集,返回值是影響的行數。
  2. int Fill(DataTable datatable):將數據填充到一個數據表中。
  3. 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對象時就沒有這個必要。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章