課件數(shù)據(jù)庫訪問技術(shù)_第1頁
課件數(shù)據(jù)庫訪問技術(shù)_第2頁
課件數(shù)據(jù)庫訪問技術(shù)_第3頁
課件數(shù)據(jù)庫訪問技術(shù)_第4頁
課件數(shù)據(jù)庫訪問技術(shù)_第5頁
已閱讀5頁,還剩77頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

使用ADO.NET訪問數(shù)據(jù)庫主要內(nèi)容1ADO.NET概述2數(shù)據(jù)庫連接對象(Connection)3數(shù)據(jù)庫命令對象(Command)4數(shù)據(jù)讀取對象(DataReader)數(shù)據(jù)適配器對象(DataAdapter)數(shù)據(jù)集對象(DataSet)

ADO.NET訪問數(shù)據(jù)庫的2種方式保持連接式訪問斷開式訪問(非永久連接)SQL查詢基礎(chǔ)

SQL是StructuredQueryLanguage(結(jié)構(gòu)化查詢語言)的縮寫。表列舉了常用的SQL語句。SQL的主要語句及說明查詢語句SelectSELECT語句主要用于從數(shù)據(jù)庫中返回需要的數(shù)據(jù)集,其語法格式為:SELECTselect_list

FROMtable_list[WHEREsearch_conditions]

[ORDERBYorder_list[ASC|DESC]]常用格式:Select*from表名Where條件模糊查詢:

Select*from表名Where字段名like‘%條件%’插入記錄語句InsertInsert語句可以向表中插入一條記錄,其語法格式為:INSERTINTO表名稱(字段名)VALUES(字段值)修改記錄語句Update使用Update語句可更新(修改)表中的數(shù)據(jù),語法格式為:UPDATE表名稱SET字段名=值WHERE條件刪除記錄語句Delete使用DELETE語句可以刪除數(shù)據(jù)表中指定行,語法格式為:DELETEFROM表名稱WHERE條件1ADO.NET概述ADO.NET可通過DateSet對象在“斷開連接模式”下訪問數(shù)據(jù)庫,即用戶訪問數(shù)據(jù)庫中的數(shù)據(jù)時,首先要建立與數(shù)據(jù)庫的連接,從數(shù)據(jù)庫中下載需要的數(shù)據(jù)到本地緩沖區(qū),之后斷開與數(shù)據(jù)庫的連接。此時用戶對數(shù)據(jù)的操作(查詢、添加、修改、刪除等)都是在本地進(jìn)行的,只有需要更新數(shù)據(jù)庫中的數(shù)據(jù)時,才再次與數(shù)據(jù)庫連接,在發(fā)送修改后的數(shù)據(jù)到數(shù)據(jù)庫后關(guān)閉連接。這樣大大減少了因連接過多(訪問量較大時)對數(shù)據(jù)庫服務(wù)器資源的大量占用。

ADO.NET提供了用于完成如數(shù)據(jù)庫連接、查詢數(shù)據(jù)、插入數(shù)據(jù)、更新數(shù)據(jù)和刪除數(shù)據(jù)等操作的對象。Connection對象Command對象DataReader對象DataAdapter對象DataSet對象

ADO.NET概述

