C#程序設(shè)計案例教程第六章_第1頁
C#程序設(shè)計案例教程第六章_第2頁
C#程序設(shè)計案例教程第六章_第3頁
C#程序設(shè)計案例教程第六章_第4頁
C#程序設(shè)計案例教程第六章_第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第六章:ADO組件實現(xiàn)大案例數(shù)據(jù)訪問第六章:ADO組件實現(xiàn)大案例數(shù)據(jù)訪問6.1學(xué)習(xí)情境引入6.2基本知識1:ADO.NET3.0概述6.3基本知識2:使用DataReader訪問數(shù)據(jù)庫6.4基本知識3:使用DataSet的數(shù)據(jù)庫應(yīng)用程序6.5決策與計劃6.6實施6.7檢查與評價6.8訓(xùn)練6.1學(xué)習(xí)情境引入上一章我們學(xué)習(xí)了窗體的設(shè)計,管理信息系統(tǒng)就是由一個一個的窗體頁面組成的。用相似的方法,我們就可以設(shè)計由多個窗體組成的管理信息系統(tǒng)??梢哉f,我們現(xiàn)在已經(jīng)開始了管理信息系統(tǒng)的項目設(shè)計之旅。但存在兩個問題,以書店管理系統(tǒng)為例:第一,上一章所設(shè)計的窗體界面僅僅是一些空架子,所有的文本框等控件都是空的,沒有顯示任何數(shù)據(jù),而數(shù)據(jù)存儲于后臺數(shù)據(jù)庫中,如何從后臺數(shù)據(jù)庫取出數(shù)據(jù)并把它顯示到前臺窗體的控件上;第二,在系統(tǒng)的運行過程中,需要用戶輸入圖書信息、入庫單信息、出庫單信息等數(shù)據(jù),這些數(shù)據(jù)除在前臺窗體的控件中顯示外,還需要保存到后臺的數(shù)據(jù)庫中,如何向數(shù)據(jù)庫中存儲在前臺窗體界面產(chǎn)生的數(shù)據(jù)。6.1學(xué)習(xí)情境引入這兩個問題歸結(jié)起來,可以看作是同一個問題,即數(shù)據(jù)訪問的問題。對于管理信息系統(tǒng)應(yīng)用程序的數(shù)據(jù)訪問,針對不同的數(shù)據(jù)庫需要不同的數(shù)據(jù)引擎,VisualStudio.NET支持的數(shù)據(jù)訪問方式有3種:ADO.NET、ADO和OLEDB。目前微軟主推的是ADO.NET方式。ADO.NET是對傳統(tǒng)ADO的改進,可用于創(chuàng)建分布式的數(shù)據(jù)共享應(yīng)用程序,它是一種簡單高效的應(yīng)用程序編程接口。本章我們要利用ADO.NET組件,來初步實現(xiàn)書店管理系統(tǒng)中采購管理模塊的數(shù)據(jù)訪問。6.1學(xué)習(xí)情境引入6.1.1項目需求根據(jù)書店的日常業(yè)務(wù)分析,書店管理系統(tǒng)的采購管理模塊有入庫單填寫、入庫單管理、入庫單打印等主要功能需求,以及圖書信息添加、圖書信息管理等輔助功能需求。1.填寫入庫單書店的采購人員根據(jù)圖書采購合同將入庫單編號、供應(yīng)商、填單時間、經(jīng)辦人、是否付款、圖書編號、進價、數(shù)量、金額等信息錄入系統(tǒng),生成入庫單并通過入庫單打印窗體進行打印。其中,入庫單編號由系統(tǒng)自動生成;圖書編號是根據(jù)圖書名稱查詢圖書得到的,若圖書表中無此種圖書,可以將此圖書信息自動添加到圖書表中;進價是根據(jù)定價和折扣率自動計算的;金額是根據(jù)進價和數(shù)量自動計算的。6.1學(xué)習(xí)情境引入2.入庫單管理根據(jù)用戶名和入庫單的填單時間來查詢?nèi)霂靻涡畔?,并進行入庫單信息管理(如果有錯誤信息,且該入庫單尚未執(zhí)行入庫操作,允許刪除后重新填寫)和打印。3.入庫單打印將用戶填寫的入庫單信息或入庫單管理窗體中查詢到的入庫單信息,以報表的形式打印成紙質(zhì)入庫單。4.圖書信息添加將圖書編號、圖書名稱、作者、出版社、出版時間、ISBN、定價、開本、版次、簡介等圖書的基本信息錄入到系統(tǒng)中,便于在填寫入庫單時進行調(diào)用。5.圖書信息管理根據(jù)圖書的名稱、作者、出版社、ISBN等圖書信息進行圖書查詢,并可以對查詢的圖書信息進行管理操作(如果書店不再銷售此種圖書,可以將圖書信息刪除)。6.1學(xué)習(xí)情境引入6.1.2展示6.1.3技術(shù)分解在圖6-1所示的圖書信息管理窗體中,DataGridView控件中顯示了5條包括圖書ID、圖書名稱、作者、出版社、出版時間、ISBN等數(shù)據(jù)字段的圖書信息記錄,通過這些字段可以完整地描述一種圖書的信息。書店日常銷售的圖書有成千上萬種,那么就會產(chǎn)生上萬條這樣的圖書記錄,為了方便管理,通常將這些圖書記錄存放到數(shù)據(jù)庫中。如圖6-1所示的窗體中顯示的就是通過ADO.NET的數(shù)據(jù)提供程序從數(shù)據(jù)庫中查詢得到的五條圖書記錄。6.1學(xué)習(xí)情境引入要從數(shù)據(jù)庫中查詢數(shù)據(jù),首先需要通過ADO.NET的Connection組件實例建立與數(shù)據(jù)庫的連接,通過Command組件實例來管理數(shù)據(jù)查詢命令,通過DataAdapter組件實例調(diào)用數(shù)據(jù)庫查詢命令進行數(shù)據(jù)查詢,并將查詢所得數(shù)據(jù)填充到數(shù)據(jù)緩存DataSet中,再將DataSet“綁定”到圖書信息查詢窗體中的DataGridView控件實例來顯示,圖6-1所示的圖書管理窗體就是這種情況。圖6-5所示的入庫單打印窗體就是將DataSet作為CrystalReport的數(shù)據(jù)源來進行顯示。圖6-4所示的入庫單管理窗體中,查詢得到的數(shù)據(jù)除了在窗體中顯示外,還要進行修改和刪除,然后再調(diào)用DataAdapter組件實例將更新后的結(jié)果回寫到數(shù)據(jù)庫中。6.1學(xué)習(xí)情境引入在圖6-3所示的入庫單添加窗體中,根據(jù)圖書名稱來查詢圖書作者、出版社、ISBN、定價、圖書ID等信息時,可以不使用數(shù)據(jù)緩存DataSet,而僅使用DataReader直接從數(shù)據(jù)庫中讀取。這樣可以省去DataSet架構(gòu)推斷、創(chuàng)建、填充的時間,以及DataSet的額外內(nèi)存空間,所以程序整體會更高效。在圖6-2圖書信息添加窗體和圖6-3入庫單添加窗體中進行數(shù)據(jù)保存時,僅僅是向數(shù)據(jù)庫中插入一行數(shù)據(jù)。這種情況下,可以不必使用DataReader或者DataSet組件,僅僅需要Connection和Command組件即可。另外,Command組件不僅僅管理文本形式的數(shù)據(jù)庫操作命令,還可以使用存儲過程。6.1學(xué)習(xí)情境引入總之,ADO.NET所提供的Connection、Command、DataReader、DataAdapter、DataSet等組件可以有多種組合技術(shù)、適用不同場合,完全滿足前述需要。因此,本章需要了解的基本知識有:● Connection,Command組件?!?DataReader,DataAdapter組件。● DataSet及相關(guān)組件?!?存儲過程的創(chuàng)建與應(yīng)用。6.2基本知識1:ADO.NET3.0概述6.2.1ADO.NET的基本組件1.ADO.NET的組件及命名空間ADO.NET主要用于為分布式應(yīng)用程序提供數(shù)據(jù)訪問機制,也就是應(yīng)用于多層模型,尤其是B/S結(jié)構(gòu)的三層以上的模式,這主要體現(xiàn)在ADO.NET引入了無連接的設(shè)計模型。ADO.NET包括兩個主要部分:一部分是.NETFramework數(shù)據(jù)提供程序,另一部分是本地的數(shù)據(jù)緩存組件DataSet。DataSet組件屬于System.Data命名空間。它專門為獨立于任何數(shù)據(jù)源的數(shù)據(jù)訪問而設(shè)計,也就是說,雖然不同的數(shù)據(jù)源需要不同的數(shù)據(jù)提供程序,但數(shù)據(jù)存放到DataSet中后,就已經(jīng)是統(tǒng)一格式的了,不會再看到各種數(shù)據(jù)源的差別。各種不同的數(shù)據(jù)庫管理系統(tǒng)、XML數(shù)據(jù)甚至程序員直接在DataSet中構(gòu)建的數(shù)據(jù)結(jié)構(gòu),都是如此,這對于程序員操作數(shù)據(jù)是非常方便的。DataSet包含一個或多個DataTable對象的集合,這些對象由數(shù)據(jù)行和數(shù)據(jù)列以及有關(guān)DataTable對象中數(shù)據(jù)的主鍵、外鍵、約束和關(guān)系信息組成,DataSet就像一個內(nèi)存中的關(guān)系數(shù)據(jù)庫。6.2基本知識1:ADO.NET3.0概述ADO.NET數(shù)據(jù)提供程序包含Connection、Command、DataReader、DataAdapter等核心組件。Connection組件提供與數(shù)據(jù)源的連接。Command組件用以管理數(shù)據(jù)操作命令,比如查詢數(shù)據(jù)、修改數(shù)據(jù)、執(zhí)行存儲過程等數(shù)據(jù)庫命令。DataReader是從數(shù)據(jù)源中讀取數(shù)據(jù)的一個讀取器。DataAdapter是一個綜合的數(shù)據(jù)提供程序,封裝了Connection、Command、DataReader的功能,提供連接DataSet組件和數(shù)據(jù)源的橋梁,也就是說,對于無連接的數(shù)據(jù)訪問,以數(shù)據(jù)讀取為例,程序員即可以直接使用Connection、Command、DataReader的組合,自己處理將數(shù)據(jù)填充到DataSet中的所有操作,也可以簡單地調(diào)用DataAdapter組件,讓DataAdapter把數(shù)據(jù)填充到DataSet中。有些數(shù)據(jù)源用多種標準公開數(shù)據(jù),也就是可以用多種方式訪問此類數(shù)據(jù)源,如SQLServer可以用ODBC,也可以用OLEDB。但實際上,為了盡可能高效地訪問每種數(shù)據(jù)源,在ADO.NET中對不同的數(shù)據(jù)源分別進行了針對性的優(yōu)化,共包含了5類提供程序,如表6-1所示。6.2基本知識1:ADO.NET3.0概述用于SQLServer的.NETFramework數(shù)據(jù)提供程序(SqlClient)使用自己的協(xié)議與SQLServer進行通信,所使用的核心對象為SqlConnection、SqlCommand、SqlDataAdapter、SqlDataReader;而用于OLEDB的.NETFramework數(shù)據(jù)提供程序的核心對象為OleDbConnection、OleDbCommand、OleDbDataAdapter、OleDbDataReader。EntityClient提供程序是ADO.NET3.0中一個新的概念,用于基于實體數(shù)據(jù)模型(EDM)訪問數(shù)據(jù)。實體數(shù)據(jù)模型是基礎(chǔ)數(shù)據(jù)源與數(shù)據(jù)處理邏輯之間的一個層,因此EntityClient提供程序與其他.NETFramework數(shù)據(jù)提供程序不同,該提供程序不直接與數(shù)據(jù)源進行交互,而是使用實體SQL與基礎(chǔ)數(shù)據(jù)提供程序進行通信。在本書中,將主要介紹用于SQLServer的.NETFramework數(shù)據(jù)提供程序。但這些數(shù)據(jù)提供程序呈現(xiàn)給程序員的用法是非常一致的,除了Connection組件的連接字符串不同外,基本上就只是組件名前綴的不同。6.2基本知識1:ADO.NET3.0概述2.數(shù)據(jù)庫訪問方式的選擇并不是所有的數(shù)據(jù)庫應(yīng)用都需要獲得結(jié)果集,有時候僅僅需要執(zhí)行一個數(shù)據(jù)庫操作,比如執(zhí)行DBMS上的一個插入數(shù)據(jù)的操作。這種情況下,不必使用DataReader或者DataSet組件,僅僅需要Connection和Command組件,后面的【例6-6】,就是這種情況的一個例子。但多數(shù)情況下,完整的數(shù)據(jù)庫應(yīng)用程序,一般要求取得結(jié)果集,這時需要使用DataSet來緩存數(shù)據(jù)。有時即使需要結(jié)果集,但對于大數(shù)據(jù),比如圖像數(shù)據(jù),僅使用DataReader直接從數(shù)據(jù)庫中讀取,而不使用DataSet,可以省去DataSet架構(gòu)推斷、創(chuàng)建、填充的時間,以及DataSet的額外內(nèi)存空間,所以程序整體會更高效。根據(jù)這些不同的情況,本章將數(shù)據(jù)訪問分為使用DataReader和使用DataSet兩種情況來介紹。另外,由于使用存儲過程和使用命令文本的Command有些不同,本章也專門介紹了使用存儲過程的數(shù)據(jù)訪問。6.2基本知識1:ADO.NET3.0概述實際上,VS.NET2005以后,程序員還可以通過可視化的方法,構(gòu)建通用的數(shù)據(jù)訪問程序。VS.NET通過TableAdapter組件進一步封裝了.NET數(shù)據(jù)提供程序,讓程序員只需面對DataSet中的數(shù)據(jù)表,雖然靈活性稍差,但更加便捷高效。這種數(shù)據(jù)訪問方式,將在下一章介紹。從數(shù)據(jù)操作程序開發(fā)所使用的組件的角度,按照ADO.NET的結(jié)構(gòu),圖6-6給出了ADO.NET的運行機制,后面幾節(jié)將按照此圖來學(xué)習(xí)ADO.NET各組件的使用。6.2基本知識1:ADO.NET3.0概述6.2基本知識1:ADO.NET3.0概述6.2.2自測1.填空題(1)使用用于SQLServer的.NETFramework數(shù)據(jù)提供程序來訪問數(shù)據(jù)庫時,應(yīng)首先引入

