第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ù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

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

Security=True;ConnectTimeout=30";

//實(shí)例化SqlConnection對(duì)象SqlConnectionconnection=newSqlConnection(connectionString);

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

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

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

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

//實(shí)例化SqlCommand對(duì)象try{//在異常處理try/catch塊中翻開數(shù)據(jù)連接并完成數(shù)據(jù)的操作connection.Open();inti=command.ExecuteNonQuery();Response.Write("執(zhí)行完畢,"+i+"條數(shù)據(jù)受到影響");}catch(Exceptionex)//當(dāng)出現(xiàn)異常時(shí)要執(zhí)行的語句{Response.Write(ex.Message);}finally//無論如何都要執(zhí)行的語句{connection.Close();}}//結(jié)束SqlConnection對(duì)象的范圍,并釋放對(duì)象14.3執(zhí)行SQL命令Command對(duì)象上述代碼執(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對(duì)象查詢操作與非查詢操作最大的不同是,查詢操作會(huì)返回一個(gè)查詢結(jié)果集。對(duì)于關(guān)系型數(shù)據(jù)庫系統(tǒng)而言,查詢結(jié)果集是一個(gè)二維表,ADO.NET中提供了DataReader對(duì)象來讀取結(jié)果集中的數(shù)據(jù)。Command對(duì)象使用ExecuteReader函數(shù)〔而不是ExecuteNonQuery函數(shù)〕實(shí)例化一個(gè)DataReader對(duì)象,隨后就可以使用DataReader對(duì)象的Read函數(shù)來逐條讀取結(jié)果集中的每一個(gè)數(shù)據(jù)項(xiàng)。14.3執(zhí)行SQL命令Command對(duì)象//構(gòu)建SQL字符串stringqueryString="SELECTTOP10*FROMtb_客戶WHERE簡稱='浩瀚'";//實(shí)例化SqlCommand對(duì)象SqlCommandcommand=newSqlCommand(queryString,connection);//實(shí)例化SqlDataReader對(duì)象SqlDataReaderreader=command.ExecuteReader();

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

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

SqlDataReaderreader=command.ExecuteReader();

//實(shí)例化SqlDataReader對(duì)象

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

while(reader.Read()){Response.Write("<tr><td>"+reader["簡稱"]+"</td><td>"+reader["全稱"]+"</td></tr>");//輸出數(shù)據(jù)行}Response.Write("</table>");//輸出Table的終結(jié)標(biāo)簽14.4讀取數(shù)據(jù)DataReader為了提高開發(fā)效率,ASP.NET提供了大量的Web效勞器控件,其中在效勞器端運(yùn)行的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對(duì)于廣泛的數(shù)據(jù)庫應(yīng)用開發(fā)需求,ASP.NET專門提供了許多針對(duì)結(jié)構(gòu)化數(shù)據(jù)的Web效勞器控件,其中Repeater控件就可以簡化多條數(shù)據(jù)的迭代輸出的開發(fā)工作。Repeater控件是一個(gè)數(shù)據(jù)綁定容器控件,用于生成多條數(shù)據(jù)的列表。我們可以使用Repeater中的<ItemTe

溫馨提示

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

評(píng)論

0/150

提交評(píng)論