在Oracle數(shù)據(jù)庫上構(gòu)建.NET應(yīng)用程序_第1頁
在Oracle數(shù)據(jù)庫上構(gòu)建.NET應(yīng)用程序_第2頁
在Oracle數(shù)據(jù)庫上構(gòu)建.NET應(yīng)用程序_第3頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

隨著Microsoft的.NET框架的漸漸流行,很多開發(fā)人員迫切想了解關(guān)于

將.NET應(yīng)用程序與Oracle集成的最好的方式的信息—不僅在根本的連通性方面,還包括與使用VisualStudio.NET(VS.NET)進展有效的應(yīng)用程序開發(fā)的關(guān)系。在本文中,我將說明構(gòu)建使用Oracle數(shù)據(jù)庫的.NET應(yīng)用程序所涉及到的根本但不行或缺的過程,包括:

如何添加工程引用,以在您的.NET工程中支持Oracle類

如何創(chuàng)立Oracle數(shù)據(jù)庫連接字符串

如何使用Connection、Command和DataReader對象。

您將有時機應(yīng)用您在三個上機操作實踐中學(xué)到的內(nèi)容,難度范圍從比較輕易到更簡單。.NETDataProvider除了根本的Oracle客戶端連通性軟件,.NET應(yīng)用程序還需要使用稱為manageddataprovider〔其中“managed“指的是代碼由.NET框架治理〕的工具。數(shù)據(jù)供給程序是.NET應(yīng)用程序代碼和Oracle客戶端連通性軟件之間的層。在幾乎全部狀況下,最優(yōu)的性能都是通過使用為特定數(shù)據(jù)庫平臺優(yōu)化了的供給程序而不是一般的.NETOLEDB數(shù)據(jù)供給程序?qū)崿F(xiàn)的。Oracle、Microsoft和第三方供給商都供給了針對Oracle產(chǎn)品進展了優(yōu)化的數(shù)據(jù)供給程序。Oracle和Microsoft免費供給其Oracle數(shù)據(jù)供給程序。

〔Microsoft為.NET框架的1.1版供給的供給程序包含在該框架中,不需要單獨下載或安裝?!骋恍┑谌綌?shù)據(jù)供給程序支持Oracle的較早的版本,或者不需要安裝Oracle客戶端軟件。在本文中,我們假設(shè)使用OracleDataProviderfor.NET(ODP.NET),并單獨供給下載。當安裝了ODP.NET和全部要求的Oracle客戶端連通性軟件時,就可以開頭使用VisualStudio.NET進展應(yīng)用程序開發(fā)了。在開頭開發(fā)前,請先確認客戶端連通性。假設(shè)您在VS.NET所在的計算機上使用SQL*Plus能夠與Oracle連接,那么證明您已經(jīng)正確地安裝和配置了Oracle客戶端軟件。假設(shè)您剛接觸Oracle,那么請參閱OracleDataProviderfor.NET開發(fā)人員指南10g版本1(10.1)中的“與Oracle數(shù)據(jù)庫連接”局部,以了解ODP.NET的背景信息,或參閱Oracle數(shù)據(jù)庫治理員指南10g版本1(10.1),以了解關(guān)于治理Oracle數(shù)據(jù)庫的通用信息。您還可以查閱“使用ODP.NET與Oracle數(shù)據(jù)庫連接”例如代碼“方法”文檔。在VisualStudio.NET中創(chuàng)立工程在啟動VS.NET之后,第一個任務(wù)是創(chuàng)立一個工程。您可以單擊NewProject按鈕或選擇FileNewProject...〔如下所

示〕。

點擊查看大圖

圖1:在VisualStudio.NET中創(chuàng)立一個工程消滅一個NewProject對話框。在對話框左側(cè)的ProjectTypes下,選擇您的編程語言。在這個例子中,我們選擇VB.NET。在右側(cè)的Templates下,選擇一個工程模板。為簡潔起見,這里選擇WindowsApplication。

