ADO.NET是微軟新一代.NET數(shù)據(jù)庫的訪問架構(gòu),ADO是ActiveX Data Objects的縮寫。ADO.NET是數(shù)據(jù)庫應用程序和數(shù)據(jù)源之間溝通的橋梁,主要提供了一個面向?qū)ο蟮臄?shù)據(jù)訪問架構(gòu),用來開發(fā)數(shù)據(jù)庫應用程序。
ADO.NET主要包括Connection、Command、DataReader、DataSet和DataAdapter對象。詳細介紹如下:
對象名稱 | 說明 |
Connection | 主要提供與數(shù)據(jù)庫的連接功能 |
Command | 用于返回數(shù)據(jù)、修改數(shù)據(jù)、運行存儲過程以及發(fā)送或檢索參數(shù)信息的數(shù)據(jù)庫命令 |
DataReader | 通過Command對象提供從數(shù)據(jù)庫檢索信息的功能。以一種只讀的、向前的、快速的方式訪問數(shù)據(jù)庫 |
DataSet | 支持ADO.NET斷開式、分布式數(shù)據(jù)方案的核心對象。是一個數(shù)據(jù)庫容器,可以看作是內(nèi)存中的數(shù)據(jù)庫 |
DataAdapter | 提供連接DataSet對象和數(shù)據(jù)源的橋梁,DataAdapter對象使用Command對象在數(shù)據(jù)源中執(zhí)行SQL命令, 以便將數(shù)據(jù)加載到DataSet中,并確保DataSet中數(shù)據(jù)的更改與數(shù)據(jù)源保持一致。 |
1.使用Connection連接數(shù)據(jù)庫
在打開數(shù)據(jù)庫建立連接之前,必須先設置好連接字符串(ConnectionString)
1.直接定義在字符串中
string Connstr = "Data Source=.;Initial Catalog=MyTest;User ID=sa;PassWord=12345";
2.存放在應用程序的配置文件(App.Config)中(實際開發(fā)的時候一般采用這種,......)
<connectionStrings> <add name="dbConnStr" connectionString="Data Source=.;Initial Catalog=MyTest;User ID=sa;Password=12345"/> </connectionStrings>
在后臺代碼里進行讀取:
string Connstr = ConfigurationManager.ConnectionStrings["dbConnStr"].ConnectionString;
其中的參數(shù)說明如下:
DataSource為數(shù)據(jù)源,值為要連接的SQL Server實例的名稱或網(wǎng)絡地址(.表示本機的網(wǎng)絡地址)
Initial Catalog為初始目錄,值為數(shù)據(jù)庫的名稱
User ID為用戶ID,值為SQL Server登陸賬戶
Password為密碼,值為SQL Server賬戶登錄的密碼
Connect Timeout為連接超時設定,其值表示在終止嘗試并產(chǎn)生錯誤之前,等待與服務器的連接的時間長度(以秒為單位)
Integrated Security此參數(shù)決定是否是安全連接。可能的取值有True,F(xiàn)alse,SSPI(SSPI是True的同義詞)
前4個(DataSource,Initial Catalog,User ID,Password)是連接到SQL Server的連接字符串的必有項。
設置好連接字符串之后就可以使用SqlConnection對象來連接數(shù)據(jù)庫了。調(diào)用SqlConnection對象的Open或Close方法可以打開或關閉數(shù)據(jù)庫連接,必須注意必要時再打開數(shù)據(jù)庫連接并盡早關閉。
e.g:
SqlConnection conn = new SqlConnection(Connstr); conn.Open(); if (conn.State==ConnectionState.Open) { MessageBox.Show("SQL Server數(shù)據(jù)庫連接開啟"); conn.Close(); } if(conn.State==ConnectionState.Closed) { MessageBox.Show("SQL Server數(shù)據(jù)庫連接關閉"); }
2.使用Command對象操作數(shù)據(jù)
屬性 | 說明 |
CommandType | 獲取或設置Command對象要執(zhí)行命令的類型 |
CommandText | 獲取或設置要對數(shù)據(jù)庫執(zhí)行的SQL語句或存儲過程名或表名 |
CommandTimeOut | 獲取或設置在終止對執(zhí)行命令的嘗試并生成錯誤之前的等待時間 |
Connection | 獲取或設置此Command對象使用的Connection對象的名稱 |
Parameters | 獲取Command對象需要使用的參數(shù)集合 |
創(chuàng)建Command對象必須指定3個屬性(Connection,CommandType,CommandText):
Connection屬性:SqlCommand是對象執(zhí)行命令操作的對象,它本身無法建立與數(shù)據(jù)庫的連接,只能通過SqlConnection對象來建立連接。
CommandType和CommandText屬性:CommandText既可以是SQL語句,也可以是存儲過程,還可以是表的名字。要使用不同種類的CommandText,只需要設置相應的CommandType即可。
CommandType.Text:CommandType的默認值,表示執(zhí)行的是SQL語句,為CommandText指定SQL字符串。
CommandType.StoredPRocedure:指示執(zhí)行的是存儲過程,需要為CommandText指定一個儲存過程的名稱。
CommandType.TableDirect:指示用戶將得到這個表中的所有數(shù)據(jù),為CommandText指定一個數(shù)據(jù)表名稱(不過還是建議直接寫SQL來實現(xiàn)這個功能)。
e.g:
示例1:
using(SqlCommand cmd = new SqlCommand())//創(chuàng)建命令對象SqlCommand { cmd.Connection = conn;//設置連接對象 cmd.CommandType = CommandType.Text;//設置Command對象執(zhí)行語句的類型 cmd.CommandText = "Insert into Tbl_Students values ('aaa',20,'football');";//設置執(zhí)行的語句 MessageBox.Show(cmd.ExecuteNonQuery().ToString());//ExecuteNonQuery返回執(zhí)行SQL語句,受影響的行數(shù) }
示例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()); }
在執(zhí)行Command操作時,有3種方法可用:
ExecuteNonQuery:用于非SELECT命令,比如INSERT,DELETE,UPDATE命令,返回命令所影響的數(shù)據(jù)的行數(shù)。也可以用ExecuteNonQuery來執(zhí)行一些數(shù)據(jù)定義命令,比如新建、更新、刪除數(shù)據(jù)庫對象(如表、索引等)
ExecuteScalar:用于執(zhí)行SELECT查詢命令,返回數(shù)據(jù)中第一行第一列的值。通常用來執(zhí)行那些用到COUNT或SUM函數(shù)的SELECT命令
ExecuteReader:執(zhí)行SELECT命令,并返回一個DataReader對象。
這3個方法非常重要,如果要使用ADO.NET完成某種數(shù)據(jù)庫操作,一定會用到這些方法,它們沒有優(yōu)劣之分,只是使用的場合不同。
使用Command對象來具體的添加、修改、刪除數(shù)據(jù)就不舉例說明了。
3.使用DataReader對象讀取數(shù)據(jù)
在對數(shù)據(jù)庫中的數(shù)據(jù)進行查詢顯示操作時,就可以使用DataReader對象來實現(xiàn)。當Command對象返回結(jié)果集時,需要使用DataReader對象來檢索數(shù)據(jù)。DataReader對象返回一個來自Command的只讀的、只能向前的數(shù)據(jù)流。
DataReader對象是一個簡單的數(shù)據(jù)集,用于從數(shù)據(jù)源中讀取只讀的數(shù)據(jù)集,并常用于檢索大量數(shù)據(jù)。DataReader每次只能在內(nèi)存中保留一行,開銷非常小。但在讀取數(shù)據(jù)時,必須一直保持與數(shù)據(jù)庫的連接(連線模式)。它是一個輕量級的數(shù)據(jù)對象,如果只需將數(shù)據(jù)讀出并顯示,那么它是最合適的工具,它的讀取速度比DataSet(后面會講到)對象要快,占用的資源也比DataSet少。
常用屬性:
HasRows:判斷DataReader對象中是否還有數(shù)據(jù)
FieldCount:獲取當前行的列數(shù)
RecordsAffected:獲取執(zhí)行SQL語句所更改、添加或刪除的行數(shù)
常用方法:
Read:使DataReader對象前進到下一條數(shù)據(jù)
Close:關閉DataReader對象
Get:用來讀取數(shù)據(jù)集當前行的某一列的數(shù)據(jù)
e.g:
using (SqlDataReader reader = cmd.ExecuteReader()) { if (reader.HasRows) { while (reader.Read()) { MessageBox.Show(reader.GetString(1)); } } }
通過SqlCommand對象的ExecuteReader方法從數(shù)據(jù)源中檢索數(shù)據(jù)來創(chuàng)建SqlDataReader對象。還得注意在讀取完數(shù)據(jù)后,務必把DataReader對象關閉,否則當DataReader對象尚未關閉時,DataReader所使用的Connection對象就無法執(zhí)行其他操作了。比較好的做法就是把這些全部放在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查詢數(shù)據(jù)
DataSet可以看作是在內(nèi)存中創(chuàng)建的一個小型關系數(shù)據(jù)庫,它將數(shù)據(jù)庫中的數(shù)據(jù)復制了一份放到用戶本地(客戶端)的內(nèi)存中,供用戶在不連接數(shù)據(jù)庫的情況下讀取數(shù)據(jù),充分利用了客戶端資源,大大降低了數(shù)據(jù)庫服務器的壓力。它是ADO.NET最核心成員之一,它是支持ADO.NET斷開式、分布式數(shù)據(jù)方案的核心對象,也是非連接的數(shù)據(jù)查詢的核心組件。
DataAdapter對象(數(shù)據(jù)適配器)是一種用來充當DataSet對象與實際數(shù)據(jù)源之間橋梁的對象,只要有DataSet的地方就有它,專門為DataSet服務的。它的工作方式一般有兩種:一種是通過Command對象執(zhí)行SQL語句從數(shù)據(jù)源中檢索數(shù)據(jù),將獲取的結(jié)果集填充到DataSet對象的表中;另一種是把用戶對DataSet對象作出的更改寫入到數(shù)據(jù)源中。
1 using (SqlConnection conn = new SqlConnection(Connstr)) 2 { 3 conn.Open(); 4 using (SqlCommand cmd = conn.CreateCommand()) 5 { 6 //DataSet離線數(shù)據(jù)集 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所做的更改與關聯(lián)的SQL Server數(shù)據(jù)庫更改相協(xié)調(diào)。
最后還有一個就是可以通過SqlCommand.Parameters屬性的參數(shù)傳值防止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數(shù)據(jù)庫主要就是SqlConnection、SqlCommand、SqlDataReade
新聞熱點
疑難解答