技术开发 频道

基于Oracle构建.NET应用

  错误处理

  当错误发生时,.NET 应用程序应当适当地处理错误并通过一条有意义的消息通知用户。

  Try-Catch-Finally 结构的错误处理是 .NET 语言的一部分。下面是使用 Try-Catch-Finally 语法的一个相对最小的示例:

  ' Visual Basic

  Try

  conn.Open()

  Dim cmd As New OracleCommand

  cmd.Connection = conn

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

  cmd.CommandType = CommandType.Text

  If dr.Read() Then

  Label1.Text = dr.Item("dname") ' 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 = conn;

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

  cmd.CommandType = CommandType.Text;

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

  {

  label1.Text = dr["dname"].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 语句来捕获最常见的数据库错误并显示对用户友好的消息。

  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())

  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 语句来捕获其他任何类型的非 Oracle 错误。在代码中,应该根据从特殊到一般的顺序对 Catch 语句排序。在实施了用户友好的异常处理代码之后,ORA-12545 错误消息显示如下:

  图 7:ORA-12545 错误的用户友好的错误消息

  无论是否发生错误,Finally 代码块总会执行。清除代码应包含在此代码块中。如果您不使用 Using 或 using,应在 Finally 代码块中删除您的连接和其他对象。

  利用 DataReader 检索多个值

  到目前为止,我们的示例仅说明了如何检索单个值。OracleDataReader 可以检索多列和多行的值。首先进行多列、单行的查询:

  select deptno, dname, loc from dept where deptno = 10

  要获取列的值,可以使用以零为基数的序号或列名。序号与查询中的顺序相关。因而,可以在 Visual Basic 中通过使用 dr.Item(2) 或 dr.Item("loc") 来检索 LOC 列的值。

  下面是将 DNAME 和来自上一查询的 LOC 列串连起来的代码片段:

  Label1.Text = "The " + dr.Item("dname") + " department is in " + dr.Item("loc") ' VB

  label1.Text = "The " + dr["dname"].ToString() + " department is in " +

  dr["loc"].ToString(); // C#

  现在我们进行返回多行的查询:

  select deptno, dname, loc from dept

  要处理从 OracleDataReader 中返回的多行,需要某种类型的循环结构。此外,需要一个可以显示多行的控件。OracleDataReader 是一个仅正向的只读游标,因此不能将其与可更新或完全可滚动的控件(如 Windows Forms DataGrid 控件)捆绑在一起。OracleDataReader 与 ListBox 控件兼容,如以下代码片段所示:

  While dr.Read() ' Visual Basic

  ListBox1.Items.Add("The " + dr.Item("dname") + " department is in " + dr.Item("loc"))

  End While

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

  {

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

  dr["loc"].ToString());

  }

  上机操作 3(利用 OracleDataReader 检索多列和多行)重点介绍了这些概念中的一部分。

0
相关文章