服务器 频道

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

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

  

 1: 从数据库中检索数据

  

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

      

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

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

      

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

  3. 在 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
    
  4. 在 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.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() Label1.Text = dr.Item("dname") '' or dr.Item(0) conn.Dispose()
    将以下 C# 代码添加到按钮的单击事件处理程序中的括号 { 和 } 之间,
    并确保用您的服务器的主机名称替代 OTNSRVR:
    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();
    dr.Read();
    label1.Text = dr.GetString(0);
    conn.Dispose();
    
  5. 运行应用程序。 单击按钮。 您将看到以下内容:

      

     
    图 10: 成功检索到数据


上机操作 2: 增加交互性

  现在在代码中实施了数据库访问的基础,下一步是为应用程序增加交互性。 可以添加一个文本框来接收用户输入的部门号码 (deptno),而不是运行硬编码的查询。

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

      

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

  2. 修改定义选择字符串的代码:
    cmd.CommandText = "select dname from dept where deptno 
    = " + TextBox1.Text ''VB.NET cmd.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 found"
    End If
    if (dr.Read()) // C#
    {
        label1.Text = dr.Item("dname");
    }
    Else
    {
        label1.Text = "deptno not found";
    }
    
  5. 输入不存在的 deptno 数字,测试应用程序。 现在应用程序不再退出。 输入字母 A 代替数字,然后单击按钮。 应用程序退出。 很明显,我们的应用程序需要更好的方法以处理错误。

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


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

  现在检索了单个值,下一步就是利用 DataReader 检索多行和多列。 添加一个 ListBox 控件到表单中,以显示结果。

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

      

     
    图 13: 添加了 ListBox 的表单

  2. 从查询中删除 where 子句,并添加以下列:
    cmd.CommandText = "select deptno, dname, loc from dept" '' VB.NET
    cmd.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.NET
    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(1) + _
    " department is in " + dr.Item("loc"))
    End While
    conn.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();
提供代码下载中已经实施了错误处理。
0
相关文章