教學目標通過本節(jié)學習,要讓學生掌握DataAdapter、DataSet以及_第1頁
教學目標通過本節(jié)學習,要讓學生掌握DataAdapter、DataSet以及_第2頁
教學目標通過本節(jié)學習,要讓學生掌握DataAdapter、DataSet以及_第3頁
教學目標通過本節(jié)學習,要讓學生掌握DataAdapter、DataSet以及_第4頁
教學目標通過本節(jié)學習,要讓學生掌握DataAdapter、DataSet以及_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、教學目標:通過本節(jié)學習,要讓學生掌握DataAdapter、DataSet以及DataView等對象的屬性、方法和事件,能夠進行簡單的數據庫訪問操作。通過講授和學生的動手練習,使學生了解VB。Net的數據庫編程的一些常用技巧。教學類型:在多媒體教室直觀講授,引導學生進行簡單的數據庫操作程序設計操作。教學內容:7.6 DataAdapter 對象在.NET框架中,DataAdapter對象可以從中央數據源移動數據到本地DataSet,也可以使DataSet產生的改變返回到數據源,它使用.NET管理支持程序的Connection對象連接數據源,并使用Command對象獲取數據。DataAdapte

2、r實際上減弱DataSet對象對實際數據源的影響, 如果要通過“數據”工具箱中的控件來創(chuàng)建DataAdapter對象,可參照下面的操作步驟。(1)在當前窗體中創(chuàng)建一個Connection對象,例如,SqlConnection1。(2)從“數據”工具箱中選擇一個DataAdapter控件,例如,SqlDataAdapter控件。然后單擊窗體,在創(chuàng)建一個SqlDataAdapter對象的同時打開“數據適配器配置向導”對話框,該向導可以指定連接以及數據適配器,用以選擇記錄并處理數據庫更改的命令。(3)打開“數據適配器配置向導”對話框,選擇“數據適配器應使用哪一種數據連接”下拉列表框中選擇一個已經存在

3、于當前數據連接列表中的連接。(4)確認選擇的連接之后,打開“選擇查詢類型”對話框。通過選擇單選按鈕,可以確定數據適配器如何訪問數據庫。可以指定一個Select語句來加載數據,向導將生成Insert,Update和Delete語句,以保存數據更改。(5)選擇訪問數據庫的訪問方式之后,在中間的文本框中手動輸入SQL Select語句,或者單擊“查詢生成器”按鈕利用查詢生成器來創(chuàng)建查詢語句。 (6)數據適配器配置完成之后,可以設置SqlDataAdapter1的默認屬性,并可以通過下面的超級鏈接重新配置適配器、生成DataSet和預覽DataSet中的數據。DataAdapter的SelectCom

4、mand屬性是一個用于獲取數據源中數據的Command對象。DataAdapter的InsertCommand,UpdateCommand和DeleteCommand屬性是根據DataSet中對數據的改變來更新數據源中數據的Command對象。DataAdapter的Fill方法用于處理含有DataAdapter中SelectCommand的結果值的DataSet,它也添加或刷新DataSet中的行以匹配數據源中的行。如果要通過代碼來創(chuàng)建DataSet,并通過DataGrid對象來顯示數據,可通過“Windows窗體”工具箱中的控件在當前窗體中創(chuàng)建一個DataGrid對象和一個Button對象

5、。其中,DataGrid對象的名稱為DataGrid1,然后雙擊按鈕對象,打開代碼設計器,在其事件過程中輸入下面的代碼:Dim ds As New DataSet() SqlDataAdapter1.Fill(ds, "Products") DataGrid1.DataSource = ds保存創(chuàng)建的內容后執(zhí)行程序,出現窗體之后,單擊按鈕對象可以查看相應的數據。有關DataSet的創(chuàng)建和顯示將在后面進行更加詳細的介紹。7.7 DataSet DataSet是一個完整的包含表、約束、表之間關系的數據集合,并讓一個小的關系數據庫駐留內存。它提供了一個與數據源無關的相容關系編程模

