快过年了,但思路还一直在程序上啊,这是不是咱们程序员的悲哀?
问题如下:我现在想做一个有关数据库的查询分析器(具体模样与SQLSERVER的相同)。但在处理时碰到了问题第一个,在输入的过程中,如果输入了关键字,则让其改变颜色显示。如输入SELECT,则令其用另外一种颜色显示。如果不是,则显示为普通颜色。另外,如果在SELECT左右加入了方括号,即[SELECT],则又是普通颜色,该怎么处理?第二个,如果碰到了多条SQL语句,比如说编辑器中有两条SQL语句,则应当在两个表格中显示,但我怎么判断它是两条SQL语句啊?谢谢大家了,如果解决了问题,还可另开贴加分(我只能加200了,不然我就按最高的来了)。

解决方案 »

  1.   

    一个可以在很快的时间内分析一断HTML代码并高亮显示的程序http://www.applevb.com/sourcecode/HTML%20Parser%20throw%20away%20WebBrowser%20control.zip
      

  2.   

    对于第一个 我的思路是这样的  即时检测 输入条 每次按键发生后将其内容存入一个 string
    检查 string   如果有 select等字样的 检查他的上一个字符和下一个字符 如果上一个和下一个字符是 空格,或没有上一个字符,则改变输入条的 fontcolor对于第二个,不会ing  我是初学者,不知道 vb还没学全  ^_^
      

  3.   

    第一个,在输入的过程中,如果输入了关键字,则让其改变颜色显示。如输入SELECT,则令其用另外一种颜色显示。如果不是,则显示为普通颜色。另外,如果在SELECT左右加入了方括号,即[SELECT],则又是普通颜色,该怎么处理?问题的关键:在输入的过程中定位单词.
    思路:
    单词的出现.
    1.由于单词是以空格为开始的.所以,在两个空格的中间部分必单词.
    2.如果输入点在输入框的最后,那么,从最后向上的倒数第一个空至最后部分必是单词.
    由于SQL的关键字是小于32个字符的,所以,我们可以在输入点的向上16个字符和向下16个字符中查找该单词.'==========================================
    Dim SqlKey() As String '用于记录关键字.Private Sub Form_Load()
            SqlKey() = Split("select,case,updata,where", ",")
    End SubPrivate Sub RichTextBox1_Change()
            Dim A As Long
            Dim B As Long
            Dim C As Long
            Dim STR As String
            Dim STRB As String
            Dim D As Long
            Dim E As Long
            Dim F As Long
            Dim K As String
            Dim TextLen As Long
            Dim O As Long
            Dim P As Long
                    
            A = rt1.SelStart + 1
            TextLen = Len(rt1.Text)
            If A <= 16 Then
               C = 1
               D = A
            Else
               C = A - 16
               D = 16
            End If
            STR = Mid$(rt1.Text, C, D) '向前取16位字符串.
            E = InStrRev(STR, " ")    '向前查找空格        If A <> TextLen Then
               STRB = Mid$(rt1.Text, D + 1, 16) '向后取16位字符串.
               F = InStr(STRB, " ")   '向后查找空格
            End If
            
            If E + F = 0 Then
               K = STR & STRB
            Else
               K = Mid$(STR & STRB, IIf(E = 0, 1, E), Len(STR) - E + F + 1)
            End If
            K = Trim$(K) '找出单词.
            Me.Caption = K
            
            If FindKey(K) Then '判断是否是关键字.
               O = rt1.SelStart
               rt1.SelStart = IIf(O > 1, O - Len(K), 1)
               rt1.SelLength = Len(K)
               rt1.SelColor = RGB(255, 0, 0)
            Else
               O = rt1.SelStart
               rt1.SelStart = IIf(O > 1, O - Len(K), 1)
               rt1.SelLength = Len(K)
               rt1.SelColor = RGB(0, 0, 0)
            End If
            rt1.SelStart = O
            rt1.SelLength = 0End Sub'最好改为快速查找法.
    Function FindKey(KeyStr As String) As Boolean
             Dim t As Long
             Dim RetVal As Boolean
             RetVal = False
             For t = 0 To UBound(SqlKey)
                 If UCase$(KeyStr) = UCase$(SqlKey(t)) Then
                     RetVal = True
                     Exit For
                 End If
             Next
             FindKey = RetVal
    End Function第二个,如果碰到了多条SQL语句,比如说编辑器中有两条SQL语句,则应当在两个表格中显示,但我怎么判断它是两条SQL语句啊?情况一.如果只运行查询语句,可以将回车符CHR(13)作为每条语句的分隔符.
    情况二.如果还有其它部分,那么,问题将会变得复杂起来.例如:建表语句,就可以包括很多个回车符.这种情形下,你只能以某个单词开始的为分隔符.常用开始单词有.
    SELECT UPDATA INSET INTO CREATE .等等 .....
    将该类型单词至下一个单词的开始的中间部分可作为一条语句.
      

  4.   

    TO MSTOP(CJH) 第一个问题中,如果我出现有这样的SQL语句,中间的SELECT无法高亮显示。
    Select (Select Max(ID) From Other Where Tool.Name=Other.Name) From Tool第二个问题:语句同上,中间的Select似乎无法成为分隔符。谢谢解答
      

  5.   

    那么,改成如下:        STR = Mid$(rt1.Text, C, D) '向前取16位字符串.
            E = InStrRev(STR, " ")    '向前查找空格
            STR = Mid$(rt1.Text, C, D) '向前取16位字符串.
            T = InStrRev(STR, ")")    '向前查找)
            IF T>E THEN E=T        STRB = Mid$(rt1.Text, D + 1, 16) '向后取16位字符串.
            F = InStr(STRB, " ")   '向后查找空格
            G = InStr(STRB, ")")   '向后查找)格
            IF G<F THEN F=G
      

  6.   

    对于第二个问题,还是加入一个自定义的分隔符吧.例如:#GO.将RTF.TEXT读入一个字符串中.然后.
    DIM SQLQUY() AS STRING
    SQLQUY=SPLIT(RTF.TEXT,"#GO")
    那么,数组SQLQUY保存是就是分隔后的SQL语句.
      

  7.   

    1.可以在控制項的CHANGE事件裏面寫代碼檢測,主要是輸入空格之後檢測空格前面的單詞是否是關鍵字,除了空格之外還應該檢測回車(即輸入的是回車,也應該判斷回車前面是否為關鍵字).
    可以這麽來做,但是這樣程度會有限制,因為編譯器的文字變色是在控件前的基礎上做的,也就是直接在視圖的底層上進行操作,用VB只能是在控制項的基礎上做,速度肯定跟不上.2.比較簡單的方法是在不同的SQL語句後面用分號隔開.  PB就是這麽實現的~~~~~
      

  8.   

    感谢各位,但我现在对于问题的想法是这样的第一个问题,想要实现既定功能,又想要不影响速度,目前速度不是太好。第二个问题,根本就没有办法知道分隔符是怎么输入的。如果像ORACLE等数据库输入一个分号即可以进行分析,那还不用这么麻烦了。我只想动态地知道用户输入了几条SQL语句,需要做几次查询。分不够再加啊,来者有分。
      

  9.   

    这有一个c#的,参考一下,用的是子类技术:
    http://www.c-sharpcorner.com/Code/2003/June/ColorSyntaxEditor.asp
      

  10.   

    对于第二个问题,我记得好像按照标准的sql查询语句的规定,查询语句中的单词之间允许随意加空格,但每条查询语句都应该是以分号(;)结束的。楼主可以从这方面考虑。我有时候在sqlserver里输入多句查询语句时,为了看起来有调理一点,常把一句查询分开几行写,但又忘了加分号,结果也是报错的。
      

  11.   

    一般代码分析要在独立线程中进行,不要放在Change事件中,会阻滞。(用VB就是这点讨厌阿)
      

  12.   

    在SQLSERVER中不加分号同样也可以进行查询的啊。
    另:谢谢rainstormmaster(暴风雨 v2.0)给的代码,正是我想要的结果,我试着改成VB代码试试。大家再帮我分析一下如何判断多个SQL语句啊。