命名空間。(2)用于SQLServer的.NETFramework數(shù)據(jù)提供程序的核心組件為

、SqlCommand、

、SqlDataReader。(3)DataReader組件以

方式來返回數(shù)據(jù)訪問所得數(shù)據(jù)。2.思考題(1)在進行數(shù)據(jù)訪問時,DataSet組件和DataReader組件如何選用?6.3基本知識2:使用DataReader訪問數(shù)據(jù)庫

如前所述,使用DataReader的數(shù)據(jù)庫應(yīng)用程序需要使用Connection組件建立到數(shù)據(jù)源的連接,然后執(zhí)行Command組件的SQL命令,將結(jié)果通過DataReader組件返回,供程序使用。本節(jié)就以SQLServer2005Express數(shù)據(jù)源為例,依次介紹這幾種組件。請注意本節(jié)最后的【例6-9】是完整的程序,而其他普通例子需要讀者補充完整才能運行。另外,本節(jié)的例子需要引用System.Data.SqlClient命名空間。6.3基本知識2:使用DataReader訪問數(shù)據(jù)庫

6.3.1SqlConnection類ADO.NET通過SqlConnection對象實例來管理與SQLServer數(shù)據(jù)源的一個唯一的會話。SqlConnection對象通常與SqlDataAdapter和SqlCommand對象一起使用,可以獲得連接SQLServer7.0以上版本數(shù)據(jù)庫的極高性能。1.常用構(gòu)造函數(shù)SqlConnection類有如下兩個重載的構(gòu)造函數(shù)?!?SqlConnection():初始化SqlConnection的新實例?!?SqlConnection(string):根據(jù)連接字符串初始化SqlConnection的新實例。6.3基本知識2:使用DataReader訪問數(shù)據(jù)庫

