我有一个需要从MYSQL数据库中获取和显示数据的表单 我编写的SQL代码工作正常,因为我试图在MYSQL中执行它。
我还在我的表单中使用了一种类似的代码格式,在另一种形式中,用于获取和显示SQL数据。代码在另一种形式下完美运行 但是,我的此表单的代码似乎没有接收/显示SQL表中的数据。
以下是为表单的OnShow
事件编写的代码片段。
procedure TfrmEditBooking.FormShow(Sender: TObject);
var
CustName: string;
begin
if SelectedID > 0 then
begin
with frmBookingData.ADOQuery1 do
begin
Open;
SQL.Clear;
SQL.Add('SELECT Name, Surname ' +
'FROM customers_main ' +
'WHERE customers_main.idcustomers_main ' +
'IN ' +
'(SELECT bookings_main.customers_main_idcustomers_main ' +
'FROM bookings_main ' +
'WHERE bookings_main.idbookings_main = ' + IntToStr(SelectedID) + ')');
ExecSQL;
CustName := FieldByName('Surname').AsString + ' ' + FieldByName('Name').AsString;
Label1.Caption := CustName;
Close;
end;
end;
end;
答案 0 :(得分:1)
当一个人不期望将光标接收到数据集中时,会使用'execsql'(换句话说,使用带有'update','insert'和'delete'语句但不带'select'的'execsql')。
你应该用'open'替换'execsql'命令...并在'sql.clear'之前删除'open'。
当您应该使用联接时,请不要使用子查询。
我认为您的代码应该看起来像这样
procedure TfrmEditBooking.FormShow(Sender: TObject);
begin
if SelectedID > 0 then
with frmBookingData.ADOQuery1 do
begin
SQL.Clear;
SQL.Add ('SELECT Name, Surname ');
sql.add ('FROM customers_main inner join bookings_main');
sql.add ('on customers_main.idcustomers_main = ');
sql.add ('bookings_main.customers_main_idcustomers_main');
sql.add ('where bookings_main.idbookings_main = :p1');
sql.params[0].asinteger:= SelectedID;
open;
Label1.Caption := fieldbyname ('name').asstring + ' ' +
fieldbyname ('surname').asstring;
Close;
end;
end;
答案 1 :(得分:0)
要使其运行,您应该将其更改为
procedure TfrmEditBooking.FormShow(Sender: TObject);
var
CustName: string;
begin
if SelectedID > 0 then
begin
with frmBookingData.ADOQuery1 do
begin
Close; // close first
SQL.Clear;
SQL.Add(
'SELECT Name, Surname '+
'FROM customers_main '+
'WHERE customers_main.idcustomers_main '+
'IN '+
'(SELECT bookings_main.customers_main_idcustomers_main '+
'FROM bookings_main '+
'WHERE bookings_main.idbookings_main = '+IntToStr(SelectedID)+')');
Open; // open the query
if not Eof then
CustName := FieldByName('Surname').AsString+' '+FieldByName('Name').AsString
else
CustName := 'not found';
Close; // close when finished
end;
Label1.Caption := CustName;
end;
end;
但如果frmBookingData.ADOQuery1
已用于不同的东西,你应该得到一些(负面的)副作用