第14章-ASP-NET數(shù)據(jù)庫應(yīng)用開發(fā)基礎(chǔ)_第1頁
第14章-ASP-NET數(shù)據(jù)庫應(yīng)用開發(fā)基礎(chǔ)_第2頁
第14章-ASP-NET數(shù)據(jù)庫應(yīng)用開發(fā)基礎(chǔ)_第3頁
第14章-ASP-NET數(shù)據(jù)庫應(yīng)用開發(fā)基礎(chǔ)_第4頁
第14章-ASP-NET數(shù)據(jù)庫應(yīng)用開發(fā)基礎(chǔ)_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《商務(wù)網(wǎng)站設(shè)計與開發(fā)》溫浩宇西安電子科技大學(xué)第14章數(shù)據(jù)庫應(yīng)用開發(fā)根底內(nèi)容14.1數(shù)據(jù)庫接口ADO.NET14.2連接數(shù)據(jù)源Connection對象14.3執(zhí)行SQL命令Command對象14.4讀取數(shù)據(jù)DataReader14.5思考題14.1數(shù)據(jù)庫接口ADO.NETWeb應(yīng)用程序?qū)?shù)據(jù)庫效勞器的訪問需要在網(wǎng)絡(luò)協(xié)議的支持下構(gòu)建會話〔Session〕,在此根底上,應(yīng)用程序可以向數(shù)據(jù)庫效勞器發(fā)出數(shù)據(jù)的操作請求,比方增加數(shù)據(jù)、查詢數(shù)據(jù)等,數(shù)據(jù)庫效勞器那么會根據(jù)請求對數(shù)據(jù)進行操作或返回查詢結(jié)果。雖然各種不同的RDBMS都盡可能遵循新版本的SQL的標準,但應(yīng)用程序依然不能用相同的代碼來訪問不同的RDBMS。這一方面是因為不同的RDBMS中SQL語法并不完全相同,更重要的方面是每個RDBMS都有不同的建立會話、傳輸SQL、返回數(shù)據(jù)結(jié)果的網(wǎng)絡(luò)協(xié)議。雖然通常RDBMS都會提供一組數(shù)據(jù)庫訪問的應(yīng)用程序接口〔API〕,但對于應(yīng)用程序的開發(fā)者而言,不同的接口函數(shù)、不同的協(xié)議規(guī)那么不僅提高了學(xué)習(xí)的難度,而且當(dāng)數(shù)據(jù)庫進行升級或移植時難度巨大。如果有一套統(tǒng)一的API作為訪問不同RDBMS的接口,那么會有效降低開發(fā)難度,顯著降低開發(fā)和維護本錢。14.1數(shù)據(jù)庫接口ADO.NETApplicationDriverManagerDriverDriverDriverDataSourceDataSourceDataSourceODBCAPIODBCAPIODBC的結(jié)構(gòu)圖14.1數(shù)據(jù)庫接口ADO.NET應(yīng)用系統(tǒng)ADOOLEDB電子表格ODBCSQLISAM目錄服務(wù)文件系統(tǒng)ADO的結(jié)構(gòu)圖14.1數(shù)據(jù)庫接口ADO.NETADO.NET數(shù)據(jù)提供程序ASP.NET或其它應(yīng)用程序其他Web窗體ConnectionCommandDataAdapterDataReaderDataSetWindows窗體數(shù)據(jù)庫ADO.NET的結(jié)構(gòu)圖14.1數(shù)據(jù)庫接口ADO.NETADO.NET中包含了一系列核心對象來構(gòu)建高效、廣泛適用的數(shù)據(jù)庫訪問方式。其中,Connection對象負責(zé)創(chuàng)立于數(shù)據(jù)源〔不一定是RDBMS〕的連接;Command對象可以向數(shù)據(jù)庫效勞器發(fā)出SQL命令,完成數(shù)據(jù)增、刪、改、查,執(zhí)行存儲過程,收發(fā)參數(shù)信息等;DataReader對象可以產(chǎn)生一個只讀的記錄集,從而提供高效率的數(shù)據(jù)讀取方式;DataAdapter對象建立了從數(shù)據(jù)源到DataSet對象的橋梁,其中利用了Command對象來執(zhí)行多種SQL命令以完成DataSet的數(shù)據(jù)加載和數(shù)據(jù)回寫。ADO.NET引入了DataSet的概念,這是一個駐于內(nèi)存的數(shù)據(jù)緩沖區(qū),它可以包含多個類似關(guān)系型數(shù)據(jù)庫中的表的對象——DataTable。DataSet替代了ADO原有的Recordset對象,提高了程序的交互性和可擴展性,尤其適合于分布式的應(yīng)用場合。不管數(shù)據(jù)來源于一個關(guān)系型的數(shù)據(jù)庫,還是來源于一個XML文檔,都可以用統(tǒng)一的編程模型加載到DataSet中,并對其中的數(shù)據(jù)進行操作。14.2連接數(shù)據(jù)源Connection對象可以使用Connection對象來連接數(shù)據(jù)源,而根據(jù)數(shù)據(jù)源的類型〔比方SQLServer、Oracle等〕要使用DbConnection類的某個子類。例如,訪問OLEDB的數(shù)據(jù)源需要使用OleDbConnection,訪問SQLServer數(shù)據(jù)庫需要SqlConnection。名稱說明ConnectionString獲取或設(shè)置數(shù)據(jù)庫的連接字符串。ConnectionTimeout獲取建立連接的最長等待時間,超過等待時間將產(chǎn)生錯誤。Database獲取數(shù)據(jù)庫的名稱。DataSource獲取數(shù)據(jù)源(比如數(shù)據(jù)庫服務(wù)器)的名稱。DbProviderFactory獲取數(shù)據(jù)庫提供者的名稱。ServerVersion獲取服務(wù)器版本。State獲取連接狀態(tài)。14.2連接數(shù)據(jù)源Connection對象ConnectionString為可以設(shè)置的屬性。針對特定的數(shù)據(jù)源,需要給出特定的“連接字符串〞,其中包含了數(shù)據(jù)庫地址、名稱、用戶名和密碼等信息。下面代碼給出兩個典型的ConnectionString值:DataSource=00;InitialCatalog=crm_db;PersistSecurityInfo=True;UserID=crm_user;Password=123456;ConnectTimeout=30或者DataSource=.;InitialCatalog=DbExamples;IntegratedSecurity=True;ConnectTimeout=3014.2連接數(shù)據(jù)源Connection對象DbConnection類常用方法usingSystem.Data.SqlClient;……//構(gòu)建連接字符串stringconnectionString="DataSource=.;InitialCatalog=DbExamples;Integrated

