如何在 Delphi 中使用 SQL 获取值并将该值设置为变量?

How to get a value using SQL in Delphi and setting the value to a variable?

我正在尝试从 table 获取药​​物价格,但我只得到:

procedure TForm1.BuyButtonClick(Sender: TObject);
var
  iAmount : integer;
  rRate : real;
  sMedication : string;
  sRate : string;
begin
  iAmount := 0;
  sMedication := BuyCombobox.Items[BuyCombobox.ItemIndex];
  dmHospital.qryPrices.SQL.Clear;
  dmHospital.qryPrices.SQL.Add('SELECT Price(R) FROM MedicationPrices WHERE Medication = quaotedstr(sMedication)');
  sRate := dmHospital.qryPrices.SQL;
  ShowMessage(sRate);
end;

没有测试过(手边没有Delphi)但应该是这样的:

iAmount := 0;  
sMedication := BuyCombobox.Items[BuyCombobox.ItemIndex];  
dmHospital.qryPrices.SQL.Clear;  
dmHospital.qryPrices.SQL.Add('SELECT Price(R) as price FROM MedicationPrices WHERE Medication = ' + QuotedStr(sMedication));  

dmHospital.qryPrices.Open;
if (dmHospital.qryPrices.RecordCount = 1)
  sRate := dmHospital.qryPrices.FieldByName('price').AsString;  

ShowMessage(sRate);  

您应该修改您的代码以实际工作: 我的建议是使用参数而不是 QuotedStr:

dmHospital.qryPrices.SQL.Clear;
dmHospital.qryPrices.SQL.Add('SELECT Price(R) AS Rate FROM MedicationPrices WHERE   Medication = :pMedication');
dmHospital.qryPrices.Params.ParamByName('pMedication').AsString=sMedication;

(请注意,在 ADOQuery 中,您将使用 .Parameters 而不是 .Params)

dmHospital.qryPrices.Open;
sRate=dmHospital.qryPrices.FieldByName('Rate').AsString;
ShowMessage(sRate);

此致

您没有正确使用查询。 qryPrices.SQL 是 SQL 语句本身。这只是文字。您需要做一些事情才能真正 运行 该声明。 (见下文。)

您还在引号内嵌入了变量,这意味着它没有被计算,对(拼写错误的)QuotedStr 的函数调用也没有被计算。没有函数 quaotedStr()。如果你坚持连接 SQL 的糟糕想法,你需要正确地做。如果你要清除然后添加,你可以只分配给 SQL.Text 而不是一步完成:

dmHospital.qryPrices.SQL.Text := 'SELECT Price(R) FROM MedicationPrices WHERE Medication = ' + Quotedstr(sMedication);

此外,查询在您实际执行之前不会执行任何操作。您需要使用 qryPrices.Open 到 运行 一个 SELECT 语句,或 qryPrices.ExecSQL 到 运行 一个 INSERTUPDATEDELETE声明。

你应该摆脱立即连接 SQL 的想法(在你养成习惯之前)并学习使用参数化查询。它允许数据库驱动程序为您处理格式、转换和引用,它还可以防止可以让其他人访问您的数据的 SQL 注入。这是应该可以帮助您入门的更正版本。

procedure TForm1.BuyButtonClick(Sender: TObject);
var
  sMedication : string;
  sRate : string;
begin
  iAmount := 0;
  sMedication := BuyCombobox.Items[BuyCombobox.ItemIndex];
  dmHospital.qryPrices.SQL.Text := 'SELECT Price(R) FROM MedicationPrices WHERE Medication = :Medication';
  dmHospital.qryPrices.Parameters.ParamByName('Medication').Value := sMedication;
  dmHospital.qryPrices.Open;
  sRate := dmHospital.qryPrices.FieldByName('Price(R)').AsString;
  dmHospital.qryPrices.Close;
  ShowMessage(sRate);
end;