技术开发 频道

为数据库开发者准备的SQL编辑器:细节

ITPUB 专稿细节

SQL分析器

   SQL分析器是这个程序的核心并且是最复杂的部分。和写一个SQL分析器相比,写一个HTML代码或C++代码分析器是极其简单的。

   别的语言都有固定的语法规则(比如在HTML里,所有的标签从<TAG>开始,以</TAG>结束,或者在C++里,所有的命令都是以function(argument,argument);构成的,每一行代码都是以”:”结束),但是SQL这么”语言”却没有规则。

   没有方法知道一个命令何时结束。最复杂的SELECT命令可以包含一个WHERE子句也可以不包含。它也许有一个JOIN子句也许没有,等等。在再没有子句跟着的时候它就结束了。
   断行符可以在任何地方出现或完全丢失。
   括弧可以在任何地方出现或没有。
   一些命令(比如 LEFT)也许是个关键字(在JOIN LEFT里)或是一个函数(在left(string,count)里)。

   最后,SQL完全不是一门编程语言。它会被经验不足的程序员滥用,产出的代码像来自地狱。SqlBuilder的分析器有能力清除任何丑陋的SQL代码。

它执行以下五个步骤:

   1.第一个分析器分析无格式的SQL文本,搜索命令、关键字、函数、数据类型、操作符,字符串、数字和注释等然后将它们每一个创建成一个ParserItem实例存储在一个双向链表中。
   2.第二个分析器分析所有的括弧如果他们非常复杂的话就将它们分隔成多行。
   3.第三个分析器递归的分析一些复杂的命令,比如SELECT、CASE、CREATE、BEGIN、END……
   4.第四个分析器分析并纠正所有的断行符
   5.最后一个分析器填充RtfHtmlBuilder(如下),从分析数据创建RTF文档、HTML代码或纯文本文件。

   只有第一个步骤和纯文本文件一起工作。接下来的步骤都是在对象上操作,这样它们分析的非常快速,所以分析只会发生在输入文本的时候。如果前一趟分析还没有结束的时候你输入了一个新的字母,那么先前的分析会被取消并且重新开始一个新的分析。所有这些东西都在后台运行,对用户是透明的。

“Defaults”类
SqlBuilder有一个名为Defaults的类。在这里你可以定义你自己的喜欢的默认设置,比如分析器使用的颜色,超时时间或在用户没有指定服务器时使用的默认SQL Server服务器。
 

特殊的控件

SqlBuilder有一些特殊的控件类,你可以拷贝到别的C#程序里使用。

RichTextBoxEx

   这个类继承自RichTextBox,并且扩展了它的功能:

   一个”查找与替换(Search and Replace)”对话框
   一个”跳转到行Goto Line”对话框
   在状态栏里显示当前行和当前字符位置
   高级滚动功能
   无闪烁的在控件里替换RTF内容,并且保持光标位置不变。
   撤销缓冲区
   使用RftHtmlBuilder秒速创建RTF

RtfHtmlBuilder

   如果你曾经使用过微软的RichTextBox控件,并且希望以彩色显示文本,你也许知道:
 

richTextBox.SelectionColor = Color.Red;
richTextBox.SelectionIndex = 5;
richTextBox.AppendText(“Text”);
……


   这样非常缓慢。它难以置信的缓慢,以至于显示一个50KB的文本,用户需要等待20秒钟!

   RtfHtmlBuilder是一个快速的RTF、HTML和纯文本创建类
 

rtfBuilder.SelectionColor = Color.Red;
rtfBuilder.SelectionIndent = 5;
rtfBuilder.AppendText("Text");
.....
string s_Rtf = rtfBuilder.BuildRtf(new Font("Microsoft Sans Serif", 17));
richTextBoxEx.ReplaceRtf(s_Rtf); // flicker free text replacement


ListViewEx

   该类从ListView继承,它允许在视图上拖拽元素来改变它们的顺序

DataGridEx

   该类使用不同的颜色绘制数据表格的单元格,它还有更多的特性。它解决了5个微软的控件的问题。迄今为止DataGrid是.net 框架里含有最多bug的一个控件。

PasswordTextBox

   这个类允许输入密码,它可以防止任何API间谍和.net间谍的侦听。密码在内部保存为一个加密的字符串。
   这个文本框在你输入的时候显示成无格式文本,否则显示12颗星而不管密码有多长。

 

 

0
相关文章