在ADO.NET中數(shù)據(jù)集(DataSet)與數(shù)據(jù)提供器(Provider)是兩個非常重要,而又相互關(guān)聯(lián)的核心組件,其關(guān)系如下圖所示。數(shù)據(jù)集數(shù)據(jù)提供器臨時存儲應(yīng)用程序從數(shù)據(jù)源讀取的數(shù)據(jù),可對數(shù)據(jù)進(jìn)行各種操作用于建立數(shù)據(jù)集和數(shù)據(jù)源的連接ADO.NET的組件準(zhǔn)確地說,ADO.NET是由很多類組成的一個類庫。這些類提供了眾多對象,分別用來完成和數(shù)據(jù)庫的連接、查詢、插入、更新和刪除等操作。其中主要包括5個對象。92024/1/12ADO.NET的對象Connection對象:用來連接到數(shù)據(jù)庫。Command對象:用來對數(shù)據(jù)庫執(zhí)行SQL命令。DataReader對象:用來從數(shù)據(jù)庫返回只讀數(shù)據(jù)。DataAdapter對象:用來從數(shù)據(jù)庫返回數(shù)據(jù),并送到Dataset對象中,還要負(fù)責(zé)保證Dataset對象中的數(shù)據(jù)和數(shù)據(jù)庫中的數(shù)據(jù)保持一致。DataSet對象:它可以看做是內(nèi)存中的數(shù)據(jù)庫。利用DataAdapter對象將數(shù)據(jù)庫中的數(shù)據(jù)送到該對象中,然后就可以在其中對數(shù)據(jù)進(jìn)行各種操作,最后再利用DataAdapter對象將更新反映到數(shù)據(jù)庫中。102024/1/12ADO.NET兩種讀取數(shù)據(jù)庫的方式這5個對象提供了兩種讀取數(shù)據(jù)庫的方式。一種是利用Connetction、Command和DataReader對象,這種方式只能讀取數(shù)據(jù)庫,也就是說不能修改記錄。如果只是想查詢記錄的話,這種方式的效率更高些。(保持連接模式)第二種是利用Connection、Command、DataAdapter和Dataset對象,這種方式更靈活,可以對數(shù)據(jù)庫進(jìn)行各種操作。(斷開連接模式)112024/1/12ADO.NET兩種讀取數(shù)據(jù)庫的視圖122024/1/12ADO.NET兩套類庫針對不同的數(shù)據(jù)庫,ADO.NET提供了兩套類庫:第一套類庫可以存取所有基于OLEDB提供的數(shù)據(jù)庫,如SQLServer、Access、Oracle等;第二套類庫專門用來存取SQLServer數(shù)據(jù)庫。只對SQLServer7.0及更高版SQLServer數(shù)據(jù)庫進(jìn)行高度優(yōu)化連接132024/1/12ADO.NET兩套類庫的對象名稱對應(yīng)命名空間System.Data.OleDbSystem.Data.SqlClient對象OLEDB數(shù)據(jù)庫SQLServer數(shù)據(jù)庫ConnectionOLEDBConnectionSQLConnectionCommandOLEDBCommandSQLCommandDataReaderOLEDBDataReaderSQLDataReaderDataAdapterOLEDBDataAdapterSQLDataAdapterDataSetDataSetDataSet142024/1/12基于OLEDB的數(shù)據(jù)庫的相關(guān)命名空間

如果要使用基于OLEDB的數(shù)據(jù)庫,需要在頁面中導(dǎo)入相關(guān)的命名空間,語法如下:

usingSystem.Data;

usingSystem.Data.Oledb;如果要使用SQLServer數(shù)據(jù)庫,則語句需要改為:

usingSystem.Data;

usingSystem.Data.SqlClient;152024/1/122Connection對象Connection對象提供與數(shù)據(jù)源的連接。要存取數(shù)據(jù)源內(nèi)的數(shù)據(jù),首先要建立程序和數(shù)據(jù)源之間的連接。主要屬性(1)ConnectionString:獲取或設(shè)置用于打開數(shù)據(jù)庫的字符串,包括字符串的內(nèi)容和數(shù)據(jù)提供器名稱。(2)State:獲取連接的當(dāng)前狀態(tài)主要方法(1)Open()方法:用于打開由ConnectionString屬性指定的數(shù)據(jù)源連接(2)Close()方法:關(guān)閉數(shù)據(jù)源連接連接到數(shù)據(jù)庫的步驟創(chuàng)建一個新Connection對象OleDbConnectionconn=newOleDbConnection();SqlConnectionconn=newSqlConnection();設(shè)置Connection對象的連接字符串屬性打開或關(guān)閉數(shù)據(jù)庫連接用于連接Access數(shù)據(jù)庫的對象用于連接SQL數(shù)據(jù)庫的對象數(shù)據(jù)庫連接字符串

為了連接到數(shù)據(jù)源,需要一個連接字符串。連接字符串通常由分號隔開的名稱和值組成,它指定數(shù)據(jù)庫運(yùn)行庫的設(shè)置。連接字符串中包含的典型信息包括數(shù)據(jù)庫的名稱、服務(wù)器的位置和用戶的身份。下面以連接Access數(shù)據(jù)庫和SQLServer數(shù)據(jù)庫為例說明。

連接字符串的存放位置(1)把連接字符串寫在程序中需要在許多頁面中寫入連接字符串,這時候如果需要改動連接字符串(比如換用戶名和密碼)的話,就得逐個修改。(2)把連接字符串放在web.config文件中(3)把連接字符串放在類中程序員可以方便地更改服務(wù)器名稱、數(shù)據(jù)庫或身份驗(yàn)證信息,而無須逐個修改程序。182024/1/12連接Access數(shù)據(jù)庫的連接字符串OleDbConnection類的Connectionstrings屬性所要求的字符串的內(nèi)容也是由若干個以分號隔開的“<參數(shù)名>=<參數(shù)值>”表示的子串組成。如:conn.ConnectionString="Provider=Microsoft.Jet.Oledb.4.0;"+"DataSource="+Server.MapPath("App_Data/xxx.mdb");以上字符串說明了連接Access數(shù)據(jù)庫的方法。方法一:在代碼中設(shè)置連接字符串連接SQLServer數(shù)據(jù)庫文件(.mdf)

