我如何使用delphi从SQL查询中解析和提取参数?
示例:
来自此查询
SELECT * FROM MyTable
WHERE Field1=:Param1
AND Field2=:Param2
AND (Field3=:Param3 OR Field4=:Param4)
我想获得
参数1 参数2 参数3 Param4
提前致谢。
答案 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实现。