我有一个函数,它使用ADO连接对SQL数据库执行查询,它只是为数据库条目提供单个结果,只能对一种SELECT查询类型匹配(即从ID获取x值) 45,哪里有,只能有一个ID 45条目).
该函数工作正常,直到我点击一个不返回结果的查询.查询只是挂起,应用程序无法继续.这是一个示例查询字符串:
'SELECT Cost FROM MaterialCost ' +
'WHERE MaterialType = ''' + 'MS' +
''' AND Thickness = ''' + '0.250' + '''';
Run Code Online (Sandbox Code Playgroud)
再次这个确切的字符串将工作正常,直到我可能查询我不知道之前我知道的东西,它应返回null或空字符串.这是功能:
function SelectOneQuery(AQueryString : String; AADOConnectionString : String) : String;
var
ADOQuery: TADOQuery;
begin
//Create empty ADO Query, then connect to connection string
ADOQuery := TADOQuery.Create(nil);
ADOQuery.ConnectionString:=AADOConnectionString;
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add(AQueryString);
ADOQuery.ExecSQL;
ADOQuery.Open;
//Set first query result and return first result
ADOQuery.First;
if(ADOQuery.Fields.Count > 0) then begin
result:=ADOQuery.Fields[0].Value;
end
else begin
result := '';
end;
end;
Run Code Online (Sandbox Code Playgroud)
我添加了字段计数的东西,但我不确定这是否有帮助.基本上,如果没有结果,我想要result := ''
who*_*ddy 12
您的代码段中存在一些问题:
FieldCount.FieldCount将始终为非零,因为它包含查询返回的列数,而不管您的查询是否返回记录.一种选择是检查RecordCount哪个表示返回的行数,但更好的选择是检查 标志. EOFtry/finally块来创建和清理对象.ExecSQL用于不返回记录集的查询(如INSERT和DELETE),Open而是使用First之后无需使用Open例:
ADOQuery.SQL.Text := 'SELECT Cost FROM MaterialCost WHERE MaterialType = :MaterialType AND Thickness = :Thickness';
ADOQuery.Parameters.ParamByname('MaterialType').Value := 'MS';
ADOQuery.Parameters.ParamByname('Thickness').Value := 0.25;
Run Code Online (Sandbox Code Playgroud)
你的功能代码应该是这样的:
function SelectOneQuery(const AQueryString, AADOConnectionString: string): string;
var
ADOQuery: TADOQuery;
begin
Result := '';
ADOQuery := TADOQuery.Create(nil);
try
ADOQuery.ConnectionString := AADOConnectionString;
ADOQuery.SQL.Text := AQueryString;
ADOQuery.Open;
if not ADOQuery.EOF then
Result := ADOQuery.Fields[0].AsString;
finally
ADOQuery.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)