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






3.20/5 (3投票s)
2007年4月26日
5分钟阅读

36344

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,并添加下图所示的控件。
在此,我使用 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,并按如下方式设计。
我将依次解释此窗体中的每个控件及其用途。
我使用 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.
因此,最终输出将是这样的:
我们仍然可以通过包含对序列、索引等其他数据库对象的访问来增强此应用程序。
我将代码附在本文件后供进一步参考。希望这些代码对大家有所帮助。