|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
完全不一样的。.net其实我也说不太清,.net可以把他理解为跟J2EE相对的工具。c++主要做系统相关的开发你要学.net的话就应该学C#。(其实微软在.NET平台上也考虑了给C++留一个地位。oracle|程序|数据|数据库跟着Microsoft的.NET框架的渐渐盛行,很多开辟职员急切想懂得关于将.NET使用程序与Oracle集成的最好的体例的信息―不但在基础的连通性方面,还包含与利用VisualStudio.NET(VS.NET)举行无效的使用程序开辟的干系。
<P> 在本文中,我将申明构建利用Oracle数据库的.NET使用程序所触及到的基础但不成或缺的历程,包含:
- 怎样增加工程援用,以在您的.NET工程中撑持Oracle类
- 怎样创立Oracle数据库毗连字符串
- 怎样利用Connection、Command和DataReader工具。
您将无机会使用您在三个上机操纵理论中学到的内容,难度局限从对照简单到更庞大。
.NETDataProvider
除基础的Oracle客户端连通性软件,.NET使用程序还必要利用称为manageddataprovider(个中"managed"指的是代码由.NET框架办理)的工具。数据供给程序是.NET使用程序代码和Oracle客户端连通性软件之间的层。在几近一切情形下,最优的功能都是经由过程利用为特定命据库平台优化了的供给程序而不是一样平常的.NETOLEDB数据供给程序完成的。
Oracle、Microsoft和第三方供给商都供应了针对Oracle产物举行了优化的数据供给程序。Oracle和Microsoft收费供应其Oracle数据供给程序。(Microsoft为.NET框架的1.1版供应的供给程序包括在该框架中,不必要独自下载或安装。)一些第三方数据供给程序撑持Oracle的较早的版本,大概不必要安装Oracle客户端软件。在本文中,我们假定利用OracleDataProviderfor.NET(ODP.NET),并独自供应下载。
当安装了ODP.NET和一切请求的Oracle客户端连通性软件时,就能够入手下手利用VisualStudio.NET举行使用程序开辟了。在入手下手开辟前,请先确认客户端连通性。假如您在VS.NET地点的盘算机上利用SQL*Plus可以与Oracle毗连,那末证实您已准确地安装和设置了Oracle客户端软件。
假如您刚打仗Oracle,那末请参阅OracleDataProviderfor.NET开辟职员指南10g版本1(10.1)中的“与Oracle数据库毗连”部分,以懂得ODP.NET的背景信息,或参阅Oracle数据库办理员指南10g版本1(10.1),以懂得关于办理Oracle数据库的通用信息。您还能够查阅“利用ODP.NET与Oracle数据库毗连”示例代码“办法”文档。
在VisualStudio.NET中创立工程
<Pstyle="TEXT-INDENT:2em">在启动VS.NET以后,第一个义务是创立一个工程。您能够单击NewProject按钮或选择File|New|Project...(以下所示)。<P>
:在VisualStudio.NET中创立一个新工程<P> 呈现一个NewProject对话框。在对话框左边的ProjectTypes下,选择您的编程言语。在这个例子中,我们选择VB.NET。在右边的Templates下,选择一个工程模板。为复杂起见,这里选择WindowsApplication。
:利用NewProject对话框
您将必要为工程(我们利用OtnWinApp)息争决计划(我们利用OtnSamples)指定成心义的称号。一个办理计划包括一个或多个工程。当一个办理计划仅包括一个工程时,很多人对两者利用不异的称号。
增加援用
<P> 由于我们的工程必需与Oracle数据库毗连,因而必需增加一个到包括我们选择的数据供给程序的dll的援用。在SolutionExplorer内,选择References节点,右键单击并选择AddReference。大概,您能够转至菜单栏并选择Project,然后选择AddReference。
:增加援用
<Pstyle="TEXT-INDENT:2em">呈现AddReference对话框。<P>
:选择ODP.NET办理的数据供给程序<P> 从列表当选择Oracle.DataAccess.dll,然后单击Select按钮,最初单击OK按钮,使您的工程可以找到ODP.NET数据供给程序。
:选择OracleManagedProvider以后的办理计划扫瞄器
VB.NET/C#语句
<P> 在增加援用以后,尺度的做法是要增加VB.NETImports语句、C#using语句或J#import语句。从手艺上说这些语句不是需要的,可是利用它们可让您不需用冗杂且完全称号来援用数据库工具。
依照常规,这些语句呈现在代码文件的顶部或顶部四周,在定名空间或类声明之前。- [code]ImportsSystem.DataVB.NET
- ImportsOracle.DataAccess.ClientODP.NETOraclemanagedprovider
复制代码- usingSystem.Data;
- //C#
- usingOracle.DataAccess.Client;
- //ODP.NETOraclemanagedprovider
复制代码- importSystem.Data.*;
- //J#
- importOracle.DataAccess.Client;
- //ODP.NETOraclemanagedprovider
复制代码 [/code] 毗连字符串和工具
<P> Oracle毗连字符串和Oracle称号剖析是不成分的。假定我们在tnsnames.ora文件中界说了一个数据库别号OraDb,以下:- [code]OraDb=
- (DESCRIPTION=
- (ADDRESS_LIST=
- (ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521))
- )
- (CONNECT_DATA=
- (SERVER=DEDICATED)
- (SERVICE_NAME=ORCL)
- )
- )
复制代码 [/code] 要利用下面所述的在tnsnames.ora文件中界说的OraDb别号,您必要利用以下语法:- [code]DimoradbAsString="DataSource=OraDb;UserId=scott;Password=tiger;"VB.NET
复制代码- stringoradb="DataSource=OraDb;UserId=scott;Password=tiger;";
- //C#
复制代码 [/code]<Pstyle="TEXT-INDENT:2em">不外,您能够修正毗连字符串,如许就不需用tnsnames.ora文件。只需用在tnsnames.ora文件中界说别号的语句交换别号便可。- [code]VB.NET
- DimoradbAsString="DataSource=(DESCRIPTION="_
- +"(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))"_
- +"(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));"_
- +"UserId=scott;Password=tiger;"
复制代码- stringoradb="DataSource=(DESCRIPTION="//C#
- +"(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))"
- +"(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));"
- +"UserId=scott;Password=tiger;";
复制代码 [/code] 正如您在下面看到的那样,用户名和口令是以不加密的文本情势嵌进到毗连字符串中的。这是创立毗连字符串的最复杂的办法。但是,从平安的角度而言不加密文本的办法是不成取的。并且,您必要懂得编译的.NET使用程序代码仅比不加密文本情势的源代码文件略微平安一点。能够十分烦琐的反编译.NETdll和exe文件,进而检察原始的不加密文本情势的内容。(加密实践上是准确的办理计划,但这个主题与我们这里的会商相差太远。)
接上去,您必需从毗连类中完成一个毗连工具的实例化。毗连字符串必需与毗连工具联系关系。- [code]DimconnAsNewOracleConnection(oradb)VB.NET
复制代码- OracleConnectionconn=newOracleConnection(oradb);//C#
复制代码 [/code] 注重,经由过程将毗连字符串传送给毗连工具的机关器(该机关器举行了重载),毗连字符串与毗连工具创建联系关系。机关函数的其他重载同意以下这些替换的语法:- [code]DimconnAsNewOracleConnection()VB.NET
- conn.ConnectionString=oradb
复制代码- OracleConnectionconn=newOracleConnection();//C#
- conn.ConnectionString=oradb;
复制代码 [/code] 在毗连字符串与毗连工具创建联系关系以后,利用Open办法来创立实践的毗连。[/code] 我们将在稍后先容毛病处置。
Command工具
<P> Command工具用于指定实行的SQL命令文本―SQL字符串或存储历程。相似于Connection工具,它必需从完成其类的实例化,而且它具有一个重载的机关函数。- [code]DimsqlAsString="selectdnamefromdeptwheredeptno=10"VB.NET
- DimcmdAsNewOracleCommand(sql,conn)
- cmd.CommandType=CommandType.Text
复制代码- stringsql="selectdnamefromdeptwheredeptno=10";//C#
- OracleCommandcmd=newOracleCommand(sql,conn);
- cmd.CommandType=CommandType.Text;
复制代码 [/code] 分歧的重载,语法的布局略微有点分歧。Command工具有效于实行命令文本的办法。分歧的办法合用于分歧范例的SQL命令。
检索标量值
<P> 从数据库中检索数据能够经由过程实例化一个DataReader工具并利用 ExecuteReader办法(它前往一个OracleDataReader工具)来完成。经由过程将列称号或以零为基数的列序号传送给项属性B.NET开辟职员能够会见前往的数据。另外一种选择是利用存取程序范例办法来前往列数据。- [code]DimdrAsOracleDataReader=cmd.ExecuteReader()VB.NET
- dr.Read()
- Label1.Text=dr.Item("dname")retrievebycolumnname
- Label1.Text=dr.Item(0)retrievethefirstcolumnintheselectlist
- Label1.Text=dr.GetString(0)retrievethefirstcolumnintheselectlist
复制代码 [/code] C#开辟职员必需利用存取器办法来检索数据。有得当范例的存取程序用于前往.NET当地数据范例,其他的存取程序用于前往当地Oracle数据范例。以零为基数的序号被传送给存取程序,以指定前往哪一列。- [code]
- OracleDataReaderdr=cmd.ExecuteReader();//C#
- dr.Read();
- label1.Text=dr.GetString(0);//C#retrievethefirstcolumnintheselectlist
复制代码 [/code] 在这个简化的例子中,dname的前往值是一个字符串,它用来设置标签控件的文本的属性值(也是一个字符串)。但假如检索的是deptno,而不是字符串,那末将呈现数据范例不婚配的情形。当源数据范例与方针数据范例不婚配时,.NET运转时将实验隐式地转换数据范例。偶然数据范例不兼容,则隐式转换将失利,并跳出一个非常警报。但即便能够举行隐式转换,利用显式数据范例转换仍比用隐式数据范例转换好。
<Pstyle="TEXT-INDENT:2em">到整型的显式转换显现以下:- [code]Label1.Text=CStr(dr.Item("deptno"))VB.NETintegertostringcast
复制代码 [/code] 在隐式转换上,C#的容错才能不如VB.NET。您必需本人实行显式转换:- [code]stringdeptno=dr.GetInt16("deptno").ToString();//C#
复制代码 [/code] 您能够显式地转换标量值和数组。
封闭并扫除
<P> 能够挪用毗连工具的Close办法或Dispose办法来封闭到数据库的毗连。Dispose办法挪用Close办法。- [code]conn.Close()VB.NET
- conn.Dispose()VB.NET
复制代码- conn.Close();//C#
- conn.Dispose();//C#
复制代码 [/code] 作为可选项,C#供应了一种在毗连超越局限时主动扫除毗连的特别语法。利用using关头字可启用这一特征。- [code]using(OracleConnectionconn=newOracleConnection(oradb))
- {
- conn.Open();
复制代码- OracleCommandcmd=newOracleCommand();
- cmd.Connection=conn;
- cmd.CommandText="selectdnamefromdeptwheredeptno=10";
- cmd.CommandType=CommandType.Text;
- OracleDataReaderdr=cmd.ExecuteReader();
- dr.Read();
复制代码- label1.Text=dr.GetString(0);
- }
复制代码 [/code] 您能够实验在上机操纵1(从数据库中检索数据)和上机操纵2(增添交互性)中学到的一些观点。
<Pstyle="TEXT-INDENT:2em">毛病处置<P> Try-Catch-Finally布局的毛病处置是.NET言语的一部分。上面是利用Try-Catch-Finally语法的一个绝对最小的例子:- [code]DimconnAsNewOracleConnection(oradb)VB.NET
- Try
- conn.Open()
复制代码- DimcmdAsNewOracleCommand
- cmd.Connection=conn
- cmd.CommandText="selectdnamefromdeptwheredeptno="+TextBox1.Text
- cmd.CommandType=CommandType.Text
复制代码- Ifdr.Read()Then
- Label1.Text=dr.Item("dname")orusedr.Item(0)
- EndIf
- CatchexAsExceptioncatchesanyerror
- MessageBox.Show(ex.Message.ToString())
- Finally
- conn.Dispose()
- EndTry
复制代码- OracleConnectionconn=newOracleConnection(oradb);//C#
- try
- {
- conn.Open();
复制代码- OracleCommandcmd=newOracleCommand();
- cmd.Connection=conn;
- cmd.CommandText="selectdnamefromdeptwheredeptno="+textBox1.Text;
- cmd.CommandType=CommandType.Text;
复制代码- if(dr.Read())//C#
- {
- label1.Text=dr.GetString(0);
- }
- }
- catch(Exceptionex)//catchesanyerror
- {
- MessageBox.Show(ex.Message.ToString());
- }
- finally
- {
- conn.Dispose();
- }
复制代码 [/code] 固然这类办法将得当地捕捉实验从数据库中猎取数据时产生的任何毛病,但这类办法对用户却不友爱。比方,看看上面这条在数据库不成用时显现的动静。
:捕捉到一个ORA-12545毛病,并向用户显现。
<Pstyle="TEXT-INDENT:2em">OracleDBA或开辟职员很分明ORA-12545的意义,可是终极用户不分明。一种更好的办理计划是增加一条分外的Catch语句来捕捉最多见的数据库毛病并显现对用户友爱的动静。- [size=-1][code]CatchexAsOracleExceptioncatchesonlyOracleerrors
- IfInStr(1,ex.Message.ToString(),"ORA-1:",CompareMethod.Text)Then
- MessageBox.Show("Errorattemptingtoinsertduplicatedata.")
- ElseIfInStr(1,ex.Message.ToString(),"ORA-12545:",CompareMethod.Text)Then
- MessageBox.Show("Thedatabaseisunavailable.")
- Else
- MessageBox.Show("Databaseerror:"+ex.Message.ToString())
- EndIf
- CatchexAsExceptioncatchesanyerror
- MessageBox.Show(ex.Message.ToString())[/size]
复制代码- [size=-1]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)//catchesanyerror
- {
- MessageBox.Show(ex.Message.ToString());
- }
复制代码 [/code] 注重下面的代码示例中的两条Catch语句。假如没有捕捉就任何Oracle毛病,那末将跳过第一条Catch语句分支,让第二条Catch语句来捕捉其他任何范例的毛病。在代码中,应当依据从特别到一样平常的按次对Catch语句排序。在实行了对用户友爱的非常处置代码以后,ORA-12545毛病动静显现以下:
<P>
:针对ORA-12545毛病的对用户友爱的动静 Finally代码将一直实行,而不管毛病是不是产生。经由过程在Finally代码块中到场毗连工具的Close或Dispose办法挪用,在实行了Try-Catch-Finally代码段以后,数据库毗连将一直封闭。试图封闭没有翻开的数据库毗连不会招致毛病。比方,假如数据库不成用,数据库毗连没有翻开,那末Finally代码块将试图封闭不存在的毗连。实行过剩的Close或Dispose是有效的。只需将一条Close或Dispose办法放到Finally代码块中,将包管封闭毗连。
使用DataReader检索多个值
<P> 到今朝为止,我们的示例仅申明了怎样检索单个值。DataReader能够检索多列和多行的值。起首举行多行、单列的查询:- [code]selectdeptno,dname,locfromdeptwheredeptno=10
复制代码 [/code] 要猎取列的值,可使用以零为基数的序号或列名。序号与查询中的按次相干。因此,能够在VB.NET中经由过程利用dr.Item(2)或dr.Item("loc")来查询loc列的值。
<P> 上面是将dname和来自上一查询的loc列串联起来的代码段:- [code]Label1.Text="The"+dr.Item(1)+"departmentisin"+dr.Item("loc")VB.NET
复制代码- Label1.Text="The"+dr.GetString(1)+"departmentisin"+dr.GetString(2);//C#
复制代码 [/code] 如今我们举行前往多行的查询:- [code]selectdeptno,dname,locfromdept
复制代码 [/code]要处置从DataReader中前往的多行,必要某品种型的轮回布局。别的,必要一个能够显现多行的控件。DataReader是一个仅正向的只读游标,因而不克不及将其与可更新或完整可转动的控件(如WindowsFormsDataGrid控件)绑缚在一同。DataReader与ListBox控件兼容,如以下代码段所示:- [code]Whiledr.Read()VB.NET
- ListBox1.Items.Add("The"+dr.Item(1)+"departmentisin"+dr.Item("loc"))EndWhile
复制代码- while(dr.Read())//C#
- {
- listBox1.Items.Add("The"+dr.GetString(1)+"departmentisin"+dr.GetString(2);
- }
复制代码 [/code] 上机操纵3(使用DataReader检索多列和多行)重点先容了这些观点中的一部分。
总结
本文向您先容了利用VS.NET编程言语会见Oracle数据库的历程。您如今应当可以毗连数据库并检索多列和多行。
学习asp.net两个月有余了,除了对html、web控件比较熟悉(应该是说都能理解和接受)之外,竟不知道自己还会什么。看了两本书:《精通asp.net网络编程》(人民邮电出版社)、《asp.net实用案例教程》(清华大学出版社)。 |
|