0

我有一个需要从 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;
4

2 回答 2

1

当一个人不期望将游标接收到数据集中时,使用“execsql”(换句话说,将“execsql”与“update”、“insert”和“delete”语句一起使用,但不能与“select”一起使用)。

你应该用'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;
于 2013-03-24T11:06:44.110 回答
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已经用于不同的东西

于 2013-03-24T12:01:00.060 回答