sql - 在表格中找不到字段
问题描述
我有一个包含字段“成本”的表,当我尝试从表中提取其值时,我收到一条错误消息,提示找不到该字段。
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;
解决方案
首先将程序中的值视为数据库中的类型。成本应该在您的 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;
推荐阅读
- windows - powershell 和使用脚本接收邮件的问题
- python - 如何从python对象列表中查找和删除对象
- spring - 如何将 spring rest 控制器从 Spring HATEOAS 0.x 迁移到 1.x?
- powershell - .gitignore 除了一个特定文件之外的所有文件(通过完整/完整的文件路径)
- python - 在张量流中扩展张量
- google-apps-script - Google Sheets onEdit(e) 动态排序功能
- c++ - 在 C++ 中初始化向量
- php - 如何从数字中删除数字并将其替换为 PHP 中的字母?
- javascript - 在 javascript 中,我是否可以返回我悬停的任何 DOM 元素的元素?
- html - 在 CSS 中使用 display flex