从Delphi中的SQL表接收数据

时间:2013-03-24 11:01:17

标签: mysql sql delphi tadoquery

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

2 个答案:

答案 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已用于不同的东西,你应该得到一些(负面的)副作用