Security=True;ConnectTimeout=30";

//實例化SqlConnection對象SqlConnectionconnection=newSqlConnection(connectionString);

connection.Open();/*這里添加代碼完成數(shù)據(jù)的操作*/connection.Close();名稱說明Open根據(jù)連接字符串連接數(shù)據(jù)庫。Close關(guān)閉數(shù)據(jù)庫連接。BeginDbTransaction開始一個數(shù)據(jù)庫事務(wù)。CreateDbCommand創(chuàng)建一個與當(dāng)前連接相關(guān)聯(lián)的DbCommand對象。GetSchema從數(shù)據(jù)源中獲取架構(gòu)信息。14.2連接數(shù)據(jù)源Connection對象//在異常處理try/catch塊中翻開數(shù)據(jù)連接并完成數(shù)據(jù)的操作try{connection.Open(); /* 這里添加代碼完成數(shù)據(jù)的操作 */}catch(Exceptionex)//當(dāng)出現(xiàn)異常時要執(zhí)行的語句{Response.Write(ex.Message);}finally//無論如何都要執(zhí)行的語句{connection.Close();}//結(jié)束SqlConnection對象的范圍,并釋放對象14.3執(zhí)行SQL命令Command對象通過Connection對象建立了與數(shù)據(jù)庫的連接后,就可以使用SQL語言來完成數(shù)據(jù)的增、刪、改、查。這四項數(shù)據(jù)操作的根本功能可以被簡稱為CRUD,即Create、Read〔或Retrieve〕、Update和Delete〔或Destroy〕。對于數(shù)據(jù)庫中已有的數(shù)據(jù)表,我們可以通過SQL中的Insert、Delete、Update和Select語句分別來完成增、刪、改、查的操作。在ADO.NET中,這些SQL語句通過Command對象傳輸?shù)綌?shù)據(jù)庫效勞器中,并獲取數(shù)據(jù)庫的反響。DbCommand類是構(gòu)建Command對象的基類,它的派生類包括SqlCommand〔用于SQLServer數(shù)據(jù)庫〕、SqlCommand〔用于Oracle數(shù)據(jù)庫〕、OleDbCommand〔用于OLEDB接口〕、OdbcCommand〔用于ODBC接口〕等。14.3執(zhí)行SQL命令Command對象DbCommand類常用屬性表名稱說明Connection獲取或設(shè)置數(shù)據(jù)庫的連接對象CommandType指定CommandText屬性中的命令類型,包括:Text、StoredProcedure和TableDirectCommandText獲取或設(shè)置在數(shù)據(jù)庫中執(zhí)行的命令CommandTimeout獲取或設(shè)置命令執(zhí)行的等待時間,超出時間將報錯Parameters獲取命令中的參數(shù)所對應(yīng)的參數(shù)對象集合