【例6-1】初始化一個SqlConnection的新實例connection。SqlConnectionconnection=newSqlConnection();【例6-2】根據(jù)連接字符串初始化一個SqlConnection的新實例connection。SqlConnectionconnection=newSqlConnection(@"server=.\SQLEXPRESS;Database=bookstore;IntegratedSecurity=sspi;");6.3基本知識2:使用DataReader訪問數(shù)據(jù)庫

2.常用屬性SqlConnection對象的常用屬性是ConnectionString。該屬性是string類型值,用于設(shè)置一個不區(qū)分大小寫的連接字符串,該字符串包含了連接到某個SQLServer數(shù)據(jù)庫所需的連接屬性的信息。這些屬性信息如【例6-2】所示,每種信息包含關(guān)鍵字和值兩部分,各種信息之間用分號隔開。【例6-2】中的連接字符串表示:連接到默認安裝的SQLServer2005Express服務(wù)器上的bookstore數(shù)據(jù)庫,身份驗證方式是Windows集成身份驗證。ConnectionString設(shè)置好后,系統(tǒng)會進行語法分析,排除語法異常,但連接字符串正確與否,只能由數(shù)據(jù)源驗證。6.3基本知識2:使用DataReader訪問數(shù)據(jù)庫

3.常用方法(1)Open方法。使用ConnectionString所指定的屬性設(shè)置打開數(shù)據(jù)庫連接。(2)Close方法。關(guān)閉與數(shù)據(jù)庫的連接。在使用SqlDataReader的數(shù)據(jù)庫應(yīng)用程序中,由于對數(shù)據(jù)源的訪問是有連接的,所以在設(shè)置了ConnectionString后,還要調(diào)用SqlConnection實例的Open方法打開數(shù)據(jù)連接,才能執(zhí)行SqlCommand對象所包含的SQL命令,返回SqlDataReader實例,處理完數(shù)據(jù)后,再調(diào)用SqlConnection實例的Close方法關(guān)閉數(shù)據(jù)連接。這兩種方法的使用請參見本節(jié)【例6-9】。6.3基本知識2:使用DataReader訪問數(shù)據(jù)庫

