65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 和 .NET 中使用 Windows Forms 增强的 Oracle Explorer

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.20/5 (3投票s)

2007年4月26日

5分钟阅读

viewsIcon

36344

downloadIcon

855

用于访问 Oracle 中数据库对象的应用程序。

引言

Oracle 通常将数据库用作 .NET 应用程序的后端。但是,Oracle 的主要问题是,没有内置的、易于使用的 GUI 来访问其中的对象。因此,唯一的选择是使用 TOAD 或 PL/SQL Developer 等第三方工具来访问对象,而无需编写查询,用于获取所有表、过程、函数及其定义等活动。但是,这些工具无法为小型项目许可。即使您获得了许可,打开这些工具来进行小型活动(如获取所有表、过程定义以及运行简单的 SELECT 语句)也非常困难。这些工具启动速度慢,占用资源多,而且不是基于线程的。因此,我们无法在这些工具中执行多个操作。例如,同时获取过程定义和执行查询。

通过使用此应用程序,我们只需单击一下即可访问这些数据库对象。我将首先解释其中的功能,然后介绍设计和编码。

我使用 C#、VS.NET 2003 和 Windows Forms 设计了此应用程序。

此应用程序包含以下功能:

  • 轻松访问表、过程和函数。
  • 完全基于线程。
  • 我们可以同时执行多个活动。
  • 能够将表数据导出到 XML 文件。
  • 与 TOAD 相比,启动时间更短。
  • 在不阻止用户执行应用程序中其他操作的情况下,执行任何 SELECT 语句。
  • 能够在任何时间点取消任何线程。
  • 能够在应用程序中维护最近执行的查询列表。
  • 显示当前登录帐户可访问的对象。

在 C# 中创建一个新的 Windows 应用程序,并将其命名为 DBExplorer。

然后,将 Form1 重命名为 frmlogin,并添加下图所示的控件。

Screenshot - image001.jpg

在此,我使用 OLEDB 数据提供程序和 tnsnames 文件连接到 Oracle 数据库。我们可以使用 ODP.NET 数据提供程序来提高此应用程序的性能。单击“登录”按钮后,我将使用用户名、密码和数据源创建一个连接,其格式如下:

(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(
    HOST = <host-name>)(PORT = 1000)))(CONNECT_DATA =(SID  = dbname)));

我从我的 tnsnames.oraM 文件中获取此数据源字符串。创建连接后,我将关闭登录窗体,并打开一个名为 frmdbexplorer 的新窗体来探索 Oracle 对象。

现在,向解决方案添加一个新窗体,将其命名为 frmdbexplorer,并按如下方式设计。

Screenshot - image002.jpg

我将依次解释此窗体中的每个控件及其用途。

我使用 MainMenu 设计了以下菜单项:

查看对象 -> 全部 [我的] -> 表 -> 完整详细信息(将加载表名、行数、列名及其大小、类型和默认值到 TreeView)。

-> 部分详细信息(仅将表名和行数加载到 TreeView)。

-> 过程(将所有过程名加载到 Dropdown)。

-> 函数(将所有函数名加载到 Dropdown)。

在解释这些菜单项之前,我需要简要介绍一下 Oracle 中的数据字典。

数据字典是一组表,其中包含有关每个用户创建的表、视图、PL/SQL 过程和触发器等所有对象的信息。

例如,USER_TABLES 包含属于当前登录帐户的所有表。同样,ALL_TABLES 包含您可以访问的表,而 DBA_TABLES 包含 DBA 拥有特权的用户可以访问的表。

通常在 Oracle 中,对象被分类为:

  • 您可以访问的对象(以 USER_ 开头的表)。
  • 所有帐户都可以访问的对象(以 ALL_ 开头的表)。
  • DBA 可以访问的对象(以 DBA_ 开头的表)。

因此,通过单击相应的菜单项,您可以获取所需的对象。

执行查询将仅执行“执行查询”选项卡中文本框中编写的 SELECT 语句,并将结果返回到 dataset。最后,此 dataset 将绑定到 DataGrid 控件以显示查询结果。

导出到 XML 将所选表的数据导出到 XML 文件,并在 IE 中显示。

最近查询将在应用程序中维护您执行的查询列表。因此,如果您曾经写过某个查询,则无需再次编写。

取消当前 -> 加载表将停止正在将所有表加载到 Treeview 的线程。

取消当前 -> 加载对象将停止正在将所有过程和函数加载到 DropDownlist 的线程。

在窗体的左侧,有一个 Treeview 控件,用于加载所有表。在其旁边,有一个选项卡控件,包含两个选项卡页面。一个选项卡页面(Selected Item Defn)将选定的函数/过程定义加载到文本框中,另一个选项卡页面(Execute Query)将执行文本框中编写的查询,并在文本框下方的 DataGrid 控件中显示其结果。

此应用程序的主要逻辑是,每当您选择一项操作(例如执行耗时的查询)时,我们都会创建一个单独的线程来处理该操作。然后,我们可以同时继续执行其他操作,例如加载您帐户下的所有表。因此,我们可以同时执行多项任务,这在 TOAD 中是不可能的。

此窗体中的所有控件都由主线程创建。因此,其他线程无法更新这些控件。为了实现这一点,我们使用 `Invoke()` 方法与委托结合使用。

我使用以下查询从数据库中获取对象:

Select table_name from +type +_tables
Select distinct name from +type +_source where type like 'PROCEDURE'

where type can be of USER_ or ALL_ for getting list of tables and its 
properties.

因此,最终输出将是这样的:

Screenshot - image003.jpg

我们仍然可以通过包含对序列、索引等其他数据库对象的访问来增强此应用程序。

我将代码附在本文件后供进一步参考。希望这些代码对大家有所帮助。

© . All rights reserved.