Transaction獲取或設(shè)置命令所屬的事務(wù)對象14.3執(zhí)行SQL命令Command對象DbCommand類常用方法表NameDescriptionExecuteNonQuery執(zhí)行非查詢語句ExecuteReader執(zhí)行查詢語句并返回一個DbDataReader對象ExecuteScalar執(zhí)行查詢語句并返回結(jié)果集的第一行第一列的值(通常用于具有集合函數(shù)的查詢)

Cancel嘗試取消命令的執(zhí)行CreateParameter創(chuàng)建一個DbParameter實例對象14.3執(zhí)行SQL命令Command對象使用DbCommand類在數(shù)據(jù)庫中進行數(shù)據(jù)的增、刪、改、查操作,首先在SQLServer數(shù)據(jù)庫中建立了一個名為“tb_客戶〞的表。字段名類型是否可為空客戶IDint不可簡稱nvarchar(10)不可全稱nvarchar(50)不可行業(yè)nvarchar(10)不可地址nvarchar(50)不可郵編nvarchar(10)可以座機nvarchar(50)可以手機nvarchar(50)可以聯(lián)系人nvarchar(50)可以代理商名稱nvarchar(50)不可創(chuàng)建時間smalldatetime可以修改時間smalldatetime可以備注nvarchar(50)可以14.3執(zhí)行SQL命令Command對象//構(gòu)建連接字符串stringconnectionString="DataSource=.;InitialCatalog=DbExamples;IntegratedSecurity=True;ConnectTimeout=30";

//構(gòu)建SQL字符串stringqueryString="INSERTINTO[tb_客戶]"+"([簡稱],[全稱],[行業(yè)],[地址],[],[座機]"+",[],[聯(lián)系人],[創(chuàng)立時間],[修改時間],[備注])"+"VALUES"+"('浩瀚','深圳浩瀚電子公司','集成電路','深圳南山區(qū)明德路2號','002200','12345678'"+",'1391111111','李浩瀚',2023-1-1,2023-1-1,'新客戶')";14.3執(zhí)行SQL命令Command對象//實例化SqlConnection對象,并規(guī)定了SqlConnection對象的范圍using(SqlConnectionconnection=newSqlConnection(connectionString)){SqlCommandcommand=newSqlCommand(queryString,connection);

