代码之家  ›  专栏  ›  技术社区  ›  Larry Lustig

用于分析SQL语句的库

  •  6
  • Larry Lustig  · 技术社区  · 16 年前

    我希望能够解析任意的SQL select语句并检索各种组件部分(列、关系、连接条件、where条件、order by columns),最好使用delphi。一个快速的谷歌搜索显示几个不同的免费软件产品,但不清楚它们是否完整和/或正在积极开发中。

    我立即需要提取一系列视图定义中使用的关系列表,以确保在尝试创建视图之前存在所需的视图或表。例如,对于语句:

    SELECT PersonID, LastName, OrderID 
    FROM People P INNER JOIN Orders O ON P.PersonID = O.PersonID
    

    我需要恢复“人”和“命令”的价值观。(显然,这是一个简单的例子。我希望能够处理更复杂的情况,例如,单词“from”可能作为表达式的一部分出现在列列表中。

    我试图在一个允许使用从dlls导出的stdcall函数的数据库中提供此服务,所以理想情况下,任何候选库都可以从delphi或c调用。

    3 回复  |  直到 15 年前
        1
  •  6
  •   Mason Wheeler    16 年前

    看一看 Gold Parser. 它有一个Delphi版本,下载页面上有SQL语法。

        2
  •  0
  •   filiprem    16 年前

    SQL分析器很复杂。

    你有没有想过这样的方法:

    1. 开始事务。
    2. 向服务器发送创建视图命令。
    3. 捕获错误(任何像样的数据库驱动程序都应该能够做到这一点)。
    4. 如果出现错误,请分析错误消息并向客户端显示缺少的表。
    5. 回降

    请参见此示例(PostgreSQL):

    => begin;
    BEGIN
    => create view testview as select foo,bar from a join b on a.x=b.y;
    ERROR:  relation "a" does not exist
    LINE 1: create view testview as select foo,bar from a join b on a.x=...
                                                        ^
    => rollback;
    ROLLBACK
    

    或者这个(甲骨文):

    SQL> create view testview as select foo,bar from a join b on a.x=b.y;
    create view testview as select foo,bar from a join b on a.x=b.y
                                                       *
    ERROR at line 1:
    ORA-00942: table or view does not exist
    
    SQL> rollback;
    
    Rollback complete.
    
        3
  •  0
  •   Pmax    16 年前

    您可以使用Delphi和ADODB。

    在没有真正打开记录集的情况下,使用tadoquery测试查询是否良好。您还可以检索查询的字段名。

    将TadoConnection放到窗体上。 删除tmemo和tbutton并尝试以下代码:

    procedure TForm1.Button1Click(Sender: TObject);
    var
      lADOQuery : TADOQuery;
      lFieldNames : TStrings;
    begin
      lADOQuery := TADOQuery.Create(nil);
      try
        lADOQuery.Connection := ADOConnection1;
        lADOQuery.SQL.Text := Memo1.Text;
        lFieldNames := TStringList.create;
        try
          lADOQuery.GetFieldNames(lFieldNames);
    
          showmessage(lFieldNames.Text); // Show fieldNames of the query
    
          // To show that the dataset is not actually opened try this :
          // Throws an exception ( Dataset closed )
          //showmessage(inttostr(  lADOQuery.RecordCount ));
        except
          On e: Exception do
            ShowMessage('Invalid query');
        end;
        lFieldNames.free;
      finally
        lADOQuery.free;
      End;
    end;