2:使用NewProject對話框您將需要為工程〔我們使用OtnWinApp〕和解決方案〔我們使用OtnSamples〕指定有意義的名稱。一個解決方案包含一個或多個工程。當一個解決方案僅包含一個工程時,很多人對二者使用一樣的名稱。添加引用由于我們的工程必需與Oracle數(shù)據(jù)庫連接,因此必需添加一個到包含我們選擇的數(shù)據(jù)供給程序的dll的引用。在SolutionEXPlorer內(nèi),選擇References節(jié)點,右鍵單擊并選擇AddReference?;蛘?,您可以轉(zhuǎn)至菜單欄并選擇Project,然后選擇AddReference。

點擊查看大圖

圖3:添加引用消滅AddReference對話框。

圖4:選擇ODP.NET治理的數(shù)據(jù)供給程序從列表中選擇

Oracle.DataAccess.dll,然后單擊Select按鈕,最終單擊OK按鈕,使您的

工程能夠找到ODP.NET數(shù)據(jù)供給程序。圖5:選擇OracleManagedProvider之后的解決方案掃瞄器VB.NET/C#語句在添加引用之后,標準的做法是要添加VB.NETImports語句、C#using語句或J#import語句。從技術(shù)上說這些語句不是必要的,但是使用它們可以讓您不需用冗長且完整名稱來引用數(shù)據(jù)庫對象。

依據(jù)慣例,這些語句消滅在代碼文件的頂部或頂部四周,在命名空間或類聲明之

前。ImportsSystem.Data”VB.NETImportsOracle.DataAccess.Client”O(jiān)DP.NETOraclemanagedproviderusingSystem.Data;//C#usingOracle.DataAccess.Client;//ODP.NETOraclemanagedproviderimportSystem.Data.*;//J#importOracle.DataAccess.Client;//ODP.NETOraclemanagedprovider

連接字符串和對象Oracle連接字符串和Oracle名稱解析是不行分的。假定我們在tnsnames.ora文件中定義了一個數(shù)據(jù)庫別名OraDb,如下:OraDb=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)))

要使用上面所述的在tnsnames.ora文件中定義的OraDb別名,您需要使用以下語法:DimoradbAsString=“DataSource=OraDb;UserId=scott;PassWord=tiger;“”VB.NETstringoradb=“DataSource=OraDb;UserId=scott;Password=tiger;“;//C#

不過,您可以修改連接字符串,這樣就不需用tnsnames.ora文件。只需用在tnsnames.ora文件中定義別名的語句替換別名即可?!盫B.NETDimoradbAsString=“DataSource=(DESCRIPTION=“_+“(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))“_+“(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));“_+“User