6.3.2SqlCommand類SqlCommand類是執(zhí)行SQL命令的組件,該命令可以是Transact-SQL語句或存儲過程。1.常用構(gòu)造函數(shù)SqlCommand的構(gòu)造函數(shù)可以有命令文本、連接名稱、事務(wù)名稱等3個參數(shù),共有4個重載版本。常用的構(gòu)造函數(shù)如下?!?SqlCommand():初始化SqlCommand類的新實例。● SqlCommand(string,SqlConnection):初始化具有命令文本和SqlConnection的SqlCommand類的新實例?!纠?-3】初始化具有命令文本和SqlConnection的SqlCommand類的新實例。SqlCommandcommand=newSqlCommand("select*frombook_info",connection);6.3基本知識2:使用DataReader訪問數(shù)據(jù)庫

2.常用屬性(1)CommandType屬性。CommandType屬性說明此SqlCommand實例的CommandText是何種類型。它的取值是CommandType枚舉類型,CommandType.Text表示CommandText包含Transact-SQL語句,CommandType.StoredProcedure表示CommandText包含存儲過程名稱。CommandType屬性的默認值是CommandType.Text。(2)CommandText屬性。CommandText屬性值可以是SqlCommand實例要對數(shù)據(jù)庫執(zhí)行的Transact-SQL語句或存儲過程。(3)Connection屬性。Connection屬性包含SqlCommand實例使用的SqlConnection對象實例。6.3基本知識2:使用DataReader訪問數(shù)據(jù)庫

【例6-4】初始化SqlCommand類的新實例,并設(shè)置CommandText和Connection屬性。SqlCommandcommand=newSqlCommand();command.CommandText=”select*frombook_Info”;command.Connection=connection;(4)Parameters屬性。SqlParameterCollection對象,表示CommandText中使用的參數(shù)集合。CommandText中允許使用參數(shù),參數(shù)名稱前加“@”符號。在調(diào)用存儲過程的場合,經(jīng)常用到SqlCommand的Parameters屬性?!纠?-5】初始化SqlCommand類的新實例,并使用帶參數(shù)的CommandText。SqlCommandcommand=newSqlCommand("select*frombook_infowhereBookID>@BID",connection);SqlParameter

parameterPubId=command.Parameters.Add("@BID",SqlDbType.Int,10);parameterPubId.Value=100;6.3基本知識2:使用DataReader訪問數(shù)據(jù)庫

【例6-6】初始化SqlCommand類的新實例,將調(diào)用名為“proc_Book_Info_Insert”的存儲過程。該存儲過程要求兩個輸入?yún)?shù),分別為@name和@price。SqlCommandcommand=newSqlCommand("proc_Book_Info_Insert");command.CommandType=CommandType.StoredProcedure;SqlParameter

parameterName=command.Parameters.Add("@name",

SqlDbType.NVarChar,20);parameterClass.Direction=ParameterDirection.Input;parameterClass.Value="c#程序設(shè)計案例教程";SqlParameter

