总结
本文向您介绍了使用 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 表中的所有部门名称和位置。供下载的代码中已经具备了错误处理功能。