--網(wǎng)站內(nèi)嵌數(shù)據(jù)庫Conn.ConectionString="Data

Source=.\\SQLEXPRESS;

AttachDbFilename=|DataDirectory|\\*.mdf;

IntegratedSecurity=True;

UserInstance=True"

下面以查詢student表數(shù)據(jù)為例介紹如何打開和關(guān)閉數(shù)據(jù)庫。代碼如下。

protectedvoidPage_Load(objectsender,EventArgse)

{

SqlConnectionconn=newSqlConnection(); StringstrCon="DataSource=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\Db.mdf;IntegratedSecurity=True;UserInstance=True";

conn.Connectionstring=strCon;conn.Open();//打開數(shù)據(jù)庫連接

//操作數(shù)據(jù)源

conn.Close();//關(guān)閉數(shù)據(jù)庫連接

}上述是典型的數(shù)據(jù)庫連接代碼,常在Web.Config文件中存放數(shù)據(jù)庫的連接信息。方法二:連接字符串放在配置文件中

將數(shù)據(jù)庫連接字符串存放在應(yīng)用程序的配置文件(即Web.Config)中,代碼如下。

<connectionStrings>

<addname=“連接字符串名”

connectionString=“數(shù)據(jù)庫的連接字符串”

providerName=“System.Data.SqlClient”或“System.Data.oledb

/>

</connectionStrings>

在程序中獲得連接字符串的方法如下:

conn.ConnectionString=System.Configuration.ConfigurationManager.

ConnectionStrings["constr2"].ToString();連接字符串名在Web.config里連接Access數(shù)據(jù)庫時

連接字符串的寫法<addname="ConnString2"connectionString="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=|DataDirectory|XXX.mdb;"providerName="System.Data.Oledb"/>ASP.NET應(yīng)用程序?qū)DataDirectory|

解析為“<應(yīng)用程序根目錄>/app_data”文件夾。在Web.config里連接SQLServer數(shù)據(jù)庫時連接字符串的寫法<addname="ConnString2"connectionString="Data

Source=.\SQLEXPRESS;

AttachDbFilename=|DataDirectory|\*.mdf;

IntegratedSecurity=True;UserInstance=True"providerName="System.Data.SqlClient"/>方法三:將連接字符串存放在類中

將數(shù)據(jù)庫連接字符串存放在新建的一個類的方法中,例如可將此類命名為MyClass,并在這個類中編寫如下代碼。publicclassMyClass{

privatestaticstringconstr=“

Data

Source=.\\SQLEXPRESS;

AttachDbFilename=|DataDirectory|\\*.mdf;

IntegratedSecurity=True;UserInstance=True"

publicstringstrCon{//定義為只讀屬性

get{returnconstr;}}}將連接字符串存放在類中

在引用此數(shù)據(jù)庫連接信息時,首先要在應(yīng)用程序中創(chuàng)建這個新類的一個方法,然后再初始化連接對象,代碼如下。

SqlConnectionconn=newSqlConnection();MyClassmc=newMyClass();conn.ConnectionString=mc.strCon;Using說明在創(chuàng)建數(shù)據(jù)庫連接時,建議使用Using語句塊;其作用為:定義一個范圍,在范圍結(jié)束時處理對象(當(dāng)離開包含的代碼段時自動調(diào)用該類實(shí)例的Dispose()方法,自動關(guān)閉數(shù)據(jù)庫連接且釋放連接所使用的資源);如果需要使用一個對象,這個對象需要占用很多緊缺的資源,使用完成后需要馬上釋放掉的話,建議使用using語句;

優(yōu)勢:可以避免資源釋放不及時導(dǎo)致的沖突或性能問題。using(SqlConnectionconn=newSqlConnection()){conn.ConnectionString=“”;

……conn.Open(); ……

}272024/1/123Command對象Command對象最主要的工作是通過Connection對象對數(shù)據(jù)源下達(dá)操作數(shù)據(jù)庫的命令。使用戶能夠訪問用于返回數(shù)據(jù)、修改數(shù)據(jù)運(yùn)行存儲過程以及發(fā)送或檢索參數(shù)信息的數(shù)據(jù)庫命令。創(chuàng)建Command對象1.使用構(gòu)造函數(shù)創(chuàng)建Command對象

下面是使用構(gòu)造函數(shù)創(chuàng)建SqlCommand對象,并通過該對象的構(gòu)造函數(shù)參數(shù)來設(shè)置特定屬性值,其語法格式如下:SqlCommand命令對象名=newSqlCommand(查詢字符串,連接對象名);下列語法產(chǎn)生Command對象:SqlCommandcom=newSqlCommand(string,conn);OleDbCommandcom=new