Id=scott;Password=tiger;“stringoradb=“DataSource=(DESCRIPTION=“//C#+“(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))“+“(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));“+“User

Id=scott;Password=tiger;“;

正如您在上面看到的那樣,用戶名和口令是以不加密的文本形式嵌入到連接字符串中的。這是創(chuàng)立連接字符串的最簡潔的方法。然而,從安全的角度而言不加密文本的方法是不行取的。而且,您需要了解編譯的.NET應(yīng)用程序代碼僅比不加密文本形式的源代碼文件略微安全一點??梢愿裢夂啽愕姆淳幾g.NETdll和exe文件,進而查看原始的不加密文本形式的內(nèi)容?!布用軐嶋H上是正確的解決方案,但這個主題與我們這里的爭辯相差太遠。〕

接下來,您必需從連接類中完成一個連接對象的實例化。連接字符串必需與連接對象關(guān)聯(lián)。DimconnAsNewOracleConnection(oradb)”VB.NETOracleConnectionconn=newOracleConnection(oradb);//C#

留意,通過將連接字符串傳遞給連接對象的構(gòu)造器〔該構(gòu)造器進展了重載〕,連接字符串與連接對象建立關(guān)聯(lián)。構(gòu)造函數(shù)的其他重載同意以下這些替代的語法:DimconnAsNewOracleConnection”VB.NETconn.ConnectionString=oradbOracleConnectionconn=newOracleConnection;//C#conn.ConnectionString=oradb;

在連接字符串與連接對象建立關(guān)聯(lián)之后,使用Open方法來創(chuàng)立實際的連接。

conn.Open”VB.NETconn.Open;//C#

我們將在稍后介紹錯誤處理。Command對象Command對象用于指定執(zhí)行的SQL

命令文本—SQL字符串或存儲過程。類似于Connection對象,它必需從完

成其類的實例化,并且它擁有一個重載的構(gòu)造函數(shù)。DimsqlAsString=“selectdnamefromdeptwheredeptno=10“”VB.NETDimcmdAsNewOracleCommand(sql,conn)cmdmandType=CommandType.Textstringsql=“selectdnamefromdeptwheredeptno=10“;//C#OracleCommandcmd=newOracleCommand(sql,conn);cmdmandType=CommandType.Text;

不同的重載,語法的構(gòu)造略微有點不同。Command對象有用于執(zhí)行命令文本的方法。不同的方法適用于不同類型的SQL命令。檢索標量值從數(shù)據(jù)庫中檢索數(shù)據(jù)可以通過實例化一個DataReader對象并使用ExecuteReader方法〔它返回一個OracleDataReader對象〕來實現(xiàn)。通過將列名稱或以零為基數(shù)的列序號傳遞給項屬性B.NET開發(fā)人員可以訪問返回的數(shù)據(jù)。另一種選擇是使用存取程序類型方法來返回列數(shù)據(jù)。DimdrAsOracleDataReader=cmd.ExecuteReader”VB.NETdr.ReadLabel1.Text=dr.Item(“dname“)”retrievebycolumnnameLabel1.Text=dr.Item(0)”retrievethefirstcolumnintheselectlistLabel1.Text=dr.GetString(0)”retrievethefirstcolumnintheselectlist

C#開發(fā)人員必需使用存取器方法來檢索數(shù)據(jù)。有適當類型的存取程序用于返回.NET本地數(shù)據(jù)類型,其他的存取程序用于返回本地Oracle數(shù)據(jù)類型。以零為基數(shù)的序號被傳遞給存取程序,以指定返回哪一列。OracleDataReaderdr

=cmd.ExecuteReader;//C#dr.Read;label1.Text=dr.GetString(0);//C#retrievethefirstcolumnintheselectlist

在這個簡化的例子中,dname的返回值是一個字符串,它用來設(shè)置標簽控件的文本的屬性值〔也是一個字符串〕。但假設(shè)檢索的是deptno,而不是字符串,那么將消滅數(shù)據(jù)類型不匹配的狀況。當源數(shù)據(jù)類型與目標數(shù)據(jù)類型不匹配時,.NET運行時將嘗試隱式地轉(zhuǎn)換數(shù)據(jù)類型。有時數(shù)據(jù)類型不兼容,則隱式轉(zhuǎn)換將失敗,并跳出一個特別警報。但即使可以進展隱式轉(zhuǎn)換,使用顯式數(shù)據(jù)類型轉(zhuǎn)換仍比用隱式數(shù)據(jù)類型轉(zhuǎn)換好。到整型的顯式轉(zhuǎn)換顯示如下:Label1.Text=

CStr(dr.Item(“deptno“))”VB.NETintegertostringcast

在隱式轉(zhuǎn)換上,C#的容錯力量不如VB.NET。您必需自己執(zhí)行顯式轉(zhuǎn)換:stringdeptno=dr.GetInt16(“deptno“).ToString;//C#

您可以顯式地轉(zhuǎn)換標量值以及數(shù)組。關(guān)閉并去除可以調(diào)用連接對象的Close方法或Dispose方法來關(guān)閉到數(shù)據(jù)庫的連接。Dispose方法調(diào)用Close方法。conn.Close”VB.NETconn.Dispose”VB.NETconn.Close;//C#conn.Dispose;//C#

作為可選項,C#供給了一種在連接超出范圍時自動去除連接的非凡語法。使用using要害字可啟用這一特性。using(OracleConnectionconn=newOracleConnection(oradb)){conn.Open;OracleCommandcmd=newOracleCommand;cmd.Connection=conn;cmdmandText=“selectdnamefromdeptwheredeptno=10“;cmdmandType=CommandType.Text;OracleDataReaderdr=cmd.ExecuteReader;dr.Read;label1.Text=dr.GetString(0);}

您可以試驗在上機操作1〔從數(shù)據(jù)庫中檢索數(shù)據(jù)〕和上機操作2〔增加交互性〕中學(xué)到的一些概念。錯誤處理Try-Catch-Finally構(gòu)造的錯誤處理是.NET語言的一局部。下面是使用Try-Catch-Finally語法的一個相對最小的例子:DimconnAsNewOracleConnection(oradb)”VB.NETTryconn.OpenDimcmd

AsNewOracleCommandcmd.Connection=conncmdmandText=“selectdnamefromdeptwheredeptno=“+TextBox1.TextcmdmandType=CommandType.TextIfdr.ReadThenLabel1.Text=dr.Item(“dname“)”orusedr.Item(0)EndIfCatchexAsException”catchesanyerrorMessageBox.Show(ex.Message.ToString)Finallyconn.DisposeEndTryOracleConnectionconn=newOracleConnection(oradb);//C#try{conn.Open;OracleCommandcmd=newOracleCommand;cmd.Connection=conn;cmdmandText=“selectdnamefromdeptwheredeptno=“+textBox1.Text;cmdmandType=CommandType.Text;if(dr.Read)//C#{label1.Text=dr.GetString(0);}}catch(Exceptionex)

//catchesany

error{MessageBox.Show(ex.Message.ToString);}finally{conn.Dispose(

);}

雖然這種方法將適當?shù)夭东@嘗試從數(shù)據(jù)庫中獵取數(shù)據(jù)時發(fā)生的任何錯誤,但這種方法對用戶卻不友好。例如,看看下面這條在數(shù)據(jù)庫不行用時顯示的消息。