6、型。DataSet對象中的每個表都包含一個列集合,它們代表了DataSet的模式。每個表都有多個行,表示這個DataSet所保持的數據。這些行記得它們的初始狀態(tài)和當前狀態(tài),以便DataSet可以跟蹤發(fā)生了何種改變。其類的結構如圖7.14所示:DataSetDataViewDataTableDataColumnDataColumnDataRowDataRelationConstraint圖7.14 DataSet類的結構當在一個企業(yè)解決方案的不同組件間傳遞數據時,DataSet提供了一個豐富的對象模型。例如,在代表性的解決方案中,一個客戶應用程序通過URL請求數據。當請求到達適當的中間層組件時,

7、將使用適配器創(chuàng)建一個DataSet。然后,這個DataSet被轉換為一個XML文檔,傳送回請求者。在客戶應用程序上,使用控件組合來顯示這些數據,如DataGrid(數據網格)。用戶可以對數據進行添加、刪除和編輯等操作,直到自己滿意。當準備完畢時,DataSet再一次被轉換為XML文檔,傳送回服務器組件。該組件將XML文檔轉換為DataSet,然后使用適配器將改變的數據合并回DBMS中。如圖7.15所示。如果發(fā)生任何沖突,服務器組件可以使用內置的商務規(guī)則對它們進行調整。經過調整的DataSet返回客戶后可以被合并到現有的DataSet中,用戶可以重新開始使用反映最新版本的DataSet工作。圖

8、7.15 利用DataSet進行數據傳遞的過程通常有兩種方法來使用DataSet:非類型化數據集與類型化數據集。非類型化數據集沒有相應的內置架構(表和列結構)。用戶可以通過DataSet控件或編程來創(chuàng)建一個DataSet,然后給其添加DataTable對象,再創(chuàng)建DataRelation對象將每個表連接起來。當運行時需要創(chuàng)建一個DataSet來捕獲應用程序生成的數據時,可以使用編程方法。類型化數據集先是從基類 DataSet 派生,然后使用“數據集設計器”中的信息(存儲在 .xsd 文件中)生成一個新的強類型數據集類。在應用程序中既可以使用類型化數據集也可以使用非類型化數據集。不過,.NET對

9、類型化數據集提供了更多工具支持,而且使用類型化數據集進行編程不僅更加簡單,而且不易出錯。7.7.1 DataSet的結構DataSet的關系結構和功能是在Tables,Columns,Constraints和Relations集合中進行描述。其中,表的布局包括數據類型等信息,放在Tables和Columns中,特定表的約束放在Constraints中,表之間的關系放在Relations中。1DataTableDataTable是包含內存中數據的一個表,它有一個Columns集合,其中包含表的模式。DataTable還包含DataRow對象的一個Rows集合,每個DataRow對象代表一個數據記

10、錄。2DataColumnDataColumn表示DataTable中一個字段的模式元素。DataColumn對象的DataType屬性可以包含列的數據類型,列的行為方式可以用AllowNull,Unique和ReadOnly等屬性來設置。DataColumn可以設置為新行的列自動插入一個遞增的值,類似于SQLServer的Identity列或Access中的Counter字段。AutoIncrement屬性可以打開這個功能,AutoIncrementSeed和AutoIncrementStep屬性控制這個值從哪個數開始,以及遞增的方式。大多數列都包含類似的數據值,列也可以設置為包含一個表達式

11、,根據其他列來計算一個值。3DataRow與僅包含模式信息的DataColumn相反,DataRow包含實際的數據值。DataRow類的Item屬性以列名建立索引(從列的DataColumn對象中提取列名)。如果一個DataColumn對象的名稱是FirstName,則對于DataRow類來說,FirstName列中的值可以用下面的代碼來提?。簊FirstName=MyDataRow.Item("FirstName")Item屬性是DataRow的默認屬性,也是一個索引屬性,因此,可以將其省略。另外,列也可以通過它們的數字索引來訪問。如果在DataTable中,FirstN

12、ame的DataColumn的數字索引是4,就可以使用下述代碼:sFirstName=MyDataRow(4)要在DataTable中添加新行,NewRow方法用返回一個引用該新行的對象,然后在行中的每個字段(列)中插入數據。NewRow方法會自動在Rows集合中添加新行。要修改行中的數據,只需訪問列,并設置其中的值即可。對于小的應用程序來說,這是改變DataTable的最簡單的方式。例如,下面的代碼可以為FirstName列填充數據:MyDataRow("FirstName")=sFirstNameDataRow類的一個最重要的功能是可以顯示某一行中數據的不同版本。在編輯

