gpt4 book ai didi

SQL 查询因空结果而失败

转载 作者:行者123 更新时间:2023-12-03 15:39:50 26 4
gpt4 key购买 nike

我有一个使用 ADO 连接对 SQL 数据库执行查询的函数,它的设计目的很简单,就是为数据库条目提供单个结果,该数据库条目只能与 SELECT 类型匹配查询(即从 ID 45 获取 x 值,其中存在且只能有一个 ID 45 条目)。

该函数工作正常,直到我遇到一个不返回结果的查询。查询只是挂起,应用程序无法继续。下面是一个示例查询字符串:

'SELECT Cost FROM MaterialCost ' +
'WHERE MaterialType = ''' + 'MS' +
''' AND Thickness = ''' + '0.250' + '''';

同样,这个确切的字符串将正常工作,直到我可能查询我之前知道不存在的东西,它应该返回 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;

我添加了字段计数,但我不确定这是否有帮助。基本上,如果没有结果,我想要 result := ''

最佳答案

您的代码片段中存在一些问题:

  • 主要问题是您正在检查FieldCountFieldCount 将始终为非零,因为它包含查询返回的列数,无论您的查询是否返回记录。一种选择是检查 RecordCount 它表示返回的行数,但更好的选择是检查 EOF旗帜。
  • 您正在泄漏 ADOQuery。始终使用 try/finally block 来创建和清理对象。
  • ExecSQL 用于不返回记录集的查询(例如 INSERT 和 DELETE),使用 Open 代替
  • Open之后无需使用First
  • 如果您一遍又一遍地使用相同的查询,那么最好使用参数,这样您的代码将更具可读性。

示例:

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;

你的函数代码应该是这样的:

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;

关于SQL 查询因空结果而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18837469/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com