圖6:捕獲到一個

ORA-12545錯誤,并向用戶顯示。OracleDBA或開發(fā)人員很清楚ORA-12545的意義,但是最終用戶不清楚。一種更好的解決方案是添加一條額外的Catch語句來捕獲最常見的數(shù)據(jù)庫錯誤并顯示對用戶友好的消息。OracleExceptionclassdoesnothaveaNumberpropertyinVB.NET.)-->CatchexAsOracleException”catchesonlyOracleerrorsIfInStr(1,ex.Message.ToString,“ORA-1:“,CompareMethod.Text)ThenMessageBox.Show(“Errorattemptingtoinsertduplicatedata.“)ElseIfInStr(1,ex.Message.ToString,“ORA-12545:“,CompareMethod.Text)ThenMessageBox.Show(“Thedatabaseisunavailable.“)ElseMessageBox.Show(“Databaseerror:“+ex.Message.ToString)EndIfCatchexAsException”catchesanyerrorMessageBox.Show(ex.Message.ToString)catch(OracleExceptionex)//catchesonlyOracleerrors{switch(ex.Number){case1:MessageBox.Show(“Errorattemptingtoinsertduplicatedata.“);break;case12545:MessageBox.Show(“Thedatabaseisunavailable.“);break;default:MessageBox.Show(“Databaseerror:“+ex.Message.ToString);break;}}catch(Exceptionex)//catchesany

error{MessageBox.Show(ex.Message.ToString);}

留意上面的代碼例如中的兩條Catch語句。假設(shè)沒有捕獲到任何Oracle錯誤,那么將跳過第一條Catch語句分支,讓其次條Catch語句來捕獲其他任何類型的錯誤。在代碼中,應(yīng)當依據(jù)從非凡到一般的挨次對Catch語句排序。在

實施了對用戶友好的特別處理代碼之后,ORA-12545錯誤消息顯示如下:

