ADO.NET是微軟新一代.NET數據庫的訪問架構,ADO是ActiveX Data Objects的縮寫。ADO.NET是數據庫應用程序和數據源之間溝通的橋梁,主要提供了一個面向對象的數據訪問架構,用來開發數據庫應用程序。
ADO.NET主要包括Connection、Command、DataReader、DataSet和DataAdapter對象。詳細介紹如下:
提供連接DataSet對象和數據源的橋梁,DataAdapter對象使用Command對象在數據源中執行SQL命令,
以便將數據加載到DataSet中,並確保DataSet中數據的更改與數據源保持一致。
1.使用Connection連接數據庫
在打開數據庫建立連接之前,必須先設置好連接字符串(ConnectionString)
1.直接定義在字符串中
string Connstr = "Data Source=.;Initial Catalog=MyTest;User ID=sa;Password=12345";
2.存放在應用程序的配置文件(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數據庫連接關閉");
}
2.使用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對象來具體的添加、修改、刪除數據就不舉例說明了。
3.使用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語句裡面,讓其自動完成關閉以及對象的回收工作,不必再讓我們來操心了。
e.g:
1 using (SqlConnection conn = new SqlConnection(Connstr)) 2 { 3 conn.Open(); 4 using (SqlCommand cmd = conn.CreateCommand()) 5 { 6 cmd.CommandText = "select * from Tbl_Students;"; 7 using (SqlDataReader reader = cmd.ExecuteReader()) 8 { 9 if (reader.HasRows) 10 { 11 while (reader.Read()) 12 { 13 MessageBox.Show(reader.GetString(1)); 14 } 15 } 16 } 17 18 } 19 }
4.使用DataSet和DataAdapter查詢數據
DataSet可以看作是在內存中創建的一個小型關系數據庫,它將數據庫中的數據復制了一份放到用戶本地(客戶端)的內存中,供用戶在不連接數據庫的情況下讀取數據,充分利用了客戶端資源,大大降低了數據庫服務器的壓力。它是ADO.NET最核心成員之一,它是支持ADO.NET斷開式、分布式數據方案的核心對象,也是非連接的數據查詢的核心組件。
DataAdapter對象(數據適配器)是一種用來充當DataSet對象與實際數據源之間橋梁的對象,只要有DataSet的地方就有它,專門為DataSet服務的。它的工作方式一般有兩種:一種是通過Command對象執行SQL語句從數據源中檢索數據,將獲取的結果集填充到DataSet對象的表中;另一種是把用戶對DataSet對象作出的更改寫入到數據源中。
1 using (SqlConnection conn = new SqlConnection(Connstr)) 2 { 3 conn.Open(); 4 using (SqlCommand cmd = conn.CreateCommand()) 5 { 6 //DataSet離線數據集 7 cmd.CommandText = "select * from Tbl_Students where Age<30;"; 8 DataSet dataset = new DataSet(); 9 SqlDataAdapter adapter = new SqlDataAdapter(cmd); 10 adapter.Fill(dataset); 11 ShowDsTable(dataset.Tables[0]); 12 for (int i = 0; i <=dataset.Tables[0].Rows.Count-1; i++) 13 { 14 dataset.Tables[0].Rows[i]["Name"] += i.ToString(); 15 } 16 SqlCommandBuilder builder = new SqlCommandBuilder(adapter); 17 adapter.Update(dataset); 18 ShowDsTable(dataset.Tables[0]); 19 } 20 } 21 } 22 23 private void ShowDsTable(DataTable dataTable) 24 { 25 foreach (DataRow row in dataTable.Rows) 26 { 27 string name = (string)row["Name"]; 28 int age = (int)row["Age"]; 29 MessageBox.Show("Name:" + name + ",Age:" + age.ToString()); 30 } 31 }
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");
就行啦。
關於ADO.NET基礎的一些技術就是這些了,在C#裡面連接SQL Server數據庫主要就是SqlConnection、SqlCommand、SqlDataReader、DataSet以及SqlDataAdapter這幾個類,需要重點掌握。實際開發中必須注意,必要時再打開數據庫連接並盡早關閉,比較好的使將操作放在using語句裡面,進行資源的自動釋放。。。
後記:將近一個月沒有更博了,也確實是太忙了,現在是大二下,幾乎都是滿課,實驗還挺多的。前段時間還在做兼職,然後果斷辭掉了,作為搞技術的,現在還是抓緊時間學技術為好,把一些時間抽去做兼職不僅賺不到多少錢,還把自己寶貴的時間給浪費了,累得不行不行的,真有點得不償失的感覺。以後還是多更博,踏實學技術吧。大二下,時間也不太多了,技術渣渣的,課也是滿滿的,加油吧,哎!