技术开发 频道

基于Oracle构建.NET应用

  总结

  本文向您介绍了使用 VS.NET 编程语言访问 Oracle 数据库的过程。您现在应该能够连接数据库并检索多列和多行。

  John Paul Cook (johnpaulcook@email.com) 是居住在休斯顿的一位数据库和 .NET 顾问。他撰写了许多关于 .NET、Oracle 和其他主题的文章,并从 1986 年以来一直开发关系数据库应用程序。他目前的兴趣包括 Visual Studio 2005 和 Oracle 10g。他是 Oracle 认证 DBA 和 Microsoft MCSD for .NET。

  上机操作 1:从数据库中检索数据

  前提条件是您已经创建了一个工程并添加了一个引用(如本文前面部分所示)。

  首先向 Windows 表单添加一个按钮控件和一个标签控件。务必在这些控件上方保留空间,以便在上机操作 2 中添加控件。

  图 8:包含按钮和标签控件的表单(上机操作 1)

  添加代码,它们用于从 Oracle 数据库中检索数据并在表单上显示结果。将代码放在按钮的单击事件处理程序中。开始这项任务的最容易的方式是双击该按钮,因为它将为事件处理程序创建一个 stub。

  图 9:单击事件处理程序 stub。

  在 Public Class 声明之前添加 VB.NET Imports 语句,或在命名空间声明之前添加 C# using 语句。

  Imports System.Data ' VB.NET

  Imports Oracle.DataAccess.Client ' ODP.NET Oracle managed provider

  using System.Data; // C#

  using Oracle.DataAccess.Client; // ODP.NET Oracle managed provider

  在 Private Sub 和 End Sub 语句之间添加 VB.NET 版本的单击事件处理程序代码(确保用您的服务器的主机名称替代 OTNSRVR):

  Dim oradb As String = "Data Source=(DESCRIPTION=(ADDRESS_LIST=" _

  + "(ADDRESS=(PROTOCOL=TCP)(HOST=OSRVR)(PORT=1521)))" _

  + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" _

  + "User Id=scott;Password=tiger;"

  Dim conn As New OracleConnection(oradb) ' VB.NET

  conn.Open()

  Dim cmd As New OracleCommand

  cmd.Connection = conn

  cmd.CommandText = "select dname from dept where deptno = 10"

  cmd.CommandType = CommandType.Text

  Dim dr As OracleDataReader = cmd.ExecuteReader()

  dr.Read() ' replace this statement in next lab

  Label1.Text = dr.Item("dname") ' or dr.Item(0), remove in next lab

  dr.Dispose()

  cmd.Dispose()

  conn.Dispose()

  将以下单击事件处理程序的 C# 代码添加到按钮的单击事件处理程序中的括号 { 和 } 之间(确保用您的服务器的主机名称替代 OTNSRVR):

  string oradb = "Data Source=(DESCRIPTION=(ADDRESS_LIST="

  + "(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(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(); // replace this statement in next lab

  label1.Text = dr["dname"].ToString(); // remove in next lab

  dr.Dispose();

  cmd.Dispose();

  conn.Dispose();

  运行应用程序。单击按钮。您将看到以下内容:

  图 10:成功检索到数据

  上机操作 2:增加交互性

  既然已在代码中实施了数据库访问的基础,下一步是为应用程序增加交互性。与运行硬编码的查询不同,可以添加一个文本框控件来接受用户输入的部门号码(即 DEPTNO)。

  向表单中添加一个文本框控件和另一个标签控件(如下所示):将 Label2 控件的文本属性设为 Enter DEPTNO:并确保没有设置 TextBox1 的 Text 属性。

  图 11:包含按钮和标签控件的表单(上机操作 2 )

  修改定义 select 字符串的代码:

  cmd.CommandText = "select dname from dept where deptno = " + TextBox1.Text 'VB.NET

  cmd.CommandText = "select dname from dept where deptno = " + textBox1.Text; // C#

  运行应用程序。在 deptno 中输入 10 测试应用程序。输入一个无效的 DEPTNO(例如 50)重新测试应用程序。应用程序将终止。

  图 12:一个未处理的异常

  修改代码防止在输入无效的 DEPTNO 时出现错误。让我们回顾一下,ExecuteReader 方法实际返回一个对象。将包含 dr.Read 的代码行替换为以下全部语句。

  If dr.Read() Then ' Visual Basic

  Label1.Text = dr.Item("dname").ToString()

  Else

  Label1.Text = "deptno not found"

  End If

  if (dr.Read()) // C#

  {

  label1.Text = dr["dname"].ToString();;

  }

  else

  {

  label1.Text = "deptno not found";

  }

  输入不存在的 DEPTNO 数字测试应用程序。现在应用程序不再终止。输入字母 A 代替数字,然后单击按钮。应用程序终止。很明显,我们的应用程序需要更好的方法来处理错误。

  可能有人会指出,应用程序应当不充许用户进行导致错误的无效输入,但根本上应用程序必须添加强健的错误处理功能。不是所有的错误都是可预防的,因此必须具备错误处理功能。

  上机操作 3:使用 DataReader 检索多行和多列

  既然已检索了单个值,下一步是使用 DataReader 检索多行和多列。在表单中添加一个 ListBox 控件来显示结果。

  在表单中添加一个 ListBox 控件。重新调整控件的大小,填满表单的大部分宽度(如下所示)。

  图 13:添加了 ListBox 的表单

  从查询中删除 where 子句,并添加以下列:

  cmd.CommandText = "select deptno, dname, loc from dept" ' VB.NET

  cmd.CommandText = "select deptno, dname, loc from dept"; // C#

  查询结果将在一个 while 循环中读取,并将填充 ListBox 控件。修改 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) ' Visual Basic

  conn.Open()

  Dim cmd As New OracleCommand

  cmd.Connection = conn

  cmd.CommandText = "select deptno, dname, loc from dept";

  cmd.CommandType = CommandType.Text

  Dim dr As OracleDataReader = cmd.ExecuteReader()

  While dr.Read()

  ListBox1.Items.Add("The " + dr.Item("dname") + _

  " department is in " + dr.Item("loc"))

  End While

  dr.Dispose()

  cmd.Dispose()

  conn.Dispose()

  修改您的 C# 代码,最终结果如下:

  string oradb = "Data Source=(DESCRIPTION=(ADDRESS_LIST="

  + "(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(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 deptno, dname, loc from dept";

  cmd.CommandType = CommandType.Text;

  OracleDataReader dr = cmd.ExecuteReader();

  while (dr.Read())

  {

  listBox1.Items.Add("The " + dr["dname"].ToString() +

  " department is in " + dr["loc"].ToString());

  }

  dr.Dispose();

  cmd.Dispose();

  conn.Dispose();

  运行应用程序。ListBox 应填充了 DEPT 表中的所有部门名称和位置。供下载的代码中已经具备了错误处理功能。

0
相关文章