13、和提交對行的改變時,開發(fā)人員可以根據數據的版本來決定如何操作。在DataRow中數據的版本可以包括:Current:行上的當前數據,就是最后一次接受或拒絕對行的改變。Default:行上的源默認值,這些值在使用DataTable的NewRow方法創(chuàng)建后就在該行上。Original:當表第一次添加到DataSet上時行中的數據,或者在DataTable上最后一次執(zhí)行AcceptChanges后行上的數據。Proposed:行上有一些沒有使用DataTable的AcceptChanges提交的新數據,或單個DataRow上的新數據。這些數據都可以用DataTable或DataRow的RejectC

14、hanges方法回執(zhí),返回其原來的值。在任何時候,行中都可以有多個版本的數據,即給定的行可以顯示有數據的Original版本、Current版本和Proposed版本。對于行上的一列,每個版本的值都是使用Item屬性的一個可選參數獲得的。例如,要獲得FirstName列的Proposed值,可以使用下面的代碼:sFirstName=MyDataRow("FirstName",DataRowVersion.Proposed)但是,這會產生一個錯誤,因為被請求的數據版本在行上不存在。要知道行上的數據有什么可用的版本,可以使用DataRow的HasVersion方法。數據的某個版

15、本不存在的情況非常多。下面的代碼查找一行,看看其中是否有Proposed版本的新數據。如果該行的FirstName字段上有Proposed版本的與行上源數據不同的新數據,就接受改變。但如果FirstName中的Proposed數據與源數據相同,就取消編輯。If MyRow.HasVersion(DataRowVersion.Proposed) ThenIf MyRow ("FirstName", DataRowVersion.Current) = MyRow("FirstName", _DataRowVersion .Proposed) ThenMsgB

16、ox("FirstName is unchanged - edit cancelled")MyRow.CancelEditElseMyRow.AcceptChangesEnd IfElseMsgBox("Row has no proposed data")End If4ConstraintDataTable的Constraints集合包含一組對象,描述了如何處理DataTable中數據的約束。目前有兩個約束類:ForeignKeyConstraint和UniqueConstraint。其中,ForeignKeyConstraint對象必須使用下述元素設置

17、:外鍵所指的相關DataTable。包含DataTable中的外鍵的列,這個外鍵包含了約束。如果違背了約束,應采取的操作。另一種約束類是UniqueContstraint,它比較簡單,只需要設置DataTable中的列即可。不過,該列必須包含與UniqueContraint約束相關的惟一的值。5DataRelationRelations集合中的每個DataRelation對象都包含DataSet的Tables集合中兩個DataTables的鏈接信息。指定每個表中用于鏈接的列,就可以鏈接DataTables,非常類似于在指定關系數據庫的關系時把主鍵和外鍵關聯(lián)起來。典型的關系是父子關系,例如在Sq

18、l Server的事例數據庫Northwind中,父Customers表與子Orders表的關聯(lián)。Customers表中的每一行在Orders表中可以有0個、一個或多個相關記錄。以下代碼示例使用 DataSet 中的兩個 DataTable 對象來創(chuàng)建一個 DataRelation。每個 DataTable 包含一個名為 CustID 的列,它必須有相同的數據類型。用作兩個 DataTable 對象之間的鏈接。該示例將單個 DataRelation 添加到 DataSet 的 Relations 集合中。該示例中的第一個參數指定所創(chuàng)建的 DataRelation 的名稱。第二個參數設置父 Da

