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

Oce*_*ght 0 sql delphi ms-access delphi-2010

我试图从桌子上得到药物的价格,但我得到了:

在此处输入图片说明

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;
Run Code Online (Sandbox Code Playgroud)

Van*_*lar 5

您应该修改您的代码以使其实际工作:我的建议是使用参数而不是 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;
Run Code Online (Sandbox Code Playgroud)

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

dmHospital.qryPrices.Open;
sRate=dmHospital.qryPrices.FieldByName('Rate').AsString;
ShowMessage(sRate);
Run Code Online (Sandbox Code Playgroud)

问候


Ken*_*ite 5

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

您还将变量嵌入到引号内,这意味着它没有被计算,并且对 (拼写错误) 的函数调用也没有被计算QuotedStr。没有任何功能quaotedStr()。如果您坚持连接 SQL 的糟糕想法,则需要正确执行。如果您要先清除然后添加,您可以直接分配给SQL.Text而不是一步完成:

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

此外,在您实际执行查询之前,该查询不会执行任何操作。您需要使用qryPrices.Open来运行SELECT语句,或qryPrices.ExecSQL运行INSERT, UPDATEorDELETE语句。

您应该立即放弃连接 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;
Run Code Online (Sandbox Code Playgroud)