parameterPrice=command.Parameters.Add("@price",

SqlDbType.Decimal,18);parameterPrice.Direction=ParameterDirection.Input;parameterPrice.Value=32.00;6.3基本知識2:使用DataReader訪問數(shù)據(jù)庫

在上面兩個例題中,出現(xiàn)的“@BID”、“@name”、“@price”是參數(shù)名稱,通常以“@參數(shù)名”的格式指定;SqlDbType表示參數(shù)在Transact-SQL中的數(shù)據(jù)類型,默認為NVarChar;SqlDbType屬性后面緊跟的數(shù)字是Size屬性值,表示列中數(shù)據(jù)的最大長度(以字節(jié)為單位),默認值是從參數(shù)類型得出的;Direction屬性用來指明參數(shù)是只可輸入、只可輸出、雙向還是存儲過程返回值參數(shù),取值為ParameterDirction枚舉類型,有4種枚舉值——Input、Output、InputOutput和ReturnValue;Value屬性表示參數(shù)的值,Object類型,默認值為空。Parameters類還有很多屬性、方法和事件,需要時可按“F1”進入幫助界面,在“索引”的“查找”項中輸入“SqlParameter

類”,就可以查詢到。6.3基本知識2:使用DataReader訪問數(shù)據(jù)庫

3.常用方法(1)ExecuteReader方法。將CommandText發(fā)送到Connection交給SQLServer執(zhí)行,并生成一個SqlDataReader實例返回,通過此SqlDataReader可以訪問執(zhí)行結(jié)果。一般在執(zhí)行查詢命令時使用該方法,該方法的使用請參見本節(jié)【例6-9】。(2)ExecuteNonQuery方法。對連接執(zhí)行Transact-SQL語句僅返回受影響的行數(shù)。一般在執(zhí)行插入、更新語句,或不返回結(jié)果集的存儲過程時,使用該方法?!纠?-7】用SqlCommand的ExecuteNonQuery()方法實現(xiàn)圖書信息的添加。6.3基本知識2:使用DataReader訪問數(shù)據(jù)庫

(3)ExecuteScalar方法。返回查詢所返回的結(jié)果集中的第一行第一列,忽略其他列或行。一般在執(zhí)行統(tǒng)計查詢時,使用該方法。【例6-8】用SqlCommand的ExecuteScalar()方法執(zhí)行一個統(tǒng)計語句。SqlCommandcommand=newSqlCommand("selectcount(*)frombook_info",conn);conn.Open();textBoxBookCount.Text=command.ExecuteScalar().ToString();conn.Close();6.3基本知識2:使用DataReader訪問數(shù)據(jù)庫

6.3.3SqlDataReader類SqlDataReader類提供一種從SQLServer數(shù)據(jù)庫讀取行的只進流的方式,是一種高效率訪問組件。1.SqlDataReader類的實例化若要創(chuàng)建SqlDataReader,必須調(diào)用SqlCommand對象的ExecuteReader方法,而不要直接使用構(gòu)造函數(shù)。2.常用屬性(1)FieldCount屬性。獲取當前行中的列數(shù)。(2)Item屬性。Item實際上是一個索引器,提供了一種像訪問數(shù)組一樣訪問類或結(jié)構(gòu)的方法。Item索引器有兩種重載形式,一種按列序號索引,另一種按列名索引。6.3基本知識2:使用DataReader訪問數(shù)據(jù)庫

3.常用方法(1)Read方法。該方法使SqlDataReader實例前進到下一條記錄,即下一行。若存在多個行,則返回true,否則返回false。注意SqlDataReader的默認位置在第一條記錄前面,因此必須調(diào)用Read方法來訪問任何數(shù)據(jù)。(2)Close方法。SqlDataReader是有連接訪問的組件,Close方法可以關(guān)閉連接。6.3基本知識2:使用DataReader訪問數(shù)據(jù)庫

6.3.4使用SqlDataReader訪問數(shù)據(jù)庫6.3基本知識2:使用DataReader訪問數(shù)據(jù)庫

6.3.5演練1.實驗題目入庫單填寫。2.實驗?zāi)康摹?掌握ADO.NET中Command組件、Connection組件、DataReader組件的常用方法、屬性。● 能夠利用Connection組件建立與數(shù)據(jù)庫的連接,利用Command組件來實現(xiàn)數(shù)據(jù)訪問。● 能夠利用DataReader組件來實現(xiàn)數(shù)據(jù)訪問。3.實驗內(nèi)容在書店管理系統(tǒng)中,填寫入庫單是一個很重要的業(yè)務(wù)模塊,具體業(yè)務(wù)流程是:書店的采購人員根據(jù)圖書采購合同將入庫單編號、供應(yīng)商、填單時間、經(jīng)辦人、是否付款、圖書編號、進價、數(shù)量、金額等信息錄入系統(tǒng),生成入庫單并通過入庫單打印窗體進行打印,其中,入庫單編號由系統(tǒng)自動生成;圖書編號根據(jù)圖書名稱查詢圖書表得到,若圖書表中無此種圖書,可以將此圖書自動添加到圖書表中;進價根據(jù)定價和折扣率自動計算;金額根據(jù)進價和數(shù)量自動計算。請結(jié)合以上業(yè)務(wù)流程信息,實現(xiàn)入庫單填寫窗體的功能,具體界面如圖6-11所示。6.3基本知識2:使用DataReader訪問數(shù)據(jù)庫

