ADO.Net基本操作

來源:https://www.cnblogs.com/czhwust/p/4457207.html
ADO.NET是微軟新一代.NET數據庫的訪問架構,ADO是ActiveX Data Objects的縮寫。ADO.NET是數據庫應用程序和數據源之間溝通的橋樑,主要提供了一個面向對象的數據訪問架構,用來開發數據庫應用程序。
ADO.NET主要包括Connection、Command、DataReader、DataSet和DataAdapter對象。
詳細介紹如下:
Connection 主要提供與數據庫的連接功能
Command 用於返回數據、修改數據、運行存儲過程以及發送或檢索參數信息的數據庫命令
DataReader 通過Command對象提供從數據庫檢索信息的功能。以一種只讀的、向前的、快速的方式訪問數據庫
DataSet 支持ADO.NET斷開式、分佈式數據方案的核心對象。是一個數據庫容器,可以看作是內存中的數據庫
DataAdapter 提供連接DataSet對象和數據源的橋樑,DataAdapter對象使用Command對象在數據源中執行SQL命令,以便將數據加載到DataSet中,並確保DataSet中數據的更改與數據源保持一致。

使用Connection連接數據庫

在打開數據庫建立連接之前,必須先設置好連接字符串(ConnectionString)

直接定義在字符串中
string Connstr = "Data Source=.;Initial Catalog=MyTest;User ID=sa;Password=12345";
存放在應用程序的配置文件(App.Config)中(實際開發的時候一般採用這種,如果沒有App.config可以右鍵自行添加)
 <connectionStrings>
     <add name="dbConnStr" connectionString="Data Source=.;Initial Catalog=MyTest;User ID=sa;Password=12345"/>
  </connectionStrings>

在後臺代碼裏進行讀取:

 string Connstr = ConfigurationManager.ConnectionStrings["dbConnStr"].ConnectionString;

其中的參數說明如下:

DataSource爲數據源,值爲要連接的SQL Server實例的名稱或網絡地址(.表示本機的網絡地址)

Initial Catalog爲初始目錄,值爲數據庫的名稱

User ID爲用戶ID,值爲SQL Server登陸賬戶

Password爲密碼,值爲SQL Server賬戶登錄的密碼

Connect Timeout爲連接超時設定,其值表示在終止嘗試併產生錯誤之前,等待與服務器的連接的時間長度(以秒爲單位)

Integrated Security此參數決定是否是安全連接。可能的取值有True,False,SSPI(SSPI是True的同義詞)

前4個(DataSource,Initial Catalog,User ID,Password)是連接到SQL Server的連接字符串的必有項。

設置好連接字符串之後就可以使用SqlConnection對象來連接數據庫了。調用SqlConnection對象的Open或Close方法可以打開或關閉數據庫連接,必須注意必要時再打開數據庫連接並儘早關閉。

e.g:

           SqlConnection conn = new SqlConnection(Connstr);
            conn.Open();
            if (conn.State==ConnectionState.Open)
            {
                MessageBox.Show("SQL Server數據庫連接開啓");
                conn.Close();
            }
            if(conn.State==ConnectionState.Closed)
            {
                MessageBox.Show("SQL Server數據庫連接關閉");
            }

使用Command對象操作數據

屬性 說明
CommandType 獲取或設置Command對象要執行命令的類型
CommandText 獲取或設置要對數據庫執行的SQL語句或存儲過程名或表名
CommandTimeOut 獲取或設置在終止對執行命令的嘗試並生成錯誤之前的等待時間
Connection 獲取或設置此Command對象使用的Connection對象的名稱
Parameters 獲取Command對象需要使用的參數集合

創建Command對象必須指定3個屬性(Connection,CommandType,CommandText):

Connection屬性:SqlCommand是對象執行命令操作的對象,它本身無法建立與數據庫的連接,只能通過SqlConnection對象來建立連接。

CommandType和CommandText屬性:CommandText既可以是SQL語句,也可以是存儲過程,還可以是表的名字。要使用不同種類的CommandText,只需要設置相應的CommandType即可。

CommandType.Text:CommandType的默認值,表示執行的是SQL語句,爲CommandText指定SQL字符串。

CommandType.StoredProcedure:指示執行的是存儲過程,需要爲CommandText指定一個儲存過程的名稱。

CommandType.TableDirect:指示用戶將得到這個表中的所有數據,爲CommandText指定一個數據表名稱(不過還是建議直接寫SQL來實現這個功能)。
e.g:
示例1:

  using(SqlCommand cmd = new SqlCommand())//創建命令對象SqlCommand
            {
                cmd.Connection = conn;//設置連接對象
                cmd.CommandType = CommandType.Text;//設置Command對象執行語句的類型
                cmd.CommandText = "Insert into Tbl_Students values ('aaa',20,'football');";//設置執行的語句
                MessageBox.Show(cmd.ExecuteNonQuery().ToString());//ExecuteNonQuery返回執行SQL語句,受影響的行數
            }

示例2:

    using(SqlCommand cmd = new SqlCommand("Insert into Tbl_Students values ('aaa',20,'football');",conn))
            {
                MessageBox.Show(cmd.ExecuteNonQuery().ToString());
            }

