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

Oracle 查询工具(第一部分)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.56/5 (48投票s)

2006 年 2 月 23 日

CPOL

4分钟阅读

viewsIcon

174952

downloadIcon

3347

一个带有语法高亮和标签式 MDI 界面的 Oracle 查询工具。

Sample screenshot

引言

这是一个用于创建和执行查询的小工具。本文的主要目的是创建一个带有语法着色的 Oracle 查询工具。本文使用 Visual Basic 2005 Express Edition 编写,需要 Microsoft NET Framework v2.0 才能运行。

使用 DockPanel 套件

用户界面将是一个 MDI 容器。为了提高开发者处理多个查询的能力,本项目将使用 Weifen Luo 开发的漂亮的组件 DockPanel。您可以在这里获取该组件的最新版本:SourceForge

首先,您需要将该组件保存在计算机的某个位置。我喜欢将组件保存在项目的源代码目录中。然后,我们需要将该组件添加到我们的工具箱中。右键单击工具箱,然后选择“选择项...”。使用“浏览”按钮选择该组件。

现在我们可以将该组件插入到新创建的窗体中。为了节省时间,您可以使用“MDI 父窗体”模板创建自己的窗体,该模板已包含 MDI 项目的一些基本界面。在“解决方案资源管理器”中右键单击您的解决方案,然后选择“添加”>“新项”,然后选择“MDI 父窗体”模板。将窗体命名为 'frmMain'。

现在我们可以继续并将该组件放入我们的窗体中。最后,请记住将组件“停靠”到窗体上。我们的父窗体现在已准备好显示标签式 MDI 子窗体。

创建查询窗体

现在我们需要创建子窗体。创建一个标准窗体并按如下方式编辑源代码

Imports WeifenLuo.WinFormsUI
Public Class frmQuery
    Inherits DockContent
End Class

Visual Basic IDE 将会引发一个异常,因为一个类不能继承自多个基类。在“错误修正选项”中,选择“更改类”选项,使“frmQuery”继承自“WeifenLuo.WinFormsUI.DockContent'”。

我们终于准备好了!创建的每个子窗体都会自动停靠。为了方便起见,我们将为选项卡的右键单击事件添加一个 `ContextMenu`。这可以通过将窗体的新属性之一“`TabPageContextMenuStrip`”设置为 `ContextMenuStrip` 来实现。

Sample screenshot texteditor

我们还将添加两个按钮,一个用于执行查询,一个用于中止查询,分别命名为“`btnExecute`”和“`btnAbort`”。

SQL 语法着色

我花了很多时间寻找一个易于使用的东西来包含到这个项目中。我最终找到了开源组件 `ICSharpCode.TextEditor`。该组件随 IDE **#develop** 一起提供。您可以在 这里 获取该组件的最新版本。

要使用该组件,我们必须像添加 `DockPanel` 一样将其添加到工具箱中。

现在我们可以将 `TextEditor` 插入到我们的查询窗体中。很遗憾,它与 Visual Basic IDE 的集成并不完美。这会导致在填充某些参数时出现一些小问题。

最后,我们可以将该组件与包含 Oracle SQL 语法高亮规则的 XML 文件绑定。该文件与项目一起提供。

Imports ICSharpCode.TextEditor
Imports ICSharpCode.TextEditor.Document

Private Sub frmQuery_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load 

    Dim strPathXSHD as String = _
        My.Application.Info.DirectoryPath & "\res\"
    Dim provider As New FileSyntaxModeProvider(strPathXSHD)
    Dim manager As HighlightingManager = _
        HighlightingManager.Manager

    manager.AddSyntaxModeFileProvider(provider)
    texteditorQuery.Document.HighlightingStrategy = _
               manager.FindHighlighter("ORACLESQL")

End Sub

组件将完成其余的工作!语法高亮管理器将使用文件 *OSQL.xshd* 中的规则对文本进行高亮显示。您可以随意编辑该文件并测试不同的样式组合。最后,`TextEditor` 还有其他很酷的功能。它会在控件的左侧显示行号,并高亮显示匹配的括号。

Sample screenshot texteditor

执行查询并在 DataGridView 上显示结果

作为第一步,要开始一个想要连接到 Oracle 的项目,我们必须添加对 'System.Data.OracleClient' 的引用。这可以通过菜单 项目 > 添加引用 来完成。所有对数据库的操作都将通过一个名为 'clsOracleReader' 的类来转发。为了让用户有机会中断长时间运行的查询,我们将在单独的线程上运行查询。当用户单击“`btnExecute`”按钮时,将执行以下代码

Private oOracleReader As New clsOracleReader
Private ThreadQuery As System.Threading.Thread

Private Delegate Sub BindDatagrid()

Public Sub ExecuteQuery()
    AddHandler oOracleReader.QueryCompleted, _
               AddressOf QueryCompleted
    ThreadQuery = New System.Threading.Thread(AddressOf _
                             oOracleReader.ExecuteQuery)
    ThreadQuery.IsBackground = True
    ThreadQuery.Start(texteditorQuery.Text)
End Sub

Public Sub QueryCompleted()
    If Me.InvokeRequired Then
        Dim d As New BindDatagrid(AddressOf _
                     BindDatagridHandler)
        Invoke(d)
    Else
        BindDatagridHandler()
    End If
    ThreadQuery = Nothing
    oOracleReader.Clear()
End Sub

Private Sub BindDatagridHandler()
    Dim oDataset As DataSet = oOracleReader.Dataset        
    If Not oDataset Is Nothing Then            
        DataGridView1.DataSource = oDataset.Tables(0)
        DataGridView1.Show()
    End If
End Sub

窗体将在新线程上启动执行,对象将在查询执行结束后引发一个事件。此事件将由 `QueryCompleted()` 方法处理。此方法将执行与 `DataGridView` 的绑定。由于 `DataGridView` 是在不同的线程上创建的,因此我们需要使用委托和 `Invoke()` 函数来设置对象的绑定。

最终注释

我希望您觉得这篇文章很有用。如果您觉得这篇文章很愚蠢、令人讨厌、不正确等等,请根据您的看法对文章进行评分。我打算用自动完成功能和其他改进来扩展这个软件,并希望很快能带来更多文章。

参考文献

历史

  • 2006 年 2 月 23 日 – 首次提交。
© . All rights reserved.