如何在 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
到 运行 一个 INSERT
、UPDATE
或 DELETE
声明。
你应该摆脱立即连接 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;
我正在尝试从 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
到 运行 一个 INSERT
、UPDATE
或 DELETE
声明。
你应该摆脱立即连接 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;