19、taColumn,第三個參數設置子 DataColumn。customerOrders.Relations.Add("CustOrders",customerOrders.Tables("Customers").Columns("CustID"), customerOrders.Tables("Orders").Columns("CustID")7.7.2 DataSet的創(chuàng)建1非類型化數據集創(chuàng)建非類型化數據集,完全不依賴于任何數據庫服務器。既可以通過工具箱中的DataSet控件來可視化地創(chuàng)建D

20、ataSet。也可以編碼創(chuàng)建DataSet。如果通過手工編碼來創(chuàng)建非類型化數據集,可以直接將代碼輸入到代碼設計器中。例如,下面的代碼創(chuàng)建了一個簡單的DataSet,在其中添加一個表,然后在表中添加兩個列:'創(chuàng)建一個DataSet對象Dim MyDataSet As New DataSet(ManualDataSet)'創(chuàng)建一個 DataTable 并添加到 DataSet 中Dim tblDataTable As New DataTable("SampleTable")MyDataSet.Tables.Add(tblDataTable)'為表創(chuàng)建兩個

21、 column 并建立它們的屬性,然后將屬性添加到 Columns 集合中Dim colDataColumn1 As New DataColumn("FirstColumn")colDataColumn1.DataType = System.Type.GetType("System.String")colDataColumn1.DefaultValue = "Default"tblDataTable.Columns.Add(colDataColumn1)Dim colDataColumn2 As New DataColumn(&quo

22、t;SecondColumn")colDataColumn2.DataType = System.Type.GetType("System.Int32")tblDataTable.Columns.Add(colDataColumn2)'創(chuàng)建一個 DataRow 并添加到表中,然后設置它的屬性Dim rowMyDataRow As DataRowrowMyDataRow = MyDataSet.Tables("SampleTable").NewRowMyDataSet.Tables("SampleTable").Row

23、s.Add(rowMyDataRow)rowMyDataRow("FirstColumn") = "New text"rowMyDataRow("SecondColumn") = 10000MyDataSet.AcceptChanges()'遍歷各行并顯示對應的值Dim rowDataRow As DataRowFor Each rowDataRow In MyDataSet.Tables("SampleTable").RowsMsgBox(rowDataRow.Item("FirstColumn

24、").ToString & "-" & CStr(rowDataRow _("SecondColumn"),"Show data")Next從注釋中可以看出,上面這段代碼開始時創(chuàng)建一個新DataSet,其名稱是ManualDataSet,再創(chuàng)建一個新DataTable,名稱是SampleTable,并把它添加到DataSet中。此時表中沒有任何列。接下來,為DataTable創(chuàng)建兩個列,并設置它們的屬性。給第一列設置的Default實際上是可選的,但可以作為一個例子包含進去。實際上,必須為列設置的惟一屬性是D

25、ataType。創(chuàng)建和初始化每個列后,就把它們添加到名為SampleTable的DataTable的Columns集合中。在創(chuàng)建一個DataRow之后,利用For語句遍歷Rows集合并顯示每行上兩個列的值。如果運行這段代碼,結果應是在一個消息框中顯示Newtext10000字符串。這樣,就可以對DataSet進行任何操作。2創(chuàng)建類型化數據集需要在程序運行時動態(tài)創(chuàng)建DataSet的時候,使用手工編碼的方式是非常方便的。但是這種方式只適合具有少量數據的DataSet,如果需要處理大量數據,只能通過數據庫來創(chuàng)建DataSet。從前面的內容可以知道,VB.NET通過管理支持程序和對應的幾個對象以及控件

26、,使用戶能夠可視化地通過數據庫來創(chuàng)建DataSet,不必被繁雜的代碼或設置所困擾。(1)利用“數據”工具箱中的Connection控件創(chuàng)建一個數據庫連接,例如選擇SqlConnection控件,創(chuàng)建一個SQL數據庫連接。(2)利用新建的SQL數據庫連接創(chuàng)建一個SqlDataAdapter對象(名稱為SqlDataAdapter1),并配置適配器,選擇需要的數據表和查詢語句。(3)在SqlDataAdapter1控件上的“SqlDataAdapter任務”窗口中,單擊“生成數據集”超級鏈接,可打開“生成數據集”對話框,如圖7.21所示。如果數據庫需要用戶賬號,在此操作中還會打開一個對話框要求輸入

27、用戶賬號和密碼,才允許訪問數據庫并生成數據集。(4)選擇“新建”單選按鈕,并在其后的文本框中輸入新的DataSet的名稱,例如,DataSet1。然后在“選擇要添加到數據集中的表”列表框中啟用要添加到DataSet中的表。如果要將新建的數據集添加到設計器中,可啟用“將此數據集添加到設計器”復選框,然后單擊“確定”按鈕即完成DataSet的創(chuàng)建。通過數據庫創(chuàng)建數據集之后,打開數據集的“屬性”窗口,如圖7.22所示。通過該屬性窗口可以設置DataSet的一些常用屬性,并可以查看DataSet的構架和詳細屬性。如果要查看DataSet的構架,單擊“查看構架”超級鏈接,可打開DataSet的構架文件(

28、擴展名為.xsd,例如DataSet1.xsd)來顯示構架。 7.7.3 DataSet的數據預覽通過數據庫創(chuàng)建DataSet之后,就可以供應用程序處理和顯示。不過,為了保證數據庫連接和DataSet生成的正確性,VB.NET提供了DataSet的預覽功能。通過它,開發(fā)人員可以在使用DataSet之前預覽DataSet中的內容。要預覽通過數據庫生成的DataSet,可打開當前窗體的快捷菜單或DataAdapter對象的“SqlDataAdapter任務”窗口,然后單擊“預覽數據”超級鏈接,可打開“數據適配器預覽”對話框,如圖7.23所示。通過該對話框,可以預覽當前應用程序中的所有數據適配器(D

29、ataSetCommand對象)中的DataSet及其具體內容。如果“結果”列表框中顯示的內容沒有問題,則DataSet對象被正確地創(chuàng)建。7.8 DataView的使用DataView對象類似于SQL Server數據庫中的視圖功能,提供對DataTable的檢視、列排序、過濾記錄以及記錄的搜索。DataView對象常常被Windows窗體或Web窗體控件數據綁定(DataBinding),而且能夠在不同的控件中同時提供同一數據的多個視圖。DataView的使用,增加了ADO.NET在數據應用上的靈活性。為指定的DataTable創(chuàng)建一個新的DataView,可以聲明該DataView,并把D

30、ataTable的一個引用傳送給DataView構造函數,代碼如下:Dim MyNewDataView As New DataView(MyDataSet.Tables("Customers")在第一次創(chuàng)建DataView時,DataView默認為DataSet中的所有行。利用屬性可以在DataView中得到數據行的一個子集,或者給這些行排序。這些屬性可以隨時修改,動態(tài)改變DataSet的輸出。7.8.1取得DefaultView屬性在DataSet中,DataTable提供了一個DefaultView屬性,該屬性可以獲取包括排序、篩選和搜索等自定義的視圖。例如下面的代碼:

31、Dim dv As New DataView()SqlDataAdapter1.Fill(DataSet11, "Products") dv = DataSet11.Tables("Products").DefaultView DataGrid1.DataSource = dv上面的代碼先創(chuàng)建一個名為dv的DataView對象,然后從DataSet11中取得Products,并通過DefaultView將內容返回給默認的DataView,最后,通過DataGrid1控件來接收并顯示數據。7.8.2 條件過濾要通過條件過濾來獲取數據的子集,一般利用Data

32、View的RowFilter和RowStateFilter屬性來實現。RowFilter屬性用于提供過濾表達式,例如下面的代碼可以取出FirstName列為Anny的記錄:MyNewDataView.RowFilter="FirstName='Anny'"如果要進行模糊條件設置,可使用Like、*和%等字符。例如,在為Customers表定義的DataView中,可以把DataView設置為只返回公司名以字母A開頭的客戶,代碼如下:MyNewDataView.RowFilter= "CompanyName Like 'A*' &qu

33、ot;RowFilter表達式可以非常復雜,也可以包含涉及多個行的數據、常數的算術計算和比較。例如,可以在過濾條件中使用and和or等操作數。RowStateFilter屬性與RowFilter屬性有所不同,它定義了從DataTable中提取特定DataSet的值,表7.6所示為RowStateFilter可用的值及其說明。RowStateFilter的值可以以各種形式合并使用,方法是在設置RowStateFilter屬性時把它們加在一起。例如,下面的代碼就讓DataView只顯示新行和已刪除的行:MyNewDataView.RowStateFilter=DataViewRowState.Ne

34、w+DataViewRowState.Deleted表7.6 RowStateFilter 可用的值設 置說 明CurrentRows顯示當前行,包括未改變的行、新行和已修改的行當前行,但不顯示已刪除的行Deleted顯示已刪除的行。注意,如果使用了DataTable或DataView的Delete方法刪除了某一行,該行才被認為已刪除。從Rows集合中刪除行,不會把這些行標記為已刪除。ModifiedCurrent顯示帶有當前版本的數據的行,這些數據不同于該行中的原數據ModifiedOriginal顯示已修改的行,但顯示數據的原版本(即使數據行已被改變,其中已有另一個當前版本的數據,也是這樣

35、)。注意,這些行中當前版本的數據可以用ModifiedCurrent設置來提取New顯示新行,這些行是用DataView的AddNew方法添加的None不顯示任何行,在用戶選擇顯示選項前,可以使用這個設置來初始化控件的DataViewOriginalRows顯示所有帶有源數據版本的行,包括未改變的行和已刪除的行Unchanged顯示未修改的行7.8.3 列排序DataView的Sort屬性帶一個描述排序的字符串,可以在一個或多個列上進行排序,每個列可以按升序或降序來排列。指定排序的字符串應包含一個列名,后面可以有表示升序的ASC或表示降序的DESC,默認是升序。對于多列排序,該字符串應在第一個

36、列名后有一個逗號,其后是另一個列名和ASC或DESC。其中,列的個數可以按需要確定。例如,下面的代碼先按單價(unitPrice)對DataView中的行進行升序排序,然后在給定的相同單價中,再按照庫存量(Stocks)進行降序排序。MyNewDataView.Sort="unitPrice ASC , Stocks DESC"7.8.4 使用DataView控件在“數據”工具箱中,有一個DataView控件。通過它,開發(fā)人員可以快速地創(chuàng)建DataView對象,并可視化地設置過濾條件、排序方式和要操作的表等屬性。在DataView控件的“屬性”對話框中,有8個常用屬性,它們

37、的設置說明如表7.7所示。表7.7 DataView控件的常用屬性屬 性說 明AllowDelete設置當前DataView,以及與之關聯(lián)的用戶界面是否允許刪除AllowEdit設置當前DataView,以及與之關聯(lián)的用戶界面是否允許編輯AllowNew設置當前DataView,以及與之關聯(lián)的用戶界面是否允許添加新行ApplyDefaultSort設置是否應用默認的排序方式RowFilter設置用于篩選當前DataView返回的數據的表達式RowStateFiler設置當前DataView返回的數據的版本Sort設置當前DataView返回數據的排序方式Table設置當前DataView要返回

38、數據的DataSet的表(當前應用程序中的所有DataSet及其表都列在該屬性后面的下拉列表框中)7.9 控件與數據綁定利用ADO.NET連接數據庫并創(chuàng)建DataSet,主要是為了顯示和操作數據庫中的數據。要在應用程序中實現數據的顯示和操作,則必須將數據與窗體中的控件綁定起來,通過控件來顯示和處理數據。VB.NET中的控件有多種,有些控件一次可以顯示一條記錄的一列,例如TextBox和Label等。對于它們的數據綁定是簡單的控件數據綁定,利用Bindings集合來指定綁定的屬性、數據來源和列。另外一些控件可以顯示多條記錄,例如DataGrid,ListBox和ComboBox等控件。對于它們的

39、數據綁定是復雜的控件數據綁定,利用DataSource屬性來指定數據源。7.9.1 簡單的數據綁定對于TextBox和Label等控件,一次只能顯示出一個記錄的一列。如果需要他們來顯示和處理數據,就只能使用Bindings進行簡單數據綁定。綁定時一個集合對象代表一個控件的多個屬性,可以與不同數據來源的列綁定。不過,要注意列與屬性的特征是否相符合。簡單數據綁定的語法如下:控件.Bindings.Add("Property",DataSource,"DataMember")在上面的參數中,Property(屬性)可以設置控件的任何屬性,如Text,DataSource(數據源)是指DataTable,DataView,DataSet或者一組數組變量,DataMember(數據成員)用來設置某

溫馨提示

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

最新文檔

評論

0/150

提交評論