圖7:針對ORA-12545錯誤的對用戶友好的消息Finally代碼將始終執(zhí)行,而無論錯誤是否發(fā)生。通過在Finally代碼塊中參加連接對象的Close或Dispose方法調(diào)用,在執(zhí)行了Try-Catch-Finally代碼段之后,數(shù)據(jù)庫連接將始終關(guān)閉。試圖關(guān)閉沒有翻開的數(shù)據(jù)庫連接不會導(dǎo)致錯誤。例如,假設(shè)數(shù)據(jù)庫不行用,數(shù)據(jù)庫連接沒有翻開,那么Finally代碼塊將試圖關(guān)閉不存在的連接。執(zhí)行多余的Close或Dispose是無效的。只需將一條Close或Dispose方法放到Finally代碼塊中,將保證關(guān)閉連接。利用DataReader檢索多個值

到目前為止,我們的例如僅說明白如何檢索單個值。DataReader可以檢索多列和多行的值。首先進展多行、單列的查詢:selectdeptno,dname,locfromdeptwheredeptno=10

要獵取列的值,可以使用以零為基數(shù)的序號或列名。序號與查詢中的挨次相關(guān)。因而,可以在VB.NET中通過使用dr.Item(2)或dr.Item(“l(fā)oc“)來查詢loc列的值。下面是將dname和來自上一查詢的loc列串連起來的代碼段:Label1.Text=“The“+dr.Item(1)+“departmentisin“+dr.Item(“l(fā)oc“)”VB.NETLabel1.Text=“The“+dr.GetString(1)+“departmentisin“+dr.GetString(2);//C#

現(xiàn)在我們進展返回多行的查詢:selectdeptno,dname,locfromdept

要處理從DataReader中返回的多行,需要某種類型的循環(huán)構(gòu)造。此外,需要一個可以顯示多行的控件。DataReader是一個僅正向的只讀游標,因此不能將其與可更或完全可滾動的控件〔如WindowsFormsDataGrid控件〕捆綁在一起。DataReader與ListBox控件兼容,如以下代碼段所示:Whiledr.Read”VB.NETListBox1.Items.Add(“The“+dr.Item(1)+“departmentisin“

+dr.Item(“l(fā)oc“))EndWhilewhile(dr.Read)//

C#{listBox1.Items.Add(“The“+dr.GetString(1)+“departmentisin“

+dr.GetString(2);}

上機操作3〔利用DataReader檢索多列和多行)重點介紹了這些概念中的一局部。

總結(jié)本文向您介紹了使用VS.NET編程語言訪問Oracle數(shù)據(jù)庫的過程。您現(xiàn)在應(yīng)當能夠連接數(shù)據(jù)庫并檢索多列和多行。

JohnPaulCook(johnpaulcook@email)是居住在休斯頓的一位數(shù)據(jù)庫

和.NET參謀。他撰寫了很多關(guān)于.NET、Oracle和其他主題的文章,并從1986年以來始終開發(fā)關(guān)系數(shù)據(jù)庫應(yīng)用程序。他目前的愛好包括VisualStudio2022和Oracle10g。他是Oracle認證DBA和MicrosoftMCSDfor.NET。上機操作1:從數(shù)據(jù)庫中檢索數(shù)據(jù)

首先向Windows表單添加一個按鈕控件和一個標簽控件。務(wù)必在這些控件上方保存空間,以便在上機操作2中添加控件。

圖8:在上機操作1中包含按鈕和標簽控件的表單

添加代碼,它們用于從Oracle數(shù)據(jù)庫中檢索數(shù)據(jù)并在表單上顯示結(jié)果。將代碼放在按鈕的單擊大事處理程序中。開頭這項任務(wù)的最輕易的方式是雙擊該按鈕,由于它將為大事處理程序創(chuàng)立一個stub。

圖9:單擊大事處理程序stub。

在PublicClass聲明之前添加VB.NETImports語句,或在命名空間聲明之前添加C#using語句。ImportsSystem.Data”VB.NETImportsOracle.DataAccess.Client”O(jiān)DP.NETOraclemanagedproviderusingSystem.Data;//C#usingOracle.DataAccess.Client;//ODP.NETOraclemanagedprovider

在PrivateSub和EndSub語句之間添加VB.NET版本大事語句代碼