//實例化SqlCommand對象try{//在異常處理try/catch塊中翻開數(shù)據(jù)連接并完成數(shù)據(jù)的操作connection.Open();inti=command.ExecuteNonQuery();Response.Write("執(zhí)行完畢,"+i+"條數(shù)據(jù)受到影響");}catch(Exceptionex)//當(dāng)出現(xiàn)異常時要執(zhí)行的語句{Response.Write(ex.Message);}finally//無論如何都要執(zhí)行的語句{connection.Close();}}//結(jié)束SqlConnection對象的范圍,并釋放對象14.3執(zhí)行SQL命令Command對象上述代碼執(zhí)行了一條INSERT語句,同樣的,DELETE和UPDATE語句都可以用以上的代碼結(jié)構(gòu),只是字符串變量queryString的賦值不同而已,例如“刪除〞數(shù)據(jù)的操作代碼為:stringqueryString="DELETEFROMtb_客戶WHERE簡稱='浩瀚'";“修改〞數(shù)據(jù)的操作代碼為:stringqueryString="UPDATE[tb_客戶]SET[全稱]='深圳浩瀚醫(yī)療器械公司'WHERE簡稱='浩瀚'";14.3執(zhí)行SQL命令Command對象查詢操作與非查詢操作最大的不同是,查詢操作會返回一個查詢結(jié)果集。對于關(guān)系型數(shù)據(jù)庫系統(tǒng)而言,查詢結(jié)果集是一個二維表,ADO.NET中提供了DataReader對象來讀取結(jié)果集中的數(shù)據(jù)。Command對象使用ExecuteReader函數(shù)〔而不是ExecuteNonQuery函數(shù)〕實例化一個DataReader對象,隨后就可以使用DataReader對象的Read函數(shù)來逐條讀取結(jié)果集中的每一個數(shù)據(jù)項。14.3執(zhí)行SQL命令Command對象//構(gòu)建SQL字符串stringqueryString="SELECTTOP10*FROMtb_客戶WHERE簡稱='浩瀚'";//實例化SqlCommand對象SqlCommandcommand=newSqlCommand(queryString,connection);//實例化SqlDataReader對象SqlDataReaderreader=command.ExecuteReader();

while(reader.Read()){Response.Write("簡稱:"+reader["簡稱"]+";");Response.Write("全稱:"+reader["全稱"]+";");Response.Write("<br/>");}……14.3執(zhí)行SQL命令Command對象完成對數(shù)據(jù)的各種增、刪、改、查操作是建立數(shù)據(jù)庫管理系統(tǒng)的基石,不管操作有多么復(fù)雜,本質(zhì)上都是形成各種SQL語句傳輸?shù)綌?shù)據(jù)庫效勞器中來執(zhí)行。ASP.NET程序的主要任務(wù)就是提供用戶界面以獲取用戶對數(shù)據(jù)的操作需求,下面我們通過簡單的ASP.NET代碼把上述的數(shù)據(jù)增、刪、改、查操作繼承在一個頁面中。14.4讀取數(shù)據(jù)DataReader可以使用Command對象向數(shù)據(jù)庫傳輸增、刪、改、查的SQL指令。對于非查詢的操作,SQLServer效勞器會返回操作所影響的行數(shù),而對于查詢操作,那么返回一個二維表結(jié)構(gòu)的結(jié)果集,這是就需要DataReader對象來讀取這些數(shù)據(jù)。DataReader對象讀取數(shù)據(jù)時只能從頭到尾單向讀取〔forward-only〕,這主要是出于效率的考慮。實際上這種單向讀取數(shù)據(jù)的方式完全滿足Web程序設(shè)計的需求。DbDataReader類是構(gòu)建DataReader對象的基類,它的派生類包括SqlDataReader〔用于SQLServer數(shù)據(jù)庫〕、OracleDataReader〔用于Oracle數(shù)據(jù)庫〕、OleDbDataReader〔用于OLEDB接口〕、OdbcDataReader〔用于ODBC接口〕等。14.4讀取數(shù)據(jù)DataReaderDbDataReader類常用屬性表名稱說明Depth獲取當(dāng)前行的嵌套深度值FieldCount獲取當(dāng)前行的字段數(shù)量HasRows獲取是否包含一行或多行數(shù)據(jù)IsClosed獲取是否DataReader已經(jīng)關(guān)閉Item[Int32]通過字段序號獲取指定字段的值Item[String]通過字段名稱獲取指定字段的值VisibleFieldCount獲取可見字段的數(shù)量14.4讀取數(shù)據(jù)DataReaderDbDataReader類常用方法表名稱說明Read將讀取器前進到結(jié)果集中的下一個記錄。Close關(guān)閉DataReader對象。Dispose釋放DataReader對象實例所使用的所有資源。GetBoolean獲取指定列的布爾值形式的值。GetByte獲取指定列的字節(jié)形式的值。GetBytes從指定列讀取一個字節(jié)流讀到緩沖區(qū)中。GetChar獲取指定列的單個字符串形式的值。GetChars從指定列讀取一個字符流。GetDecimal獲取指定列的Decimal對象形式的值。GetDouble獲取指定列的雙精度浮點數(shù)形式的值。GetFloat獲取指定列的單精度浮點數(shù)形式的值。GetGuid獲取指定列的全局唯一標識符(GUID)形式的值。名稱說明GetInt16獲取指定列的16位有符號整數(shù)形式的值。GetInt32獲取指定列的32位有符號整數(shù)形式的值。GetInt64獲取指定列的64位有符號整數(shù)形式的值。GetDateTime獲取指定列的DateTime對象形式的值。GetString獲取指定列的作為String的實例的值。GetValue獲取指定列的作為Object的實例的值。GetValues使用當(dāng)前行的列值來填充對象數(shù)組。IsDBNull獲取一個值,該值指示列是否為空(NULL)。GetName給定了從零開始的列序號時,獲取列的名稱。GetOrdinal給定列名稱時,獲取列序號。GetDataTypeName獲取指定列的數(shù)據(jù)類型的名稱。GetFieldType獲取指定列的數(shù)據(jù)類型。NextResult讀取批處理語句的結(jié)果時,使讀取器前進到下一個結(jié)果。14.4讀取數(shù)據(jù)DataReader在DbDataReader類的方法中有多個以某種類型獲取數(shù)據(jù)的方法,比方GetString、GetInt32等,這些方法雖然可以獲取指定列的值,但參數(shù)中只能用使用列序號,而不能使用列的名稱。比方以下三行代碼都可以獲得第2列〔字段名為“簡稱〞〕的值,并輸出到HTML中:Response.Write("簡稱:"+reader[1]+";");Response.Write("簡稱:"+reader["簡稱"]+";");Response.Write("簡稱:"+reader.GetString(1)+";");當(dāng)然,使用列序號需要注意,與C/C++語言一樣,C#的數(shù)組下標是從0開始的;另外,使用列名稱的可讀性和可維護性都要更優(yōu)。特別是,如果使用列序號,一旦數(shù)據(jù)庫表中的列順序發(fā)生變化,可能會帶來程序的運行異常。14.4讀取數(shù)據(jù)DataReader使用Command對象執(zhí)行SQL查詢命令時已經(jīng)給出了使用DataReader對象的方法,其中與DataReader對象有關(guān)的核心代碼如下:stringqueryString="SELECTTOP10*FROMtb_客戶WHERE簡稱='浩瀚'";