OleDbCommand(string,conn);要執(zhí)行的SQL語句已建立的Connection對象292024/1/12Command對象方法ExecuteNonQuery:執(zhí)行不返回任何行的命令。典型的例子是實(shí)現(xiàn)插入、更新和刪除。ExecuteReader:通過Connection對象下達(dá)命令至數(shù)據(jù)源,將數(shù)據(jù)作為一個DataReader對象返回。用于任何返回數(shù)據(jù)的SQL查詢;ExecuteScalar:從數(shù)據(jù)庫中返回單獨(dú)值,例如與特定查詢相匹配的記錄數(shù),或者數(shù)據(jù)庫功能調(diào)用的結(jié)果。1.Command對象的ExecuteNonQuery方法ExecuteNonQuery方法執(zhí)行更新操作,諸如那些與UPDATE、INSERT和DELETE語句有關(guān)的操作,該方法返回一個整型(Integer)數(shù)據(jù),返回值是命令影響的行數(shù)。例如,創(chuàng)建一個SqlCommand,然后使用ExecuteNonQuery方法執(zhí)行SQL語句,如:UPDATE、INSERT或DELETE。【例1】使用ExecuteNonQuery方法向數(shù)據(jù)庫中插入記錄。添加、修改、刪除數(shù)據(jù)庫流程1、建立數(shù)據(jù)源連接對象并打開:

con=newSqlConnection();con.Open();2、建立命令對象:com=newSqlCommand();3、執(zhí)行命令對象的ExecuteNonQuery()方法;4、斷開數(shù)據(jù)源

con.Close();2.Command對象的ExecuteReader方法ExecuteReader方法通常與查詢命令一起使用,并且返回一個數(shù)據(jù)閱讀器對象DataReader,該對象連接到數(shù)據(jù)庫的結(jié)果集上,并允許行檢索。數(shù)據(jù)閱讀器是一種只讀的、向前移動的游標(biāo),客戶端代碼滾動游標(biāo)并從中讀取數(shù)據(jù)。如果通過ExecuteReader方法執(zhí)行一個更新語句,則該命令成功地執(zhí)行,但是不會返回任何受影響的數(shù)據(jù)行。

創(chuàng)建一個SqlCommand,然后應(yīng)用ExecuteReader()方法來創(chuàng)建DataReader對象來對數(shù)據(jù)源進(jìn)行讀取SqlCommandcom=newSqlCommand(queryString,connection);

//通過ExecuteReader方法創(chuàng)建DataReader對象

SqlDataReaderdr=com.ExecuteReader();