示例3:

    using (SqlCommand cmd = conn.CreateCommand())
            {
                cmd.CommandText = "Delete from Tbl_Students where Name='aaa';";
                MessageBox.Show(cmd.ExecuteNonQuery().ToString());
            }
在執行Command操作時,有3種方法可用:

ExecuteNonQuery:用於非SELECT命令,比如INSERT,DELETE,UPDATE命令,返回命令所影響的數據的行數。也可以用ExecuteNonQuery來執行一些數據定義命令,比如新建、更新、刪除數據庫對象(如表、索引等)

ExecuteScalar:用於執行SELECT查詢命令,返回數據中第一行第一列的值。通常用來執行那些用到COUNT或SUM函數的SELECT命令

ExecuteReader:執行SELECT命令,並返回一個DataReader對象。

這3個方法非常重要,如果要使用ADO.NET完成某種數據庫操作,一定會用到這些方法,它們沒有優劣之分,只是使用的場合不同。

使用Command對象來具體的添加、修改、刪除數據就不舉例說明了。

使用DataReader對象讀取數據

在對數據庫中的數據進行查詢顯示操作時,就可以使用DataReader對象來實現。當Command對象返回結果集時,需要使用DataReader對象來檢索數據。DataReader對象返回一個來自Command的只讀的、只能向前的數據流。

DataReader對象是一個簡單的數據集,用於從數據源中讀取只讀的數據集,並常用於檢索大量數據。DataReader每次只能在內存中保留一行,開銷非常小。但在讀取數據時,必須一直保持與數據庫的連接(連線模式)。它是一個輕量級的數據對象,如果只需將數據讀出並顯示,那麼它是最合適的工具,它的讀取速度比DataSet(後面會講到)對象要快,佔用的資源也比DataSet少。

常用屬性:

HasRows:判斷DataReader對象中是否還有數據

FieldCount:獲取當前行的列數

RecordsAffected:獲取執行SQL語句所更改、添加或刪除的行數

常用方法:

Read:使DataReader對象前進到下一條數據

Close:關閉DataReader對象

Get:用來讀取數據集當前行的某一列的數據

e.g:

          using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    if (reader.HasRows)
                    {
                        while (reader.Read())
                        {
                            MessageBox.Show(reader.GetString(1));
                        }
                    }
                }

通過SqlCommand對象的ExecuteReader方法從數據源中檢索數據來創建SqlDataReader對象。還得注意在讀取完數據後,務必把DataReader對象關閉,否則當DataReader對象尚未關閉時,DataReader所使用的Connection對象就無法執行其他操作了。比較好的做法就是把這些全部放在using語句裏面,讓其自動完成關閉以及對象的回收工作,不必再讓我們來操心了。

using (SqlConnection conn = new SqlConnection(Connstr))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "select * from Tbl_Students;";
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        if (reader.HasRows)
                        {
                            while (reader.Read())
                            {
                                MessageBox.Show(reader.GetString(1));
                            }
                        }
                    }

                }
            }

使用DataSet和DataAdapter查詢數據

DataSet可以看作是在內存中創建的一個小型關係數據庫,它將數據庫中的數據複製了一份放到用戶本地(客戶端)的內存中,供用戶在不連接數據庫的情況下讀取數據,充分利用了客戶端資源,大大降低了數據庫服務器的壓力。它是ADO.NET最核心成員之一,它是支持ADO.NET斷開式、分佈式數據方案的核心對象,也是非連接的數據查詢的核心組件。

DataAdapter對象(數據適配器)是一種用來充當DataSet對象與實際數據源之間橋樑的對象,只要有DataSet的地方就有它,專門爲DataSet服務的。它的工作方式一般有兩種:一種是通過Command對象執行SQL語句從數據源中檢索數據,將獲取的結果集填充到DataSet對象的表中;另一種是把用戶對DataSet對象作出的更改寫入到數據源中。

using (SqlConnection conn = new SqlConnection(Connstr))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    //DataSet離線數據集
                    cmd.CommandText = "select * from Tbl_Students where Age<30;";
                    DataSet dataset = new DataSet();
                    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                    adapter.Fill(dataset);
                    ShowDsTable(dataset.Tables[0]);
                    for (int i = 0; i <=dataset.Tables[0].Rows.Count-1; i++)
                    {
                        dataset.Tables[0].Rows[i]["Name"] += i.ToString();
                    }
                    SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
                    adapter.Update(dataset);
                    ShowDsTable(dataset.Tables[0]);
                }
            }
        }

        private void ShowDsTable(DataTable dataTable)
        {
            foreach (DataRow row in dataTable.Rows)
            {
                string name = (string)row["Name"];
                int age = (int)row["Age"];
                MessageBox.Show("Name:" + name + ",Age:" + age.ToString());
            }
        }

SqlCommandBuilder對象用於自動生成表單命令,將對DataSet所做的更改與關聯的SQL Server數據庫更改相協調。

最後還有一個就是可以通過SqlCommand.Parameters屬性的參數傳值防止SQL語句注入式攻擊。

e.g:
普通的SQL語句:select * from Tbl_Students where Name=‘czh’;
簡單的SQL注入式攻擊:select * from Tbl_Students where Name=‘czh’ or ‘1’=‘1’;

改成 cmd.CommandText = “select * from Tbl_Students where Name=@Name;”;
cmd.Parameters.AddWithValue("@Name", “czh”);

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