6.3.6自測1.選擇題(1)以下

參數(shù)是設(shè)置非Windows集成安全下的數(shù)據(jù)庫連接。a.Trusted_Connection=Yesb.userid=sa;password=111c.IntegratedSecurity=Trued.IntegratedSecurity=SSPI(2)數(shù)據(jù)庫連接中的參數(shù)設(shè)置ConnectionTimeout=10表示

。a.設(shè)置數(shù)據(jù)庫連接超時為10秒鐘。b.設(shè)置數(shù)據(jù)庫連接的用戶最多為10個。c.設(shè)置數(shù)據(jù)庫連接超時為10毫秒。d.設(shè)置數(shù)據(jù)庫連接的次數(shù)不能超過10次。6.3基本知識2:使用DataReader訪問數(shù)據(jù)庫

(3)SQL語句“deletefrombook_info”,需要SqlCommand組件的

方法來執(zhí)行。a.ExecuteNonQuery()b.ExecuteScalar()c.ExecuteReader()d.ExecuteXmlReader()(4)SQL語句“selectcount(*)frombook_info”,需要SqlCommand組件的

方法來執(zhí)行。a.ExecuteNonQuery()b.ExecuteScalar()c.ExecuteReader(d.ExecuteXmlReader()(5)SQL語句“CreateTablebook_info(bookid

int,booknamenvarchar(50))”,需要SqlCommand組件的

方法來執(zhí)行。a.ExecuteNonQuery()b.ExecuteScalar()c.ExecuteReader()d.ExecuteXmlReader()6.3基本知識2:使用DataReader訪問數(shù)據(jù)庫

(6)通常情況下,DataReader對象在內(nèi)存中保留

數(shù)據(jù)。a.多行b.兩行c.一行d.零行2.填空題(1)數(shù)據(jù)庫連接字符串"Serve=abc;Database=Northwind;UID=sa;Pwd=;"中,Server指的是

。(2)若要執(zhí)行一條更新SQL語句,應(yīng)該使用Command對象的

方法。(3)使用Command對象的

方法可以創(chuàng)建一個DataReader對象。6.4基本知識3:使用DataSet的數(shù)據(jù)庫應(yīng)用程序

DataReader組件只能提供只讀的、只向前的數(shù)據(jù)訪問,要使用更強大功能的數(shù)據(jù)庫應(yīng)用程序,應(yīng)該使用DataSet組件。如圖6-6所示,使用DataSet的數(shù)據(jù)庫應(yīng)用程序也需要Connection組件建立到數(shù)據(jù)源的連接,然后執(zhí)行Command組件的SQL命令,返回結(jié)果到DataSet組件中,供程序使用。由于DataSet和DataReader使用相同的Connection組件和Command組件,故不再贅述。實際上,在ADO.NET中,使用DataReader的數(shù)據(jù)庫應(yīng)用程序是用編寫代碼的方式實現(xiàn)的,是ADO.NET的基本使用方法。DataReader是數(shù)據(jù)提供程序的一部分,DataSet也是使用DataReader進行填充的。而ADO.NET進行了無連接設(shè)計,面向無連接的DataSet組件提供了更強大的數(shù)據(jù)操作功能。通過這些功能,就可以創(chuàng)建以DataSet為中心的、功能強大的數(shù)據(jù)庫應(yīng)用程序。6.4基本知識3:使用DataSet的數(shù)據(jù)庫應(yīng)用程序

6.4.1DataSet類DataSet是從數(shù)據(jù)源中檢索到的數(shù)據(jù)在內(nèi)存中的緩存。它是ADO.NET結(jié)構(gòu)的主要組件,是支持ADO.NET的斷開式、分布式數(shù)據(jù)方案的核心對象。無論數(shù)據(jù)源是什么,它都會提供一致的關(guān)系編程模型。DataSet和DataTable對象是僅有的可以遠程處理的ADO.NET對象。DataSet可將數(shù)據(jù)和架構(gòu)作為XML文檔進行讀寫。DataSet就像一個內(nèi)存中的關(guān)系數(shù)據(jù)庫。DataSet由一組DataTable對象組成,各個DataTable可以通過DataRelation對象互相關(guān)聯(lián)。關(guān)系及約束對象使DataSet可以實施數(shù)據(jù)完整性。DataView是DataTable的數(shù)據(jù)視圖,提供了篩選、排序等功能。6.4基本知識3:使用DataSet的數(shù)據(jù)庫應(yīng)用程序

1.常用構(gòu)造函數(shù)● DataSet():初始化DataSet類的新實例?!?DataSet(string):初始化DataSet類的新實例,并給DataSetName屬性賦值?!纠?-10】初始化一個DataSet類的新實例ds。//初始化一個DataSet類的新實例dsDataSet

ds=newDataSet();//初始化一個DataSet,并命名為bookstoreDataSet

ds=newDataSet("bookstore");6.4基本知識3:使用DataSet的數(shù)據(jù)庫應(yīng)用程序

2.常用屬性● Tables:獲取包含在DataSet中DataTable的集合,在此集合中的DataTable可以按添加表的先后序號索引,也可以按表名索引?!纠?-11】引用DataSet中的數(shù)據(jù)表。//初始化一個DataSetDataSet

ds=newDataSet();//通過DataSet的Tables屬性的Add方法向DataSet添加一個DataTableDataTable

dt=ds.Tables.Add("book_Info");在上例中,ds.Tables[0]和ds.Tables["book_Info"]是指的同一個DataTable。6.4基本知識3:使用DataSet的數(shù)據(jù)庫應(yīng)用程序

3.常用方法● Clear方法:通過移除所有表中的所有行來清除任何數(shù)據(jù)的DataSet?!?Copy方法:返回新的DataSet,具有與該DataSet相同的結(jié)構(gòu)(表架構(gòu)、關(guān)系和約束)和數(shù)據(jù)?!纠?-12】復(fù)制DataSet內(nèi)容。//初始化一個DataSet,并命名為bookstoreDataSet

ds=newDataSet("bookstore");//建立DataSet的原樣副本,包含架構(gòu)和全部數(shù)據(jù)DataSet

copyDS=ds.Copy();6.4基本知識3:使用DataSet的數(shù)據(jù)庫應(yīng)用程序

6.4.2DataTable類及DataTable的數(shù)據(jù)列與數(shù)據(jù)行1.DataTable類DataTable對象是內(nèi)存中的一個數(shù)據(jù)表。它可以包含在DataSet對象中,也可以獨立存在。DataTable中,用數(shù)據(jù)行DataRow對象的集合包含數(shù)據(jù),用DataColumn對象集合包含數(shù)據(jù)表架構(gòu),用DataView對象維護數(shù)據(jù)表視圖。并且還有其他對象用于維護表之間的主從關(guān)系、數(shù)據(jù)約束和用戶自定義屬性。有一個細節(jié)是,當通過DataSet對象的Tables屬性訪問DataTable對象時,請注意它們是按條件區(qū)分大小寫的。例如,如果一個DataTable被命名為“mydatatable”,另一個被命名為“Mydatatable”,則用于搜索其中一個表的字符串被認為是區(qū)分大小寫的。但是,如果“mydatatable”存在而“Mydatatable”不存在,則認為該搜索字符串不區(qū)分大小寫。6.4基本知識3:使用DataSet的數(shù)據(jù)庫應(yīng)用程序

(1)常用構(gòu)造函數(shù)?!?DataTable():初始化DataTable類的新實例?!?DataTable(string):初始化DataTable類的新實例,并給DataTableName屬性賦值?!纠?-13】初始化一個DataTable類的新實例dt。//初始化一個DataTable,并命名為book_InfoDataTable

dt=newDataTable("book_Info");//初始化一個DataTable實例,并添加到DataSet中DataSet

ds=newDataSet();DataTabledt2=ds.Tables.Add("book_Info");將DataTable添加為一個DataSet的Tables集合的成員后,不能再將其添至任何其他的DataSet的Tables集合。6.4基本知識3:使用DataSet的數(shù)據(jù)庫應(yīng)用程序

(2)常用屬性?!?Columns:表示數(shù)據(jù)表的列集合,即DataColumn對象的集合,DataColumn是用于創(chuàng)建DataTable架構(gòu)的基本構(gòu)造塊?!?Rows:表示數(shù)據(jù)表的行集合。(3)常用方法● NewRow:新建與該表的架構(gòu)相同的數(shù)據(jù)行,但該行還必須調(diào)用Rows集合的Add方法,才能將該行添加到數(shù)據(jù)表。6.4基本知識3:使用DataSet的數(shù)據(jù)庫應(yīng)用程序

2.DataTable的數(shù)據(jù)列DataColumn類(1)常用構(gòu)造函數(shù)?!?DataColumn(string,Type):使用指定列名稱和數(shù)據(jù)類型初始化DataColumn類的新實例?!?DataColumn(string,Type,string):使用指定的列名稱、數(shù)據(jù)類型和表達式初始化DataColumn類的新實例。6.4基本知識3:使用DataSet的數(shù)據(jù)庫應(yīng)用程序

3.DataTable的數(shù)據(jù)行DataRow類(1)構(gòu)造函數(shù)。● DataRow():初始化DataRow實例,實用中,常調(diào)用DataTable的NewRow()方法,以返回一個符合DataTable架構(gòu)的新行。(2)主要屬性。● Item:一行數(shù)據(jù)中各列數(shù)據(jù)的索引器,可以按DataColumn對象名、按列名、按列順序號等進行索引。6.4基本知識3:使用DataSet的數(shù)據(jù)庫應(yīng)用程序

【例6-14】創(chuàng)建一個DataTable實例bookTable,并向bookTable添加數(shù)據(jù)。//初始化一個DataTable,并命名為book_InfoDataTable

bookTable=newDataTable("book_info");//利用DataTable的Columns屬性的Add()方法添加新列BookIDDataColumntableC1=bookTable.Columns.Add("BookID",typeof(Int32));//將BookID列的屬性設(shè)為不允許DBNull,并將值約束為唯一tableC1.AllowDBNull=false;tableC1.Unique=true;//將BookID列設(shè)置為自動遞增tableC1.AutoIncrement=true;tableC1.AutoIncrementSeed=1000;tableC1.AutoIncrementStep=1;//將BookID列設(shè)置為主鍵列bookTable.PrimaryKey=newDataColumn[]{bookTable.Columns["BookID"]};//繼續(xù)添加兩個新列bookTable.Columns.Add("BookName",typeof(string));bookTable.Columns.Add("BookAuthor",typeof(string));//調(diào)用DataTable的NewRow()方法生成新數(shù)據(jù)行,并設(shè)置數(shù)據(jù)值DataRow

tableRow=bookTable.NewRow();tableRow["BookName"]="C#2005程序設(shè)計案例教程";tableRow["BookAuthor"]="李正吉";//調(diào)用DataTable的Rows屬性的Add()方法添加數(shù)據(jù)行bookTable.Rows.Add(tableRow);6.4基本知識3:使用DataSet的數(shù)據(jù)庫應(yīng)用程序

在上例中,“tableC1.AllowDBNull=false;tableC1.Unique=true;”兩句代碼是將新增的tableC1列設(shè)置為不允許為空,并設(shè)值約束為唯一;“tableC1.AutoIncrement=true;tableC1.AutoIncrementSeed=1000;tableC1.AutoIncrementStep=1;”將新增的tableC1列設(shè)置為自動遞增列,初始值為1

000,每次遞增1。這些代碼語句都在設(shè)置DataColumn類的屬性。DataColumn類還有很多的屬性、方法和事件,需要時可按F1鍵進入“幫助”界面,在“索引”的“查找”項中輸入“DataColumn類”,即可查詢到。6.4基本知識3:使用DataSet的數(shù)據(jù)庫應(yīng)用程序

6.4.3SqlDataAdapter類SqlDataAdapter類封裝了DataSet到遠程數(shù)據(jù)源的訪問組件,包含一組SqlCommand對象和一個SqlConnection對象,它提供用于填充DataSet和更新SQLServer數(shù)據(jù)庫的方法。它是ADO.NET中用于SQLServer的.NETFramework數(shù)據(jù)提供程序的一個核心組件。1.常用構(gòu)造函數(shù)● SqlDataAdapter(string,SqlConnection):使用SelectCommand和SqlConnection對象初始化SqlDataAdapter類的新實例。【例6-15】初始化SqlDataAdapter類的一個實例sda。//使用SelectCommand和SqlConnection對象SqlDataAdapter

sda=newSqlDataAdapter("select*frombook_info",conn);6.4基本知識3:使用DataSet的數(shù)據(jù)庫應(yīng)用程序

2.常用屬性● SelectCommand:SqlCommand對象,一般包含SQL查詢語句,需要程序員設(shè)置。從圖6-6可以看出,SqlDataAdapter要通過SqlCommand操縱數(shù)據(jù)。SqlDataAdapter可以管理4個SqlCommand,它們分別為SelectCommand、InsertCommand、UpdateCommand和DeleteCommand。其中SelectCommand是獲取數(shù)據(jù)集架構(gòu)和數(shù)據(jù)的基礎(chǔ),它是SqlDataAdapter的必備屬性。InsertCommand、UpdateCommand和DeleteCommand屬性可以由系統(tǒng)根據(jù)SelectCommand自動生成。這需要定義一個SqlCommandBuilder類的實例與該SqlDataAdapter類的實例關(guān)聯(lián),并且數(shù)據(jù)表要有主鍵,同時SelectCommand返回的列中包括此主鍵列。6.4基本知識3:使用DataSet的數(shù)據(jù)庫應(yīng)用程序

3.常用方法● Fill方法:用SelectCommand的返回結(jié)果填充DataSet或DataTable,返回值為填充的行數(shù),常用的三個重載版本如下:Fill(DataSet):填充數(shù)據(jù)集。Fill(DataTable):填充數(shù)據(jù)表。Fill(DataSet,string):填充數(shù)據(jù)集中指定名稱的數(shù)據(jù)表。● Update方法:根據(jù)DataSet或DataTable中數(shù)據(jù)更新的情況,恰當?shù)卣{(diào)用InsertCommand、UpdateCommand、DeleteCommand,將本地緩沖數(shù)據(jù)保存到數(shù)據(jù)庫。若沒有自動生成InsertCommand、UpdateCommand、DeleteCommand,需要程序員為這些SqlCommand對象賦值,否則不能使用Update方法;該方法返回值為更新的行數(shù),其常用的重載版本形式與Fill方法相似。6.4基本知識3:使用DataSet的數(shù)據(jù)庫應(yīng)用程序

【例6-16】初始化SqlDataAdapter類的一個實例sda,并通過調(diào)用sda的Fill方法來填充一個DataSet實例。SqlDataAdapter

sda=newSqlDataAdapter("select*frombook_info",conn);DataSet

bookDataSet=newDataSet();sda.Fill(bookDataSet,"book_info");【例6-17】初始化SqlDataAdapter類的一個實例sda,并通過一個SqlCommandBuilder類的實例scb,在調(diào)用sda的Update方法時,自動生成所需的SqlCommand對象。SqlDataAdapter

sda=newSqlDataAdapter("select*frombook_info",conn);SqlCommandBuilder

scb=newSqlCommandBuilder(sda);sda.Update();6.4基本知識3:使用DataSet的數(shù)據(jù)庫應(yīng)用程序

6.4.4使用SqlDataAdapter和DataSet訪問數(shù)據(jù)庫【例6-18】使用SqlDataAdapter和DataSet實現(xiàn)圖書信息查詢。

6.4基本知識3:使用DataSet的數(shù)據(jù)庫應(yīng)用程序

6.4.5在SqlDataAdapter中使用存儲過程在Winform應(yīng)用程序

溫馨提示

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

評論

0/150

提交評論