if(dr.Read()){

//}else{

//}使用DataReader對象中的Read方法用來遍歷整個結(jié)果集,不需要顯式地向前移動指針,或者檢查文件的結(jié)束,如果沒有要讀取的記錄了,則Read方法會自動返回False?!纠?】使用ExecuteReader方法將性別為“女”性的記錄顯示在GridView控件中。DataReader對象的創(chuàng)建

注意:DataReader對象不能用new運(yùn)算符生成,只能使用Command對象的ExecuteReader()方法來創(chuàng)建。SqlDataReaderdr=cmd.ExecuteReader();Command對象DataReader對象的使用步驟1、建立數(shù)據(jù)源連接對象:SqlConnectioncon2、打開數(shù)據(jù)源:con.Open();3、執(zhí)行數(shù)據(jù)訪問命令: SqlCommandcmd=newSqlCommand();4、加載數(shù)據(jù)行流: SqlDataReaderdr=cmd.ExecuteReader();5、讀取數(shù)據(jù)行流: while(dr.Read()){}或if(dr.Read()){}6、關(guān)閉數(shù)據(jù)行流: dr.Close();7、關(guān)閉斷開數(shù)據(jù)源: con.Close();3.Command對象的ExecuteScalar方法執(zhí)行查詢,并返回結(jié)果集中第一行的第一列的值。如果只想檢索數(shù)據(jù)庫信息中的一個值,而不需要返回表或數(shù)據(jù)流形式的數(shù)據(jù)庫信息。例如,只需要返回COUNT(*)、SUM()或AVG()等函數(shù)的結(jié)果,那么Command對象的ExecuteScalar方法就很有用。如果在一個常規(guī)查詢語句當(dāng)中調(diào)用該方法,則只讀取第一行第一列的值,而丟棄所有其他值。ExecuteScalar方法舉例在數(shù)據(jù)庫Colledge.mdb中,有一個teacher表如下所示:ExecuteScalar方法舉例窗體上有一文本框(名稱為TextBox1)和一命令按鈕(名稱為Button1),有如下代碼:

OleDbConnectionconn=newOleDbConnection();conn.ConnectionString="Provider=Microsoft.Jet.Oledb.4.0;"+"DataSource="+Server.MapPath("App_Data/Colledge.mdb");conn.Open();stringsql="selectcount(*)fromteacherwhere年齡>35";//stringsql="select*

fromteacherwhere年齡>35";

//常規(guī)查詢,返回結(jié)果集中第1行第1列的值OleDbCommandcom=newOleDbCommand(sql,conn);TextBox1.Text=com.ExecuteScalar().ToString();

conn.Close();程序執(zhí)行后,文本框顯示的內(nèi)容?當(dāng)Command對象返回結(jié)果集時,需要使用DataReader對象來檢索數(shù)據(jù)。DataReader對象返回一個來自Command的只讀的、只能向前的數(shù)據(jù)流。DataReader每次只能在內(nèi)存中保留一行,所以開銷非常小。在與數(shù)據(jù)庫的交互中,要獲得數(shù)據(jù)訪問的結(jié)果可用兩種方法來實(shí)現(xiàn),第一種是通過DataReader對象從數(shù)據(jù)源中獲取數(shù)據(jù)并進(jìn)行處理;第二種是通過DataSet對象將數(shù)據(jù)放置在內(nèi)存中進(jìn)行處理。4DataReader對象DataReader對象常用方法注意:DataReader對象不能用new運(yùn)算符生成,只能使用Command對象的ExecuteReader()方法來創(chuàng)建。實(shí)現(xiàn)用來讀取一個查詢所有記錄的典型循環(huán)

SqlCommandcmd=newSqlCommand("SELECT*FROMCustomers",conn);//查詢Customers表

SqlDataReaderdr=cmd.ExecuteReader();

While(dr.Read())//循環(huán)讀取數(shù)據(jù)

{}

dr.Close();//關(guān)閉DataReader對象

DataReader對象舉例應(yīng)用在數(shù)據(jù)庫Colledge.mdb中,有一個teacher表,如表所示。在窗體上有一個按鈕(其ID為Button1)和一個列表框(其ID為ListBox1)。程序運(yùn)行后,單擊命令按鈕,列表框中的內(nèi)容是什么?

OleDbConnectionconn=newOleDbConnection();conn.ConnectionString="Provider=Microsoft.Jet.Oledb.4.0;"+

"DataSource="+Server.MapPath("App_Data/Colledge.mdb");conn.Open();stringstrsql="select*fromteacherwhere姓名like'%王%'";OleDbCommandcom=newOleDbCommand(strsql,conn);

OleDbDataReaderdr=com.ExecuteReader();while(dr.Read()){ListBox1.Items.Add(dr["姓名"].ToString());}conn.Close();獲取查詢結(jié)果中的”姓名”字段值使用ExecuteReader()方法實(shí)現(xiàn)登錄驗(yàn)證SQL注入攻擊上例中,用戶登錄時輸入任意用戶名,密碼為:

1'or'1'='1則能夠成功登錄分析:形成的查詢語句為:select*fromT_userswhereuname='dd'andpassword='1'or'1'='1'可見執(zhí)行com.ExecuteReader()方法時會返回所有記錄當(dāng)應(yīng)用程序使用輸入內(nèi)容來構(gòu)造動態(tài)sql語句以訪問數(shù)據(jù)庫時,會發(fā)生sql注入攻擊。使用參數(shù)化語句防止SQL注入攻擊使用二種方法均可參數(shù)化查詢參數(shù)化查詢是指在與數(shù)據(jù)庫連接并訪問數(shù)據(jù)時,在需要填入數(shù)據(jù)的地方,使用參數(shù)(Parameter)來給值,該方法可以有效預(yù)防SQL注入攻擊。原理:在使用參數(shù)化查詢的情況下,數(shù)據(jù)庫服務(wù)器不會將參數(shù)的內(nèi)容視為SQL指令的一部分來處理,而是在數(shù)據(jù)庫完成SQL

指令的編譯后,才套用參數(shù)運(yùn)行,因此即使參數(shù)中含有惡意的指令,由于已經(jīng)編譯完成,就不會被數(shù)據(jù)庫所運(yùn)行。MicrosoftSQLServer的參數(shù)格式是以“@”字符加上參數(shù)名稱而構(gòu)成。SELECT*FROMmyTableWHEREmyID=@myIDINSERTINTO表(c1,c2,c3)VALUES(@c1,@c2,@c3)com.Parameters.Add(“c1”,值1);//設(shè)定參數(shù)@c1的值。com.Parameters.Add(“c2”,值2);//設(shè)定參數(shù)@c2的值。com.Parameters.Add(“c3”,值3);//設(shè)定參數(shù)@c3的值。

連接式訪問SqlConnectionconn=newSqlConnection();conn.ConnectionString="Data

Source=.\SQLEXPRESS;

AttachDbFilename=|DataDirectory|\*.mdf;

IntegratedSecurity=True;

UserInstance=True"SqlCommandcom=newSqlCommand("select*fromT_student",conn);

//操作在打開和關(guān)閉數(shù)據(jù)庫之間conn.Open();SqlDataReaderdr=com.ExecuteReader();while(dr.Read()){Response.Write(dr[“sname"].ToString()+"");}dr.Close();conn.Close();斷開式訪問

SqlDataAdapterda=newSqlDataAdapter("select*fromT_student",conn);//conn.Open();DataSetds=newDataSet();da.Fill(ds)

//Fill方法在執(zhí)行時,若數(shù)據(jù)庫連接未打開,則自動打開,且數(shù)據(jù)填充到數(shù)據(jù)集后,自動將連接關(guān)閉//conn.Close();//處理數(shù)據(jù)在連接關(guān)閉時

for(inti=0;i<ds.Tables[0].Rows.Count;i++){Response.Write(ds.Tables[0].Rows[i][“sname"].ToString()+"<br>")}

da.Update(ds);//數(shù)據(jù)集中數(shù)據(jù)有變化時,使用Update方法更新數(shù)據(jù)源,Update在執(zhí)行時,若數(shù)據(jù)庫連接未打開,則自動打開數(shù)據(jù)連接,且更新數(shù)據(jù)源后自動關(guān)閉數(shù)據(jù)連接

一、應(yīng)用程序向服務(wù)器端發(fā)出請求,要求獲取數(shù)據(jù)。

二、服務(wù)器響應(yīng)的數(shù)據(jù)發(fā)送到數(shù)據(jù)集,通過.NET數(shù)據(jù)集提供程序完成。

三、數(shù)據(jù)集將數(shù)據(jù)發(fā)送客戶端。

四、客戶端修改后存儲到數(shù)據(jù)集中。

五、數(shù)據(jù)集統(tǒng)一將修改后的數(shù)據(jù)保存到服務(wù)器中。Dataset的工作原理數(shù)據(jù)集與數(shù)據(jù)源對應(yīng)數(shù)據(jù)庫服務(wù)器對應(yīng)應(yīng)用程序服務(wù)器數(shù)據(jù)集與數(shù)據(jù)源

數(shù)據(jù)集是包含數(shù)據(jù)表的對象,可以在這些數(shù)據(jù)表中臨時存儲數(shù)據(jù)以便在應(yīng)用程序中使用。如果應(yīng)用程序要求使用數(shù)據(jù),則可以將該數(shù)據(jù)加載到數(shù)據(jù)集中,數(shù)據(jù)集在本地內(nèi)存中為應(yīng)用程序提供了待用數(shù)據(jù)的緩存。即使應(yīng)用程序從數(shù)據(jù)庫斷開連接,也可以使用數(shù)據(jù)集中的數(shù)據(jù)。數(shù)據(jù)集維護(hù)有關(guān)其數(shù)據(jù)的更改的信息,因此可以跟蹤數(shù)據(jù)更新,并在應(yīng)用程序重新連接時將更新發(fā)送回數(shù)據(jù)庫。斷開式ADO.NET數(shù)據(jù)庫訪問示例圖5數(shù)據(jù)適配器對象(DataAdapter)5.1DataAdapter對象概述

DataAdapter對象是一個雙向通道,用來把數(shù)據(jù)從數(shù)據(jù)源中讀到一個內(nèi)存表中,以及把內(nèi)存中的數(shù)據(jù)寫回到一個數(shù)據(jù)源中。這兩種操作分別稱作填充(Fill)和更新(Update)。DataAdapter對象通過Fill方法和Update方法來提供這一橋接器。5數(shù)據(jù)適配器對象(DataAdapter)常用的創(chuàng)建DataAdapter對象的語法格式:格式1:通過DataAdapter對象的構(gòu)造函數(shù)執(zhí)行SQL語句SqlDataAdapter

對象名=new

SqlDataAdapter(SqlStr,conn);其中SqlStr為Select查詢語句,conn為SqlConnection對象。例如:

stringStrSel=“select*from表

";

SqlDataAdapterda=newSqlDataAdapter(StrSel,conn);作用:使用conn建立的數(shù)據(jù)連接,執(zhí)行StrSel表示的SQL語句。創(chuàng)建DataAdapter對象的語法格式(二)格式2:通過DataAdaper對象的4個常用屬性執(zhí)行SQL語句。例如:stringstrsql=“select*from表

";SqlCommandcom=newSqlCommand(strsql,conn);SqlDataAdapterda=newSqlDataAdapter();da.SelectCommand=com;1.DataAdapter對象的常用屬性2.DataAdapter對象的方法

5.2DataAdapter對象的屬性和方法DataAdapter.Fill()方法

Fill方法使用SELECT語句從數(shù)據(jù)源中檢索數(shù)據(jù)。與Select命令關(guān)聯(lián)的Connection對象必須有效,但不需要將其打開。如果

Fill

方法發(fā)現(xiàn)連接尚未打開,它將隱式地打開

DataAdapter

正在使用的

Connection,然后再將其關(guān)閉。如果調(diào)用Fill之前連接已打開,它將保持打開狀態(tài)。填充數(shù)據(jù)集與更新數(shù)據(jù)源

默認(rèn)情況下,數(shù)據(jù)集不包含任何實(shí)際數(shù)據(jù)。實(shí)際上,用數(shù)據(jù)填充數(shù)據(jù)集指的是將數(shù)據(jù)加載到組成數(shù)據(jù)集的DataTable對象中??梢酝ㄟ^執(zhí)行數(shù)據(jù)適配器DataAdapter對象的Fill命令來填充數(shù)據(jù)表。當(dāng)數(shù)據(jù)集中的記錄發(fā)生更改時,這些更改必須寫回數(shù)據(jù)庫。要將更改從數(shù)據(jù)集寫入數(shù)據(jù)庫,可調(diào)用負(fù)責(zé)在數(shù)據(jù)集與相應(yīng)的數(shù)據(jù)庫之間通信的DataAdapter的Update方法更新數(shù)據(jù)源。

使用DataAdapter對象填充數(shù)據(jù)集分兩步:

第一步:使用Connection連接數(shù)據(jù)源;

第二步:使用Fill()方法填充DataSet中的表。將數(shù)據(jù)集中的數(shù)據(jù)保存到數(shù)據(jù)庫(更新)的方法:(1)使用SqlCommandBuilder對象生成更新的相關(guān)命令。(2)調(diào)用DataAdapter的Update()方法。DataAdapter對象.Update(數(shù)據(jù)集對象,"數(shù)據(jù)表名");SqlCommandBuilder對象名=newSqlCommandBuilder(已創(chuàng)建的DataAdapter對象);6.DataSetDataSet相當(dāng)于內(nèi)存中的數(shù)據(jù)庫,在命名空間System.Data中定義;DataAdapter相當(dāng)于DataSet和物理數(shù)據(jù)源之間的橋梁。在DataSet內(nèi)部是一個或多個DataTable的集合,

DataSet.Tables[“表名”]可獲取數(shù)據(jù)集中的一個表。在DataTable中執(zhí)行的插入、更新和刪除操作并不會自動寫回數(shù)據(jù)庫。如果想把更改寫回數(shù)據(jù)庫,則需要手動去完成,這個操作由DataAdapter.Update完成。6.1DataSet概述6.1.1DataSet與DataAdapter

DataSet是實(shí)現(xiàn)ADO.NET斷開式連接的核心,它通過DataAdapter從數(shù)據(jù)源獲得數(shù)據(jù)后就斷開了與數(shù)據(jù)源之間的連接(這一點(diǎn)與前面介紹過的DataReader對象完全不同),此后應(yīng)用程序所有對數(shù)據(jù)源的操作(定義約束和關(guān)系、添加、刪除、修改、查詢、排序、統(tǒng)計等等)均轉(zhuǎn)向到DataSet,當(dāng)所有這些操作完成后可以通過DataAdapter提供的數(shù)據(jù)源更新方法將修改后的數(shù)據(jù)寫入數(shù)據(jù)庫。6.1DataSet概述6.1.2DataSet的組成

DataTableCollection:表示DataSet的表集合。DataRelationCollection:表示此DataSet的DataRelation對象的集合。ExtendedProperties:獲取用戶定義的約束屬性的集合。6.2使用DataSet訪問數(shù)據(jù)庫6.2.1創(chuàng)建DataSet創(chuàng)建數(shù)據(jù)集對象的語法格式為:DataSet數(shù)據(jù)集對象名=newDataSet();或:DataSet數(shù)據(jù)集對象名=newDataSet("表名");6.2使用DataSet訪問數(shù)據(jù)庫6.2.2填充DataSet

所謂“填充”是指使用DataAdapter對象通過執(zhí)行SQL語句從數(shù)據(jù)源得到的返回結(jié)果,使用DataAdapter對象的Fill方法傳遞給DataSet對象。其常用語法格式如下所示:Adapter.Fill(ds);或:Adapter.Fill(ds,tablename);

1.使用DataSet查詢數(shù)據(jù)提示:DataSet中的各種集合,訪問子項有兩種方法,一種是用子項的名,一種是用數(shù)字索引。如要訪問表”student”,可以用:DataSet.Tables[“student”]或DataSet.Tables[0]訪問(多張表依次類推)填充數(shù)據(jù)。第二個參數(shù)是數(shù)據(jù)集中內(nèi)存表的名字,可以與數(shù)據(jù)庫中的表名不同。窗體上有一按鈕(ID為Button1)和一數(shù)據(jù)顯示控件Gridview1。運(yùn)行程序,單擊命令按鈕,Gridview1中顯示什么?

protectedvoidButton1_Click(objectsender,EventArgse){OleDbConnectionconn=newOleDbConnection();conn.ConnectionString="Provider=Microsoft.Jet.Oledb.4.0;"+"Data

Source="+Server.MapPath("App_Data/Colledge.mdb");conn.Open();stringstrsql="select*fromteacherwhere姓名like'%王%'";OleDbCommandcom=newOleDbCommand(strsql,conn);

OleDbDataAdapterda=newOleDbDataAdapter();

da.SelectCommand=com;DataSetds=newDataSet();da.Fill(ds);GridView1.DataSource=ds;GridView1.DataBind();}DataAdapter填充數(shù)據(jù)到數(shù)據(jù)集(DataSet)中填充數(shù)據(jù),F(xiàn)ill方法其實(shí)是隱藏的執(zhí)行了命令對象(Command)的查詢語句protectedvoidButton1_Click(objectsender,EventArgse){SqlConnectionconn=newSqlConnection();conn.ConnectionString=ConfigurationManager.ConnectionStrings["constr"].ToString();stringstrsql="select*fromT_student";SqlDataAdapterda=newSqlDataAdapter(strsql,conn);DataSetds=newDataSet();da.Fill(ds,"student");foreach(DataRowrinds.Tables["student"].Rows){Response.Write(r["sname"].ToString()+"<br>");}}2.使用DataSet添加新記錄通過DataSet向數(shù)據(jù)表添加新記錄的一般方法如下:1)建立與數(shù)據(jù)庫的連接。2)通過DataAdapter對象從數(shù)據(jù)庫中取出需要的數(shù)據(jù)。3)實(shí)例化一個SqlCommandBuilder類對象,并為DataAdapter自動生成更新命令。4)使用DataAdapter對象的Fill方法填充DataSet。5)使用NewRow()方法向DataSet中填充的表對象中添加一個新行。6)為新行中各字段賦值7)將新行添加到DataSet中填充的表對象中。8)調(diào)用DataAdapter對象的Update()方法將數(shù)據(jù)保存到數(shù)據(jù)庫。添加記錄DataSet的結(jié)構(gòu)和數(shù)據(jù)庫相似,插入數(shù)據(jù)實(shí)質(zhì)上就是在DataSet的數(shù)據(jù)表里插入一行(DataRow)

