在 Oracle 数据库上构建 NET 应用程序

上传人:ba****u 文档编号:123495486 上传时间:2022-07-22 格式:DOCX 页数:15 大小:855.80KB
返回 下载 相关 举报
在 Oracle 数据库上构建 NET 应用程序_第1页
第1页 / 共15页
在 Oracle 数据库上构建 NET 应用程序_第2页
第2页 / 共15页
在 Oracle 数据库上构建 NET 应用程序_第3页
第3页 / 共15页
点击查看更多>>
资源描述
随着 Microsoft 的 .NET 框架的逐渐流行,许多开发人员迫切想了解关于 将 .NET 应用程序与 Oracle 集成的最好的方式的信息 不仅在基本的连通 性方面,还包括与使用 Visual Studio.NET (VS.NET) 进行有效的应用程序开发 的关系。 在本文中,我将说明构建使用 Oracle 数据库的 .NET 应用程序所涉 及到的基本但不可或缺的过程,包括:如何添加工程引用,以在您的.NET工程中支持Oracle类如何创建Oracle数据库连接字符串 如何使用 Connection、Command 和 DataReader 对象。您将有机会应用您在三个上机操作实践中学到的内容,难度范围从比较轻易到更 复杂。 .NET Data Provider 除了基本的 Oracle 客户端连通性软件, .NET 应 用程序还需要使用称为managed data provider (其中managed指的是代码 由 .NET 框架治理)的工具。数据供给程序是 .NET 应用程序代码和 Oracle 客 户端连通性软件之间的层。 在几乎所有情况下,最优的性能都是通过使用为特 定数据库平台优化了的供给程序而不是一般的 .NET OLE DB 数据供给程序实现 的。 Oracle、Microsoft 和第三方供给商都提供了针对 Oracle 产品进行了优 化的数据供给程序。Oracle和Microsoft免费提供其Oracle数据供给程序。(Microsoft 为 .NET 框架的 1.1 版提供的供给程序包含在该框架中,不需要 单独下载或安装。) 一些第三方数据供给程序支持 Oracle 的较早的版本,或 者不需要安装 Oracle 客户端软件。 在本文中,我们假设使用 Oracle Data Provider for .NET (ODP.NET),并单独提供下载。当安装了 ODP.NET和所有 要求的 Oracle 客户端连通性软件时,就可以开始使用 Visual Studio.NET 进 行应用程序开发了。 在开始开发前,请先确认客户端连通性。 假如您在 VS.NET 所在的计算机上使用 SQL*Plus 能够与 Oracle 连接,那么证实您已经正确地安 装和配置了 Oracle客户端软件。假如您刚接触Oracle,那么请参阅Oracle Data Provider for .NET 开发人员指南 10g 版本 1 (10.1) 中的“与 Oracle 数据库连接”部分,以了解 ODP.NET 的背景信息,或参阅 Oracle 数据库治理 员指南 10g 版本 1 (10.1) ,以了解关于治理 Oracle 数据库的通用信息。 您 还可以查阅“使用ODP.NET与Oracle数据库连接”示例代码“方法”文档。 在 VisualStudio.NET 中创建工程 在启动 VS.NET 之后,第一个任务是创建一 个工程。 您可以单击 NewProject 按钮或选择 FileNewProject. (如下所示)。点击查看大图图 1 : 在 Visual Studio.NET 中创建一个新工程 出现一个 New Project 对话 框。 在对话框左侧的 Project Types 下,选择您的编程语言。 在这个例子中, 我们选择 VB.NET。 在右侧的 Templates 下,选择一个工程模板。 为简单起见, 这里选择 Windows Application。2:使用NewProject对话框 您将需要为工程(我们使用OtnWinApp)和解决 方案(我们使用OtnSamples)指定有意义的名称。一个解决方案包含一个或多 个工程。当一个解决方案仅包含一个工程时,许多人对二者使用相同的名称。添 加引用 因为我们的工程必须与 Oracle 数据库连接,因此必须添加一个到包含 我们选择的数据供给程序的 dll 的引用。 在 Solution EXPlorer 内,选择 References 节点,右键单击并选择 AddReference。 或者,您可以转至菜单栏 并选择Projec t,然后选择Add Reference。Helpft匚HIoEr SIil 阱i 串 iogt -oO- oDlS H fDForml卜 DebugStart Page Forml.vb DesignAdd Reference.Add Web Reference.Properties囹 Properties Q Dynamic Help |ReadyOraWinApp - Microsoft Visual Basic .NETdesfg - Forml .vb DesignSolution Explorer - OraWinApp鑒画團固爲 Sciluticin , | 囲匚I日ss Vie Index |File Edit View Project Build Debug Data Toots WindowS Solution OraSamples (1 project)-厝 OraWinApp+ -固E点击查看大图图 3 : 添加引用 出现 Add Reference 对话框。.NETComponent Name.NETHelpOKSelected Components:Add Ref&nenceBrowse.Oracle.DataAccess.dllZCradeproductlO. 1.0Clien.C ancelSelectRemoveComponent NameVersion:=-IAmscorlib msdatasr c msddslmp msddsp1.0.5000.07.0.3300.07.0.3300.07.0.3300.0Z.CL33QDU -:-IND0W5Micr050ft.NET. I : -ogram FilesMicrosoFt.N. I : -ogram FilesMicrosoft.N. Z : - ogram FilesMicrosoft.N. r jr SlMicrQSDft JJFTOracle. DataAcr 已巧.dll10.1.0.200C:Cracleproduct 10.1.0Cli. TlegdSe stdole 5ystem.Configuration.Install.dll 5ystem.Data.dll 5ystem.Data.OracleClient.dll SwbAnri.riRinri.rlll加mr 7.0.3300.01.0.5000.01.0.5C00.01.0.5C00.01 .n.Fnnn.nPl RrJEQK却丈吃 PJET,I : - ogram FilesMicrosoft.N.:-INDOW5Micro5oft.NET.: JNDOV/SMicrosoft.NET.:-INDOWSWrosoft.NET._-.1 NnOV-.SlMfTncnFl-. NFT. VCOM | Projects 图 4 : 选择 ODP.NET 治理的数据供给程序 从列表中选择Oracle.DataAccess.dll,然后单击Select按钮,最后单击OK按钮,使您的Solution Exptarer - OraMNnApp Q XH ffl舊层 Solution Ora5=-中les (1 project)曙1 OraWMpp- Refers-.匚esOrade. Data Access-O_i 5y ?:em_i 5y ?:em.Data_i 5y?:em.Drawing_i 5y ?:em.Windows.Forms-O 5y;:em.XMLAsserrziylnfo.vbForml b工程能够找到 ODP.NET 数据供给程序。选择 Oracle Managed Provider 之后的解决方案浏览器 VB.NET/C# 语句 在添 加引用之后,标准的做法是要添加VB.NET Imports语句、C# using语句或J# import 语句。 从技术上说这些语句不是必要的,但是使用它们可以让您不需用 冗长且完整名称来引用数据库对象。按照惯例,这些语句出现在代码文件的顶部或顶部四周,在命名空间或类声明之 前。 Imports System.Data VB.NETImports Oracle.DataAccess.Client ODP.NET Oracle managed providerusing System.Data; / C#using Oracle.DataAccess.Client; / ODP.NET Oracle managed providerimport System.Data.*; / J#import Oracle.DataAccess.Client; / ODP.NET Oracle managed provider 连接字符串和对象 Oracle 连接字符串和 Oracle 名称解析是不可分的。 假定 我们在tnsnames.ora文件中定义了一个数据库别名OraDb,如下:OraDb二 (DESCRIPTION= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521) ) (CONNECT_DATA= (SERVER=DEDICATED) (SERVICE_NAME=ORCL) ) )要使用上面所述的在 tnsnames.ora 文件中定义的 OraDb 别名,您需要使用以 下语法: Dim oradb As String = Data Source=OraDb;User Id=scott;PassWord=tiger; VB. NETstring oradb = Data Source=OraDb;User Id=scott;Password=tiger; / C# 不过,您可以修改连接字符串,这样就不需用 tnsnames.ora 文件。 只需用在 tnsnames.ora 文件中定义别名的语句替换别名即可。 VB.NET Dim oradb As String = Data Source=(DESCRIPTION= _ + (ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521) _ + (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL); _ + User Id=scott;Password=tiger;string oradb = Data Source=(DESCRIPTION= / C# + (ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521) + (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL); + User Id=scott;Password=tiger;正如您在上面看到的那样,用户名和口令是以不加密的文本形式嵌入到连接字符 串中的。 这是创建连接字符串的最简单的方法。 然而,从安全的角度而言不加 密文本的方法是不可取的。 而且,您需要了解编译的 .NET 应用程序代码仅比 不加密文本形式的源代码文件稍微安全一点。 可以非常简便的反编译 . NET dll 和 exe 文件,进而查看原始的不加密文本形式的内容。 (加密实际上是正确的 解决方案,但这个主题与我们这里的讨论相差太远。)接下来,您必须从连接类中完成一个连接对象的实例化。 连接字符串必须与连 接对象关联。 Dim conn As New OracleConnection(oradb) VB.NETOracleConnection conn = new OracleConnection(oradb); / C#注重,通过将连接字符串传递给连接对象的构造器(该构造器进行了重载),连 接字符串与连接对象建立关联。构造函数的其他重载答应以下这些替代的语法: Dim conn As New OracleConnection() VB.NETconn.ConnectionString = oradbOracleConnection conn = new OracleConnection(); / C#conn.ConnectionString = oradb;在连接字符串与连接对象建立关联之后,使用 Open 方法来创建实际的连接。 conn.Open() VB.NETconn.Open(); / C#我们将在稍后介绍错误处理。Command对象Command对象用于指定执行的SQL 命令文本 SQL 字符串或存储过程。 类似于 Connection 对象,它必须从完 成其类的实例化,并且它拥有一个重载的构造函数。 Dim sql As String = select dname from dept where deptno = 10 VB.NETDim cmd As New OracleCommand(sql, conn)cmd.CommandType = CommandType.Textstring sql = select dname from deptwhere deptno =10; / C#OracleCommand cmd= new OracleCommand(sql, conn);cmd.CommandType = CommandType.Text; 不同的重载,语法的结构稍微有点不同。 Command 对象有用于执行命令文本的 方法。 不同的方法适用于不同类型的 SQL 命令。 检索标量值 从数据库中检索 数据可以通过实例化一个 DataReader 对象并使用 ExecuteReader 方法(它返 回一个 OracleDataReader 对象)来实现。 通过将列名称或以零为基数的列序 号传递给项属性 B.NET 开发人员可以访问返回的数据。 另一种选择是使用存取 程序类型方法来返回列数据。 Dim dr As OracleDataReader = cmd.ExecuteReader() VB.NETdr.Read()Label1.Text = dr.Item(dname) retrieve by column nameLabel1.Text = dr.Item(0) retrieve the first column in the select listLabel1.Text = dr.GetString(0) retrieve the first column in the select listC# 开发人员必须使用存取器方法来检索数据。 有适当类型的存取程序用于返 回 .NET 本地数据类型,其他的存取程序用于返回本地 Oracle 数据类型。 以 零为基数的序号被传递给存取程序,以指定返回哪一列。 OracleDataReader dr = cmd.ExecuteReader(); / C#dr.Read();label1.Text = dr.GetString(0); / C# retrieve the first column in the select list在这个简化的例子中,dname的返回值是一个字符串,它用来设置标签控件的文 本的属性值(也是一个字符串)。但假如检索的是dep tno,而不是字符串,那 么将出现数据类型不匹配的情况。当源数据类型与目标数据类型不匹配时,.NET 运行时将尝试隐式地转换数据类型。 有时数据类型不兼容,则隐式转换将失败, 并跳出一个异常警报。 但即使可以进行隐式转换,使用显式数据类型转换仍比 用隐式数据类型转换好。到整型的显式转换显示如下:Labell.Text = CStr(dr.Item(deptno) VB.NET integer to string cast 在隐式转换上,C#的容错能力不如VB.NET。您必须自己执行显式转换:st ring deptno = dr.GetInt16(deptno).ToString(); / C# 您可以显式地转换标量值以及数组。 关闭并清除 可以调用连接对象的 Close 方法或 Dispose 方法来关闭到数据库的连接。 Dispose 方法调用 Close 方法。 conn.Close() VB.NETconn.Dispose() VB.NETconn.Close(); / C#conn.Dispose(); / C#作为可选项, C# 提供了一种在连接超出范围时自动清除连接的非凡语法。 使用 using 要害字可启用这一特性。 using (OracleConnection conn = new OracleConnection(oradb)conn.Open();OracleCommand cmd = new OracleCommand(); cmd. Connection = conn; cmd. CommandText = select dname from dept where deptno = 10;cmd.CommandType = CommandType.Text; OracleDataReader dr = cmd.ExecuteReader(); dr.Read(); label1.Text = dr.GetString(0); 您可以试验在上机操作 1(从数据库中检索数据)和上机操作 2(增加交互性) 中学到的一些概念。 错误处理 Try-Catch-Finally 结构的错误处理是 .NET 语 言的一部分。 下面是使用 Try-Catch-Finally 语法的一个相对最小的例子: Dim conn As New OracleConnection(oradb) VB.NETTry conn.Open() Dim cmdAs New OracleCommand cmd.Connection = conn cmd.CommandText = select dname from dept where deptno = + TextBox1.Textcmd.CommandType = CommandType.Text If dr.Read() Then Label1.Text = dr.Item(dname) or use dr.Item(0) End IfCatch ex As Exception catches any error MessageBox.Show(ex.Message.ToString()Finally conn.Dispose()End TryOracleConnection conn = new OracleConnection(oradb); / C#tryconn.Open();OracleCommand cmd = new OracleCommand();cmd.Connection = conn; cmd.CommandText = select dname from dept where deptno = + textBox1.Text;cmd.CommandType = CommandType.Text; if (dr.Read() / C# label1.Text = dr.GetString(0); catch (Exception ex) / catches any error MessageBox.Show(ex.Message.ToString();finally conn.Dispose( ); 虽然这种方法将适当地捕捉尝试从数据库中获取数据时发生的任何错误,但这种 方法对用户却不友好。 例如,看看下面这条在数据库不可用时显示的消息。图6:捕捉到一个ORA-12545 错误,并向用户显示。 Oracle DBA 或开发人员很清楚 ORA-12545 的 意义,但是最终用户不清楚。 一种更好的解决方案是添加一条额外的 Catch 语 句来捕捉最常见的数据库错误并显示对用户友好的消息。 OracleException class does not have a Number property in VB.NET.) -Catch ex As OracleException catches only Oracle errors If InStr(1, ex.Message.ToString(), ORA-1:, CompareMethod.Text) Then MessageBox.Show(Error attempting to insert duplicate data.) ElseIf InStr(1, ex.Message.ToString(), ORA-12545:, CompareMethod.Text) Then MessageBox.Show(The database is unavailable.) Else MessageBox.Show(Database error: + ex.Message.ToString() End IfCatch ex As Exception catches any error MessageBox.Show(ex.Message.ToString()catch (OracleException ex) / catches only Oracle errors switch (ex.Number) case 1: MessageBox.Show(Error attempting to insert duplicate data.); break; case 12545: MessageBox.Show(The database is unavailable.); break; default: MessageBox.Show(Database error: + ex.Message.ToString(); break; catch (Exception ex) / catches any error MessageBox.Show(ex.Message.ToString(); 注重上面的代码示例中的两条 Catch 语句。 假如没有捕捉到任何 Oracle 错 误,那么将跳过第一条 Catch 语句分支,让第二条 Catch 语句来捕捉其他任何 类型的错误。 在代码中,应该根据从非凡到一般的顺序对 Catch 语句排序。 在实施了对用户友好的异常处理代码之后,ORA-12545错误消息显示如下:The databasz 5 unavailable.针对 ORA-12545 错误的对用户友好的消息Finally 代码将始终执行,而无论错误是否发生。 通过在 Finally 代码块中加 入连接对象的 Close 或 Dispose 方法调用,在执行了 Try-Catch-Finally 代 码段之后,数据库连接将始终关闭。 试图关闭没有打开的数据库连接不会导致 错误。 例如,假如数据库不可用,数据库连接没有打开,那么 Finally 代码块 将试图关闭不存在的连接。 执行多余的 Close 或 Dispose 是无效的。 只需将 一条 Close 或 Dispose 方法放到 Finally 代码块中,将保证关闭连接。 利用 DataReader 检索多个值 到目前为止,我们的示例仅说明了如何检索单个值。 DataReader 可以检索多列 和多行的值。 首先进行多行、单列的查询: select deptno, dname, loc from dept where deptno = 10 要获取列的值,可以使用以零为基数的序号或列名。 序号与查询中的顺序相关。 因而,可以在 VB.NET 中通过使用 dr.Item(2) 或 dr.Item(loc) 来查询 loc 列的值。 下面是将 dname 和来自上一查询的 loc 列串连起来的代码段: Label1.Text = The + dr.Item(1) + department is in + dr.Item(loc) VB.NETLabel1.Text = The + dr.GetString(1) + department is in + dr.GetString(2); / C# 现在我们进行返回多行的查询: select deptno, dname, loc from dept 要处理从 DataReader 中返回的多行,需要某种类型的循环结构。 此外,需要 一个可以显示多行的控件。 DataReader 是一个仅正向的只读游标,因此不能将 其与可更新或完全可滚动的控件(如 Windows Forms DataGrid 控件)捆绑在一 起。 DataReader 与 ListBox 控件兼容,如以下代码段所示: While dr.Read() VB.NET ListBox1.Items.Add(The + dr.Item(1) + department is in + dr.Item(loc) End Whilewhile (dr.Read() /C# listBox1.Items.Add(The + dr.GetString(1) + department is in + dr.GetString(2); 上机操作 3(利用 DataReader 检索多列和多行)重点介绍了这些概念中的一部 分。总结 本文向您介绍了使用 VS.NET 编程语言访问 Oracle 数据库的过程。您现 在应该能够连接数据库并检索多列和多行。John Paul Cook (johnpaulcook) 是居住在休斯顿的一位数据库 和 .NET 顾问。他撰写了许多关于 .NET、Oracle 和其他主题的文章,并从 1986 年以来一直开发关系数据库应用程序。他目前的爱好包括 Visual Studio 2005 和 Oracle 10g。 他是 Oracle 认证 DBA 和 Microsoft MCSD for .NET。 上机 操作 1 : 从数据库中检索数据1. 首先向 Windows 表单添加一个按钮控件和一个标签控件。 务必在这些控 件上方保留空间,以便在上机操作 2 中添加控件。ftALabelLabellButton-窗Paneltle k :阱i 串 iogt -o oOifl OraWinApp - Microsoft Visual Basic ,NEF dedgiii - Forml .vb Desigp*ReadyFile Edit View Project Build DebugD 或已Foi mat Tools Window HelpH S 區皂鼻蚩 Server Expl.法 Toolbox卜 DebugToolboxDataComponentsWindows Formsk PointerA LinkLabelab| Button” CheckBoxF RadioButton|xv| GroupBoxGeneral丽 TextEiox国 MainMenuPictureBoxForml回Start Page Forml.vb Design* | Forml.vb* |匸Em黑琵祭罠口海;餐越餐越餐越餐越餐活图 8 : 在上机操作 1 中包含按钮和标签控件的表单2. 添加代码,它们用于从 Oracle 数据库中检索数据并在表单上显示结果。 将代码放在按钮的单击事件处理程序中。 开始这项任务的最轻易的方式 是双击该按钮,因为它将为事件处理程序创建一个 stub。囹CD LpiINSuj EoErnOraWinApp - Microsoft Visual Basic .NET design - Forml .vb*File Edit View Project Build Debug 二::_vindow HelpReadytF IF 匸豎 ” % % ”卽丁旌r 3 IH卜 DebugLn : E匚cil 9Ch 9Start Page | Forml.vb Design* Fwml.vb* X|撈Button 1T | f chekdPublic ClassInheritsFormlSystem.z . 7 rizms . Form一sWindows Form Designer generated codeElPrivateSuh Button! Z L i ?:-: (EyVal sender As System. O:End SubEnd Class1马电Li融图 9 : 单击事件处理程序 stub 。3. 在 Public Class 声明之前添加 VB.NET Imports 语句,或在命名空间声 明之前添加 C# using 语句。 Imports System.Data VB.NETImports Oracle.DataAccess.Client ODP.NET Oracle managed providerusing System.Data; / C#using Oracle.DataAccess.Client; / ODP.NET Oracle managed provider4. 在 Private Sub 和 End Sub 语句之间添加 VB.NET 版本 事件语句代码 (确保用您的服务器的主机名称替代 OTNSRVR): Dim oradb As String = Data Source=(DESCRIPTION=(ADDRESS_LIST= _ + (ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521) _ + (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL); _ + User Id=scott;Password=tiger;Dim conn As New OracleConnection(oradb) VB.NETconn.Open()Dim cmd As New OracleCommandcmd.Connection = conncmd.CommandText = select dname from dept where deptno = 10cmd.CommandType = CommandType.TextDim dr As OracleDataReader = cmd.ExecuteReader()dr.Read()Label1.Text = dr.Item(dname) or dr.Item(0)conn.Dispose() 将以下 C# 代码添加到按钮的单击事件处理程序中的括号 和 之间, 并确保用您的服务器的主机名称替代 OTNSRVR: string oradb = DataSource=(DESCRIPTION=(ADDRESS_LIST= + (ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521) + (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL); + User Id=scott;Password=tiger;OracleConnection conn = new OracleConnection(oradb); / C#conn.Open();OracleCommand cmd = new OracleCommand();cmd.Connection = conn;cmd.CommandText = select dname from dept where deptno = 10;cmd.CommandType = CommandType.Text;OracleDataReader dr = cmd.ExecuteReader();dr.Read();label1.Text = dr.GetString(0);conn.Dispose();5.运行应用程序。 单击按钮。 您将看到以下内容:图10:成功检索到数据上机操作 2: 增加交互性 现在在代码中实施了数据库访问的基础,下一步是为 应用程序增加交互性。 可以添加一个文本框来接收用户输入的部门号码(deptno),而不是运行硬编码的查询。1. 向表单中添加一个文本框控件和另一个标签控件(如下所示):将 Label2 控件的文本属性设为 Enter Deptno: 并确保没有将 TextBox1 的 Text 属性设为任何东西。ftLabello窗oPaneltlA Labele k :阱i 串 inot -oO- oOlForm!OraWinApp - Microsoft Visual Basic ,NET dedgiii - Forrnl .vb DesignFile Edit View Project Build Debug Cz:= Tools Window HelpReadyServer Expl. 宏 Toolboxk PointerA LinkLabelab| Button” CheckBoxC* RadioButton|xv| 右rciupEicix國 PictureBoxGeneral丽 TextEiox冒| MainMenu線I,旌r 3 IH闍(B卜 DebugDataComponentsWindows FormsToolboxStart Page Forml.vb Design* | Forml.vb* |n x图 11 : 包含按钮和标签控件的表单(上机操作 2 )2. 修改定义选择字符串的代码: cmd.CommandText = select dname from dept where deptno = + TextBox1.Text VB.NETcmd.CommandText = select dname from dept where deptno = + textBox1.Text; / C#3. 运行应用程序。 在 deptno 输入 10,测试应用程序。 输入一个无效的 deptno (例如50),重新测试应用程序。应用程序将退出。图 12 : 一个未处理的异常4. 修改代码以防止在输入无效的 deptno 时出现错误。 让我们回顾一下, ExecuteReader 方法实际返回一个对象。 If dr.Read() Then VB.NET Label1.Text = dr.Item(dname)Else Label1.Text = deptno not foundEnd Ifif (dr.Read() / C# label1.Text = dr.Item(dname);Else label1.Text = deptno not found;5. 输入不存在的 deptno 数字,测试应用程序。现在应用程序不再退出。输 入字母 A 代替数字,然后单击按钮。 应用程序退出。 很明显,我们的 应用程序需要更好的方法以处理错误。 可能有人会指出,应用程序应当 不充许用户进行将导致错误的无效输入,但最终应用程序必须添加强健的 错误处理功能。 不是所有的错误都是可预防的,因此必须实施错误处理。上机操作 3: 利用 DataReader 检索多行和多列 现在检索了单个值,下一步就 是利用 DataReader 检索多行和多列。 添加一个 ListBox 控件到表单中,以显 示结果。1. 添加一个 ListBox 控件到表单中。 重新调整控件的大小,以填满表单的 大部分宽度(如下所示)。電$ OraWinApp - Mfarosoft Visual Basic ,NET desigin - Formi .vb DesignEdit View Project Build Debug Cz:= Tools Window HelpFileQ卜 Debug妙 connec:-昌串即祈吨业g Q ?Toolbox3 XDataIComponentsWindows Forms应 CheckBox(* RadioButtonI. GroupBox國 PictureBox Panel 駅DataGrid t ListBox|斟:| CheckedListBox 國 ComboBoxListView鮭 TreeViewI、T 广cr卜vdGeneralIftE?3 dgc hk 55 55 | 阱Start Page Forml.vb Design | Forml.vb | ListBox 1 卜 XE:r7 Z =ptno:; T -a5cl-LIHCIn E 召loE: : Label1一囹一 DYnamIF-He-P烹 ToolboxReady图 13 : 添加了 ListBox 的表单2. 从查询中删除 where 子句,并添加以下列: cmd.CommandText = select deptno, dname, loc from dept VB.NETcmd.CommandText = select deptno, dname, loc from dept; / C#3. 修改 VB.NET 代码,最终结果如下: Dim oradb As String = Data Source=(DESCRIPTION=(ADDRESS_LIST= _ + (ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521) _ + (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL); _ + User Id=scott;Password=tiger;Dim conn As New OracleConnection(oradb) VB.NETconn.Open()Dim cmd As New OracleCommandcmd.Connection = conncmd.CommandText = select deptno, dname, loc from dept cmd.CommandType = CommandType.TextDim dr As OracleDataReader = cmd.ExecuteReader()While dr.Read() ListBox1.Items.Add(The + dr.Item(1) + _ department is in + dr.Item(loc)End Whileconn.Dispose()修改您的 C# 代码,最终结果如下: string oradb = Data Source=(DESCRIPTION=(ADDRESS_LIST= + (ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521) +(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL); + User Id=scott;Password=tiger;OracleConnection conn = new OracleConnection(oradb); / C#conn.Open();OracleCommand cmd = new OracleCommand();cmd.Connection = conn;cmd.CommandText = select dname from dept where deptno = 10;cmd.CommandType = CommandType.Text;OracleDataReader dr = cmd.ExecuteReader();while (dr.Read() ListBox1.Items.Add(The + dr.Item(1) + department is in + dr.GetString(0);conn.Dispose();提供代码下载中已经实施了错误处理。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!