c#开发的软件c 读取access数据库2010数据库 执行程序报错 外部组件异常

他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)比特客户端
您的位置:
详解大数据
详解大数据
详解大数据
详解大数据
Oracle数据库上使用VS2010构建.NET应用程序
关键字:.NET
  在本文中,我将说明构建使用的 C# 或 Visual Basic .NET 应用程序所涉及到的基本但不可或缺的过程,包括:
  如何添加工程引用,以在您的 .NET 工程中支持 Oracle 类库
  如何创建 Oracle 数据库连接字符串
  如何使用 Connection、Command 和 DataReader 对象
  您将有机会应用在三个上机操作实践中学到的内容,难度从相对简单逐渐演变到复杂。如果您已经熟悉使用 Visual Studio
构建 Oracle 数据库的 .NET 应用程序,则会发现使用 Visual Studio 2010 的体验非常类似。
  要获得关于如何保护应用程序的信息和实验,请参见我的文章“在 Oracle 数据库上保护 .NET 应用程序”。(另外,有关涉及一系列 Oracle .NET 应用程序生命周期问题的技术文章,请参见 OTN .NET 开发人员中心。)
  请注意,免费的 Oracle Tools for Visual Studio(可从 OTN 下载)提供了一个 Visual Studio 插件,该插件可以简化 Oracle 上的 .NET 应用程序开发,并使之更加直观。但在这里我们不讨论这个问题;要想了解这方面的更多信息,您可以前往 Oracle Developer Tools for Visual Studio 产品中心。
  .NET 数据提供程序
  除了基本的 Oracle 客户端连通性软件,.NET 应用程序还需要使用称为托管数据提供程序(其中“托管”指的是代码由 .NET 框架管理)的工具。数据提供程序是指 .NET 应用程序代码和 Oracle 客户端连通性软件之间的层。在几乎所有情况下,最优的性能都是通过使用为特定数据库平台优化了的提供程序而不是一般的 .NET OLE DB 数据提供程序实现的。
  Oracle、 和第三方供应商都提供了针对 Oracle 数据库进行了优化的 .NET 数据提供程序。Oracle 和 Microsoft 均免费提供自己的 Oracle 数据提供程序。Microsoft 针对 .NET Framework 的提供程序已废弃。Oracle 则继续支持和开发其 .NET 数据提供程序 Oracle Data Provider for .NET (ODP.NET)。在本文中,我们将使用 ODP.NET,该提供程序包含在 Oracle Database 中或单独提供下载。
  ODP.NET 提供标准的 ADO.NET 数据访问,同时还提供专用于 Oracle 数据库的特性,如 XML DB、数据访问性能优化和真正应用集群负载平衡及快速连接故障切换。最新的 ODP.NET 版本 (11.2) 支持连接到 Oracle Database 9i 第 2 版及更高版本。数据库服务器可以位于 Windows、、 或 Oracle 数据库支持的任何其他平台上。
  安装 ODP.NET 和 Oracle 客户端软件后,即可开始使用 Visual Studio 进行应用程序开发。在开始开发前,请先确认客户端连通性。如果您在安装了 Visual Studio 的计算机上能够使用 Oracle 客户端软件(如 SQL*Plus)连接到 Oracle 数据库,则证明您已经正确地安装和配置了 Oracle 客户端软件。
  如果您是初次接触 Oracle,请参见 Oracle 数据库两日速成开发人员指南 中的“安装 .NET 产品”一节,其中专门介绍了有关安装和配置 ODP.NET 的背景信息;或参见 Oracle 数据库文档库,了解有关 Oracle 数据库的一般信息。
  在 Visual Studio 2010 中创建工程
  现在我们来创建一个用于从 Oracle 数据库中检索数据的 ODP.NET 应用程序。然后,我们将了解如何使用 ODP.NET 执行错误处理,以及如何处理其他数据检索情况。
  启动 Visual Studio 之后,第一个任务是创建一个工程。可以按如下所示单击 New Project,也可以选择 File | New | Project。
  图 1 在 Visual Studio 2010 中创建一个新工程
  出现 New Project框。在对话框左侧的 Installed Templates 下,选择您的编程语言。在这个例子中,我们选择 Visual Basic。在对话框中部,选择一个工程模板。为简单起见,我们选择 Windows Forms Application。
  图 2 使用 New Project 对话框
  您将需要为工程名称(我们使用 OraWinApp)和解决名称(我们使用 OraWinApp)指定有意义的名称。一个解决方案包含一个或多个工程。当一个解决方案仅包含一个工程时,许多人对二者使用相同的名称。请注意,对话框中有一个下拉列表框,可以在其中指定您要针对的 .NET Framework 版本。如果您是为早期版本的 .NET Framework 编写应用程序,则应从该下拉列表中选择相应的版本。单击 OK 按钮继续。
  添加引用
  由于我们的工程必须与 Oracle 数据库连接,因此必须添加一个到包含所选数据提供程序的 ODP.NET DLL 的引用。在 Visual Studio 右侧的 Solution Explorer 内,选择工程名称,右键单击并选择 Add Reference。或者,您可以转至菜单栏并选择 Project,然后选择 Add Reference。
  图 3 添加引用
  出现 Add Reference 对话框。选择 .NET 选项卡。Visual Studio 将构造一个列表,其中列出可以添加到工程中的 .NET 组件。这可能需要几秒钟的时间。完成后,您可以单击 Component Name 列按字母顺序排列组件列表。
  图 4 选择适用于 .NET 4 的 ODP.NET 托管数据提供程序
  ODP.NET 位于 Oracle.DataAccess 组件名下。从列表中选择 Oracle.DataAccess,然后单击 OK 按钮让工程知道 ODP.NET 数据提供程序。一定要选择正确的版本。由于这是一个 .NET 4 工程,所以在此选择了 4.112.2.0 版的 Oracle.DataAccess,但您可以选择以 4 开头的任意 ODP.NET 版本。
  Visual Basic/C# 语句
  添加引用之后,标准的做法是添加 Visual Basic Imports 语句或 C# using 语句。从技术上讲,这些语句不是必需的,但通过它们可以让您无需使用冗长的完全限定名来引用数据库对象。
  按照惯例,这些语句出现在代码文件的顶部或顶部,在命名空间或类声明之前。
  Imports Oracle.DataAccess.Client ' Visual Basic ODP.NET Oracle managed provider using Oracle.DataAccess.C // C# ODP.NET Oracle managed provider
  添加完引用之后,Intellisense 将帮助您完成 Imports 或 using 语句的添加,如图 5 所示。
  图 5 在 Visual Basic 中添加 Imports 语句
  连接字符串和对象
  Oracle 连接字符串和 Oracle 名称解析是不可分的。在本文中,我们将使用用户 ID“hr”和口令“hr”连接到 Oracle 的示例 HR 模式。tnsnames.ora 文件是一个 Oracle 网络配置文件,它定义用于建立连接的数据库地址。假定我们在 tnsnames.ora 文件中定义了一个数据库别名 OraDb,如下:
  OraDb= (DESCRIPTION= (_= (ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521)) ) (CONNECT_DATA= (SERVER=DEDICATED) (SERVICE_NAME=ORCL) ) )
  OraDb 别名定义客户端的数据库地址连接信息。要使用上面所述的在 tnsnames.ora 文件中定义的 OraDb 别名,您需要使用以下语法:
  Dim oradb As String = "Data Source=OraDb;User Id=Password=" ' Visual Basic string oradb = "Data Source=OraDb;User Id=Password="; // C#
  不过,您可以修改连接字符串,这样就无需使用 tnsnames.ora 文件。只需使用在 tnsnames.ora 文件中定义别名的语句替换别名即可。本文中的数据库别名特定于我的数据库设置。(单击此处获取更多有关为数据库创建数据库别名的信息。)
  ' Visual Basic Dim oradb As String = "Data Source=(DESCRIPTION=" _ + "(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521))" _ + "(CONNECT_DATA=(SERVICE_NAME=ORCL)));" _ + "User Id=Password=" // C# string oradb = "Data Source=(DESCRIPTION=" + "(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521))" + "(CONNECT_DATA=(SERVICE_NAME=ORCL)));" + "User Id=Password=";
  正如您在上面看到的那样,用户名和口令是以明文方式嵌入到连接字符串中的。这是创建连接字符串的最简单的方法。然而,从安全的角度而言不加密文本的方法是不可取的。尤其是,您需要了解编译的 .NET 应用程序代码仅比不加密文本形式的源代码文件稍微安全一点。可以非常简便地反编译 .NET DLL 和 EXE 文件,进而查看原始的不加密文本形式的内容。(加密实际上是正确的解决方案,但这个主题与我们这里的讨论相差太远。)
  接下来,您必须从连接类中完成一个连接对象的。连接字符串必须与连接对象关联。
  Dim conn As New OracleConnection(oradb) ' Visual Basic OracleConnection conn = new OracleConnection(oradb); // C#
  注意,通过将连接字符串传递给连接对象的构造器(该构造器进行了重载),连接字符串与连接对象建立关联。构造函数的其他重载允许使用以下这些替代的语法:
  Dim conn As New OracleConnection() ' Visual Basic conn.ConnectionString = oradb OracleConnection conn = new OracleConnection(); // C# conn.ConnectionString =
  在连接字符串与连接对象建立关联之后,使用 Open 方法来创建实际的连接。
  conn.Open() ' Visual Basic conn.Open(); // C#
  我们将在稍后介绍错误处理。
  Command 对象
  command 对象用于指定执行的文本 ― SQL 字符串或过程。类似于 connection 对象,它必须从完成其类的实例化,并且它拥有一个重载的构造函数。在本示例中,ODP.NET 将在 departments 表中执行 SQL 查询,并返回 department_id 为 10 的 department_name。
  Dim sql As String = "select department_name from departments where department_id = 10" ' Visual Basic Dim cmd As New OracleCommand(sql, conn) cmd.CommandType = CommandType.Text string sql = " select department_name from departments where department_id = 10"; // C# OracleCommand cmd = new OracleCommand(sql, conn); cmd.CommandType = CommandType.T
  使用不同的重载时,语法的结构稍有不同。command 对象有用于执行命令文本的方法,我们将在下一部分中讲述。不同的方法适用于不同类型的 SQL 命令。
  检索标量值
  从数据库中检索数据可以通过实例化一个 OracleDataReader 对象并使用 OracleCommand 的 ExecuteReader 方法(它返回一个 OracleDataReader 对象)来实现。通过将列名或以零为基数的列序号传递给 OracleDataReader 可以访问返回的数据。
  Dim dr As OracleDataReader = cmd.ExecuteReader() ' Visual Basic dr.Read() Label1.Text = dr.Item("department_name") ' retrieve by column name Label1.Text = dr.Item(0) ' retrieve the first column in the select list Label1.Text = dr.GetString(0) ' return a .NET data type Label1.Text = dr.GetOracleString(0) ' return an Oracle data type
  C# 开发人员必须使用存取程序类型的方法来检索数据。有适当类型的存取程序用于返回 .NET 本地数据类型,其他存取程序用于返回本地 Oracle 数据类型,所有这些存取程序都受 C#、Visual Basic 或任何其他 .NET 语言的支持。以零为基数的序号被传递给存取程序,以指定要返回的列。
  OracleDataReader dr = cmd.ExecuteReader(); // C# dr.Read(); label1.Text = dr["department_name"].ToString(); // C# retrieve by column name label1.Text = dr.GetString(0).ToString(); // return a .NET data type label1.Text = dr.GetOracleString(0).ToString(); // return an Oracle data type
  在这个简化的示例中,department_name 的返回值是一个字符串,它用来设置标签控件的文本的属性值(也是一个字符串)。但如果检索的是 department_id(不是一个字符串),那么将出现数据类型不匹配的情况。当源数据类型与目标数据类型不匹配时,.NET 运行时将尝试隐式地转换数据类型。有时数据类型不兼容,则隐式转换将失败,从而引发异常。但即使可以进行隐式转换,使用显式数据类型转换仍比用隐式数据类型转换要好。
  到整数的显式转换显示如下:
  Label1.Text = CStr(dr.Item("department_id")) ' Visual Basic integer to string cast
  在隐式转换上,C# 的容错能力不如 Visual Basic。您必须自己执行显式转换:
  label1.Text = dr.GetInt16("department_id").ToString(); // C#
  您可以显式地转换标量值以及数组。
  Close 和 Dispose
  可以调用连接对象的 Close 方法或 Dispose 方法来关闭到数据库的连接。Dispose 方法隐式调用 Close 方法。
  conn.Close() ' Visual Basic conn.Dispose() ' Visual Basic conn.Close(); // C# conn.Dispose(); // C#
  如果您使用 VB 的 Using 关键字或 C# 的 using 关键字,则不必显式调用 Close 或 Dispose。
  using (OracleConnection conn = new OracleConnection(oradb)) // C# { conn.Open(); OracleCommand cmd = new OracleCommand(); cmd.Connection = cmd.CommandText = "select department_name from departments where department_id = 10"; cmd.CommandType = CommandType.T OracleDataReader dr = cmd.ExecuteReader(); dr.Read(); label1.Text = dr.GetString(0); }
  此外,OracleCommand 包括 Dispose 方法;OracleDataReader 包括 Close 方法和 Dispose 方法。关闭并删除 .NET 对象可以释放系统资源,从而确保高效的应用程序性能,这在高负载情况下尤为重要。您可以试验在上机操作 1(从数据库中检索数据)和上机操作 2(增加交互性)中学到的一些概念。
  错误处理
  当错误发生时,.NET 应用程序应当适当地处理错误并通过有意义的消息来通知用户。Try-Catch-Finally 结构的错误处理是 .NET 语言的一部分。下面是使用 Try-Catch-Finally 语法的一个相对最小的示例:
  ' Visual Basic Try conn.Open() Dim cmd As New OracleCommand cmd.Connection = conn cmd.CommandText = "select department_name from departments " _ + "where department_id = " + TextBox1.Text cmd.CommandType = CommandType.Text If dr.Read() Then Label1.Text = dr.Item("department_name") ' or use dr.Item(0) End If Catch ex As Exception ' catches any error MessageBox.Show(ex.Message.ToString()) Finally ' In a real application, put cleanup code here. End Try // C# try { conn.Open(); OracleCommand cmd = new OracleCommand(); cmd.Connection = cmd.CommandText = "select department_name from departments where department_id = " + textBox1.T cmd.CommandType = CommandType.T if (dr.Read()) // C# { label1.Text = dr["department_name"].ToString(); // or use dr.GetOracleString(0).ToString() } } catch (Exception ex) // catches any error { MessageBox.Show(ex.Message.ToString()); } finally { // In a real application, put cleanup code here. }
  虽然这种方法将适当地捕获尝试从数据库中获取数据时发生的任何错误,但这种方法对用户却不友好。例如,下面这条在数据库不可用时显示的消息:
  图 6 捕获 ORA-12545 错误并显示给用户
  Oracle DBA 或开发人员很清楚 ORA-12545 的意义,但最终用户不清楚。一种更好的解决方案是添加一条额外的 Catch 语句来捕获最常见的数据库错误并显示对用户友好的消息。
  ' Visual Basic Catch ex As OracleException ' catches only Oracle errors Select Case ex.Number Case 1 MessageBox.Show("Error attempting to insert duplicate data.") Case 12545 MessageBox.Show("The database is unavailable.") Case Else MessageBox.Show("Database error: " + ex.Message.ToString()) End Select Catch ex As Exception ' catches any error MessageBox.Show(ex.Message.ToString()) // C# catch (OracleException ex) // catches only Oracle errors { switch (ex.Number) { case 1: MessageBox.Show("Error attempting to insert duplicate data."); case 12545: MessageBox.Show("The database is unavailable."); default: MessageBox.Show("Database error:" + ex.Message.ToString()); } } catch (Exception ex) // catches any error not previously caught { MessageBox.Show(ex.Message.ToString()); }
  注意上面的代码示例中的两条 Catch 语句。如果没有捕获到任何 Oracle 错误,那么将跳过第一条 Catch 语句分支,让第二条 Catch 语句来捕获任何其他非 Oracle 错误。在代码中,应该根据从特殊到一般的顺序对 Catch 语句排序。在执行完用户友好的异常处理代码之后,ORA-12545 错误消息显示如下:
  图 7 ORA-12545 错误的用户友好的错误消息
  无论是否发生错误,Finally 代码块总会执行。清除代码应包含在此代码块中。如果未使用 Using 或 using,应清除 Finally 代码块中的连接和其他对象。
  利用 DataReader 检索多个值
  到目前为止,我们的示例仅说明了如何检索单个值。OracleDataReader 可以检索多列和多行的值。首先进行多列、单行的查询:
  select department_id, department_name, location_id from departments where department_id = 10
  本文为简明起见,我们使用一个表,即 departments 表。要获取列的值,可以使用以零为基数的序号或列名。序号与查询中的顺序相关。因此,可以在 Visual Basic 中通过使用 dr.Item(2) 或 dr.Item("location_id") 来检索 location_id 列的值。
  下面是将 department_name 和来自上一查询的 location_id 列串连起来的代码段:
  Label1.Text = "The " + dr.Item("department_name") + " department is in " _ + dr.Item("location_id") ' VB label1.Text = "The " + dr["department_name"].ToString() + " department is in " + dr["location_id"].ToString(); // C#
  现在我们进行返回多行的查询:
  select department_id, department_name, location_id from departments
  要处理从 OracleDataReader 中返回的多行,需要某种类型的循环结构。此外,需要一个可以显示多行的控件。OracleDataReader 是一个仅正向的只读游标,因此不能将其与可更新或完全可滚动的控件(如 Windows Forms DataGrid 控件)捆绑在一起。OracleDataReader 与 ListBox 控件兼容,如以下代码段所示:
  While dr.Read() ' Visual Basic ListBox1.Items.Add("The " + dr.Item("department_name") _ + " department is in " + dr.Item("location_id")) End While while (dr.Read()) // C# { listBox1.Items.Add("The " + dr["department_name"].ToString() + " department is in " + dr["location_id"].ToString()); }
  上机操作 3(利用 OracleDataReader 检索多列和多行)重点介绍了这些概念中的一部分。
  在 Windows x64 上构建和运行
  在 Windows x64 操作系统上运行 Visual Studio 2010 时,可以使用 Configuration Manager 更改目标平台类型。在 Solution Explorer 中选择解决方案,右键单击并选择 Configuration Manager。
  图 8 在 Windows x64 上构建时,可以使用 Configuration Manager 更改目标平台类型。
  本文向您介绍了使用 .NET 编程语言访问 Oracle 数据库的过程。您现在应该能够连接数据库并检索多列和多行。
  上机操作 1:从数据库中检索数据
  前提条件是您已经创建了一个工程并添加了一个引用(如本文前面部分所述)。
  接着向 Windows 表单中添加一个按钮控件和一个标签控件。务必在这些控件的上方留出空间,以便在上机操作 2 中添加其他控件。
  图 9 包含按钮和标签控件的表单(上机操作 1)
  添加代码,它们用于从 Oracle 数据库中检索数据并在表单上显示结果。将代码放在按钮的单击事件处理程序中。开始这项任务的最容易的方式是双击该按钮,因为它将为事件处理程序创建一个 stub。
  图 10 单击事件处理程序 stub。
  在 Public Class 声明之前添加 Visual Basic Imports 语句,或在命名空间声明之前添加 C# using 语句。
  Imports Oracle.DataAccess.Client ' Visual Basic, ODP.NET Oracle managed provider
  using Oracle.DataAccess.C // C#, ODP.NET Oracle managed provider
  在 Private Sub 和 End Sub 语句之间添加 Visual Basic 版本的单击事件处理程序代码(请务必用您服务器的主机名替代 ORASRVR 并将服务名称项替换为数据库的服务名称):
  Dim oradb As String = "Data Source=(DESCRIPTION=(ADDRESS_LIST=" _ + "(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521)))" _ + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" _ + "User Id=Password=" Dim conn As New OracleConnection(oradb) ' Visual Basic conn.Open() Dim cmd As New OracleCommand cmd.Connection = conn cmd.CommandText = _ "select department_name from departments where department_id = 10" cmd.CommandType = CommandType.Text Dim dr As OracleDataReader = cmd.ExecuteReader() dr.Read() ' replace this statement in next lab Label1.Text = dr.Item("department_name") ' or dr.Item(0), remove in next lab dr.Dispose() cmd.Dispose() conn.Dispose()
  将以下 C# 代码添加到按钮单击事件处理程序的 { 和 } 花括号之间(请务必用您服务器的主机名替代 ORASRVR 并将服务名称项替换为数据库的服务名称):
  string oradb = "Data Source=(DESCRIPTION=(ADDRESS_LIST=" + "(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521)))" + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" + "User Id=Password="; OracleConnection conn = new OracleConnection(oradb); // C# conn.Open(); OracleCommand cmd = new OracleCommand(); cmd.Connection = cmd.CommandText = "select department_name from departments where department_id = 10"; cmd.CommandType = CommandType.T OracleDataReader dr = cmd.ExecuteReader(); dr.Read(); // replace this statement in next lab label1.Text = dr["department_name"].ToString(); // remove in next lab dr.Dispose(); cmd.Dispose(); conn.Dispose();
  运行应用程序。单击按钮。您将看到以下内容:
  图 11 成功检索的数据
  上机操作 2:增加交互性
  现在在代码中实现了数据库访问的基本功能,下一步是为应用程序增加交互性。与运行硬编码的查询不同,可以添加一个文本框控件来接受用户输入的部门号码(即 department_id)。
  向表单中添加一个文本框控件和另一个标签控件(如下所示):将 Label2 控件的文本属性设为“Enter department_id:”并确保没有设置 TextBox1 的 Text 属性。
  图 12 包含按钮和标签控件的表单(上机操作 2)
  修改定义 select 字符串的代码:
  cmd.CommandText = _ "select department_name from departments where department_id = "_ + TextBox1.Text 'VB cmd.CommandText = "select department_name from departments where department_id = " + textBox1.T // C#
  运行应用程序。在 department_id 中输入 10 来测试应用程序。输入一个无效的 department_id(例如 12)重新测试应用程序。应用程序将终止。
  图 13 未处理的异常
  修改代码防止在输入无效的 department_id 时出现错误。让我们回顾一下,ExecuteReader 方法实际返回一个对象。将包含 dr.Read 的代码行替换为以下全部语句。
  If dr.Read() Then ' Visual Basic Label1.Text = dr.Item("department_id").ToString() Else Label1.Text = "department_id not found" End If if (dr.Read()) // C# { label1.Text = dr["department_id"].ToString();; } else { label1.Text = "department_id not found"; }
  输入不存在的 department_id 数字来测试应用程序。现在应用程序不再终止。输入字母 A 代替数字,然后单击按钮。应用程序终止。很明显,我们的应用程序需要更好的方法来处理错误。
  可能有人会指出,应用程序应当不允许用户进行导致错误的无效输入,但根本上应用程序必须添加强健的错误处理功能。不是所有的错误都是可预防的,因此必须具备错误处理功能。
  上机操作 3:使用 OracleDataReader 检索多列和多行
  现在检索了单个值,下一步是使用 OracleDataReader 检索多列和多行。在表单中添加一个 ListBox 控件来显示结果。
  在表单中添加一个 ListBox 控件。重新调整控件的大小,填满表单的大部分宽度(如下所示)。
  图 14 添加了 ListBox 的表单
  从查询中删除 where 子句,并添加以下列:
  cmd.CommandText = _ "select department_id, department_name, location_id from departments" ' VB cmd.CommandText = "select department_id, department_name, location_id from departments "; // C#
  查询结果将在一个 while 循环中读取,并将填充 ListBox 控件。按如下所示修改 Visual Basic 代码,针对您的数据库相应修改主机和服务名称:
  Dim oradb As String = "Data Source=(DESCRIPTION=(ADDRESS_LIST=" _ + "(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521)))" _ + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" _ + "User Id=Password=" Dim conn As New OracleConnection(oradb) ' Visual Basic conn.Open() Dim cmd As New OracleCommand cmd.Connection = conn cmd.CommandText = _ "select department_id, department_name, location_id from departments" ' VB cmd.CommandType = CommandType.Text Dim dr As OracleDataReader = cmd.ExecuteReader() While dr.Read() ListBox1.Items.Add("The " + dr.Item("department_name") + _ " department is in " + dr.Item("location_id").ToString()) End While dr.Dispose() cmd.Dispose() conn.Dispose() Modify your C# code to look like this: string oradb = "Data Source=(DESCRIPTION=(ADDRESS_LIST=" + "(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521)))" + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" + "User Id=Password="; OracleConnection conn = new OracleConnection(oradb); // C# conn.Open(); OracleCommand cmd = new OracleCommand(); cmd.Connection = cmd.CommandText = "select department_id, department_name, location_id from departments.168"; cmd.CommandType = CommandType.T OracleDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { listBox1.Items.Add("The " + dr["department_name"].ToString() + " department is in " + dr["location_id"].ToString()); } dr.Dispose(); cmd.Dispose(); conn.Dispose();
  运行应用程序。ListBox 应填充了 departments 表中的所有部门名称和位置。供下载的代码中已经具备了错误处理功能。
[ 责任编辑:jj ]
去年,手机江湖里的竞争格局还是…
甲骨文的云战略已经完成第一阶段…
软件信息化周刊
比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。
商务办公周刊
比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!
比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。
服务器周刊
比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。
比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。
比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。
新闻中心热点推荐
新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。
云计算周刊
比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。
CIO俱乐部周刊
比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。
IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。
X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。
微信扫一扫
关注Chinabyte

我要回帖

更多关于 读取access数据库 的文章

 

随机推荐