使用delphi从sql查询中解析params

时间:2010-03-30 17:29:40

标签: delphi delphi-7

我如何使用delphi从SQL查询中解析和提取参数?

示例:

来自此查询

SELECT * FROM MyTable 
WHERE Field1=:Param1 
AND Field2=:Param2 
AND (Field3=:Param3 OR Field4=:Param4)

我想获得

参数1 参数2 参数3 Param4

提前致谢。

2 个答案:

答案 0 :(得分:10)

@Salvador,您可以使用TParams.ParseSQL函数来获取参数。

看到这个简单的代码

program Project241;

{$APPTYPE CONSOLE}

uses
  db, //for use TParams
  Classes,// 
  SysUtils;

procedure GetParamsFromSQL(SQL:string;Const ListParams:TStrings);
var
  ParamList: TParams;
  i: integer;
begin
 ListParams.Clear;//Clear the list
    ParamList := TParams.Create(nil);
    try
      ParamList.ParseSQL(SQL, True); //Force to create the params from the SQL
      for i := 0 to ParamList.Count - 1 do 
        ListParams.Add(ParamList[i].Name);
    finally
    ParamList.Free;
    end;
end;

var
  ParamList : TStrings;
begin
  ParamList:=TStringList.Create;
  try
    GetParamsFromSQL('SELECT * FROM MyTable WHERE Field1=:Param1 AND Field2=:Param2 AND (Field3=:Param3 OR Field4=:Param4)',ParamList);
    Writeln(ParamList.text);
    Readln;
  finally
  ParamList.Free;
  end;
end.

返回:

Param1
Param2
Param3
Param4

答案 1 :(得分:0)

对于像这样的简单查询,您可以修改一个简单的文本阅读算法,如下所示。它适用于您的特定查询,它可能“足够好”。只需传入一个空的TStringList。

uses
  StrUtils;

procedure ExtractParams(input: string; output: TStrings);
var
  colon, endpoint: integer;
begin
  colon := pos(':', input);
  while colon <> 0 do
  begin
    input := RightStr(input, length(input) - colon);

    endpoint := 0;
    repeat
      inc(endpoint)
    until input[endpoint] in [' ', ')']; //add other characters here as necessary

    output.Add(LeftStr(input, endpoint - 1));
    colon := pos(':', input);
  end;
end;

但是,如果您想进行更复杂的SQL解析,最好的办法是查看真正的解析器。查看GOLD Parser,它可以根据语言定义文件解析几种不同的语言,包括SQL。网站上有解析器的Delphi实现。