//構(gòu)建SQL字符串……//實例化SqlCommand對象SqlCommandcommand=newSqlCommand(queryString,connection);

SqlDataReaderreader=command.ExecuteReader();

//實例化SqlDataReader對象

while(reader.Read()){Response.Write("簡稱:"+reader["簡稱"]+";");Response.Write("全稱:"+reader["全稱"]+";");Response.Write("<br/>");}reader.Close();14.4讀取數(shù)據(jù)DataReader在Response對象輸出字符串時,輸出一個完整的<table>內(nèi)容。Response.Write("<tableborder='1'>");//輸出Table的起始標簽Response.Write("<tr><td>簡稱</td><td>全稱</td></tr>");//輸出標題行

while(reader.Read()){Response.Write("<tr><td>"+reader["簡稱"]+"</td><td>"+reader["全稱"]+"</td></tr>");//輸出數(shù)據(jù)行}Response.Write("</table>");//輸出Table的終結(jié)標簽14.4讀取數(shù)據(jù)DataReader為了提高開發(fā)效率,ASP.NET提供了大量的Web效勞器控件,其中在效勞器端運行的Table控件就可以很好地幫助構(gòu)建HTML中的<table>。while(reader.Read()){TableRowtempRow=newTableRow();TableCelltempCell=newTableCell();tempCell.Text=reader["簡稱"].ToString();tempRow.Cells.Add(tempCell);tempCell=newTableCell();tempCell.Text=reader["全稱"].ToString();tempRow.Cells.Add(tempCell);Table1.Rows.Add(tempRow);}14.4讀取數(shù)據(jù)DataReader對于廣泛的數(shù)據(jù)庫應(yīng)用開發(fā)需求,ASP.NET專門提供了許多針對結(jié)構(gòu)化數(shù)據(jù)的Web效勞器控件,其中Repeater控件就可以簡化多條數(shù)據(jù)的迭代輸出的開發(fā)工作。Repeater控件是一個數(shù)據(jù)綁定容器控件,用于生成多條數(shù)據(jù)的列表。我們可以使用Repeater中的<ItemTe

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論