〔確保用您的效勞器的主機名稱替代OTNSRVR〕:DimoradbAsString

=“DataSource=(DESCRIPTION=(ADDRESS_LIST=“_+“(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))“_+“(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));“_+

“UserId=scott;Password=tiger;“DimconnAsNewOracleConnection(oradb)”VB.NETconn.OpenDimcmdAsNewOracleCommandcmd.Connection=conncmdmandText=“selectdnamefromdeptwheredeptno=10“cmdmandType=CommandType.TextDimdrAsOracleDataReader=cmd.ExecuteReaderdr.ReadLabel1.Text

=dr.Item(“dname“)”ordr.Item(0)conn.Dispose

將以下C#代碼添加到按鈕的單擊大事處理程序中的括號{和}之間,并確保用您的效勞器的主機名稱替代OTNSRVR:stringoradb=“Data

Source=(DESCRIPTION=(ADDRESS_LIST=“+“(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))“+“(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));“+“User

Id=scott;Password=tiger;“;OracleConnectionconn=newOracleConnection(oradb);//C#conn.Open;OracleCommandcmd=newOracleCommand;cmd.Connection=conn;cmdmandText=“selectdnamefromdeptwheredeptno=10“;cmdmandType=CommandType.Text;OracleDataReaderdr=cmd.ExecuteReader;dr.Read;label1.Text=dr.GetString(0);conn.Dispose;

運行應(yīng)用程序。單擊按鈕。您將看到以下內(nèi)容:

圖10:成功檢索到數(shù)據(jù)

上機操作2:增加交互性現(xiàn)在在代碼中實施了數(shù)據(jù)庫訪問的根底,下一步是為應(yīng)用程序增加交互性??梢蕴砑右粋€文本框來接收用戶輸入的部門號碼(deptno),而不是運行硬編碼的查詢。

向表單中添加一個文本框控件和另一個標簽控件〔如下所示〕:將Label2控件的文本屬性設(shè)為EnterDeptno:并確保沒有將TextBox1的Text屬性設(shè)為任何東西。

圖11:包含按鈕和標簽控件的表單〔上機操作2〕

修改定義選擇字符串的代碼:cmdmandText=“selectdnamefromdeptwheredeptno=“+TextBox1.Text”VB.NETcmdmandText=“selectdnamefromdeptwheredeptno=“+textBox1.Text;//C#

運行應(yīng)用程序。在deptno輸入10,測試應(yīng)用程序。輸入一個無效的

deptno〔例如50〕,重測試應(yīng)用程序。應(yīng)用程序?qū)⑼顺觥?/p>

圖12:一個未處理的特別

修改代碼以防止在輸入無效的deptno時消滅錯誤。讓我們回憶一下,ExecuteReader方法實際返回一個對象。Ifdr.ReadThen”VB.NETLabel1.Text=dr.Item(“dname“)ElseLabel1.Text=“deptnonotfound“EndIfif(dr.Read)//C#{label1.Text=dr.Item(“dname“);}Else{label1.Text=“deptnonotfound“;}

輸入不存在的deptno數(shù)字,測試應(yīng)用程序?,F(xiàn)在應(yīng)用程序不再退出。輸入字母A代替數(shù)字,然后單擊按鈕。應(yīng)用程序退出。很明顯,我們的應(yīng)用程序需要更好的方法以處理錯誤??赡苡腥藭赋?,應(yīng)用程序應(yīng)當不充許用戶進展將導(dǎo)致錯誤的無效輸入,但最終應(yīng)用程序必需添加強健的錯誤處理功能。不是全部的錯誤都是可預(yù)防的,因此必需實施錯誤處理。

上機操作3:利用DataReader檢索多行和多列現(xiàn)在檢索了單個值,下一步就是利用DataReader檢索多行和多列。添加一個ListBox控件到表單中,以顯示結(jié)果。

添加一個ListBox控件到表單中。重調(diào)整控件的大小,以填滿表單的大局部寬度〔如下所示〕。

圖1

溫馨提示

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

評論

0/150

提交評論