//新建一行

DataRowdr=ds.Tables[“T_student”].NewRow();

//各字段賦值

dr[“sno”]=100020;dr[“sname”]=“李四”;

dr[“math”]=88;

//將新建的行加到DataTable的DataRow集合中

ds.Tables[“T_student”].Rows.Add(dr);

注意:對DataSet的操作僅僅是在DataSet中執(zhí)行,并不影響數(shù)據(jù)庫中的數(shù)據(jù)。使用DataAdapter的Update()方法可以將數(shù)據(jù)集中的結(jié)果更新回數(shù)據(jù)源。注意:DataAdapter對象在數(shù)據(jù)發(fā)生改變時,并不能自動產(chǎn)生數(shù)據(jù)庫系統(tǒng)所需的交易sql語句,所以要建立一個CommandBuilder對象,它能自動產(chǎn)生交易的sql語句。OleDbCommandBuildercustcb=newOleDbCommandBuilder(MyAdapter);

使用DataSet添加記錄使用DataSet插入記錄使用DataSet插入記錄填充數(shù)據(jù)。第二個參數(shù)是數(shù)據(jù)集中內(nèi)存表的名字,可以與數(shù)據(jù)庫中的不同,F(xiàn)ill方法其實(shí)是隱藏的執(zhí)行了命令對象(Command)的查詢語句代碼要點(diǎn):在上述代碼里,首先使用DataAdapter填充DataSet對象,然后通過DataRow對象,向DataSet添加一條記錄,最后使用DataSet的update方法將添加的記錄提交到數(shù)據(jù)庫中。執(zhí)行完update語句,數(shù)據(jù)表就多了一條記錄。此外,上述代碼出現(xiàn)的OledbCommandBuilder對象用來對數(shù)據(jù)表進(jìn)行操作。用了這個對象,就不必再繁瑣地使用DataAdapter的UpdataCommand屬性來執(zhí)行更新操作。3.使用DataSet刪除記錄

使用DataSet從填充的表對象中刪除行時需要創(chuàng)建一個DataRow對象,并將要刪除的行賦值給該對象,而后調(diào)用DataRow對象的Delete()方法將該行刪除

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論