首页 > 解决方案 > 在表格中找不到字段

问题描述

我有一个包含字段“成本”的表,当我尝试从表中提取其值时,我收到一条错误消息,提示找不到该字段。

 function TSQLs.Get(value,room,hotel: string): string;
begin
  with Databasehub.DataModule1 do
  begin
    ADOQuery1.SQL.Clear;
    ADOTable1.TableName:='TblRoom';
    ADOQuery1.SQL.Add('SELECT "'+value+'" FROM TblRoom WHERE RoomType="' + Room + '" AND HotelName 
    ="'+Hotel+'"');
    DataSource1.DataSet:=ADOQuery1;
    ADOQuery1.Open;
    if (ADOQuery1.RecordCount = 1) then
    begin
      Result := ADOQuery1.FieldByName(value).AsString;
    end;
  end;
end;

我正在从中提取值的数据库表 表其链接到

标签: sqlms-accessdelphi

解决方案


首先将程序中的值视为数据库中的类型。成本应该在您的 Access DB 中定义为货币类型,Delphi 也有货币类型,只要您可以使用它,并且仅在演示时使用它,使用转换为文本(或使用可以处理本机类型的控件)。还要确保始终在查询中使用参数,否则您很容易受到SQL 注入的攻击,作为奖励,它使您的查询更具可读性并避免名称中的引号等问题......

这是参数化查询的示例以及如何动态创建查询

function TSQLs.GetCost(const Room : string; const Hotel: string): Currency;

var
  Qry : TADOQuery;
begin
 Qry := TADOQuery.Create(nil);
 try
  Qry.Connection := Databasehub.DataModule1.AdoConnection; // assign your TADOconnection here
  Qry.ParamCheck := True; // parse parameters
  Qry.SQL.Text :='SELECT Cost FROM TblRoom WHERE RoomType=:Room AND HotelName=:Hotel'; 
  Qry.Parameters.ParamByName('Room').Value := Room;
  Qry.Parameters.ParamByName('Room').DataType := ftString;
  Qry.Parameters.ParamByName('Hotel').Value := Hotel;
  Qry.Parameters.ParamByName('Hotel').DataType := ftString;
  Qry.Active := True; // Qry.Open is also fine here
  if not Qry.EOF then // don't rely on recordcount here as it could be 0 when using dynamic cursors for example
    Result := Qry.FieldByName('Cost').AsCurrency;
 finally
  Qry.Free;
 end;
end;

推荐阅读