2013-03-24 26 views
0

我有一個表單需要從MYSQL數據庫中獲取和顯示數據。
我寫的SQL代碼工作正常,因爲我試圖在MYSQL中執行它。在Delphi中接收來自SQL表的數據

我也使用了一種類似格式的代碼來在我的表單中,在另一種表單中獲取並顯示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

您打開查詢,然後更改打開的查詢語句,然後執行該操作並最終關閉。你應該閱讀如何正確使用TADOQuery/TDataSet – 2013-03-24 11:09:58

+0

這個http://stackoverflow.com/questions/15552718/using-multiple-sql-queries/15554868#15554868是非常類似於你的 – 2013-03-24 11:12:03

+0

你在哪裏設置連接字符串? – Sparky 2013-03-24 11:44:21

回答

1

一個用途「execsql」當一個人不希望接收光標對數據集(換句話說,使用「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; 
+0

謝謝你的,但它似乎仍然不工作。我現在有: 'Sql.Clear','Sql.Add','Open','FieldByName','Close' – Babah254 2013-03-24 11:15:18

+0

@ Babah254:我不知道您是否可以在IN語句中使用子查詢。通常情況下,您會編寫idcustomers_main可容納的文字值,例如,從customers_main中選擇姓名,其中idcustomers_main位於(12,13,14)中。子查詢返回什麼?您還可以通過編寫Label1.Caption:= fieldbyname('surname')。asstring +''+ fieldbyname('name')。asstring來刪除'custname'賦值。 – 2013-03-24 11:22:50

+0

SubQuery不是重點,但是**重用** ADOQuery1 - 在我看來,好像這已經被使用 – 2013-03-24 11:25:58

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已經在使用不同的東西

+0

這似乎不起作用。我檢查了您在其他帖子中發送的鏈接。我正在爲另一個例程使用相同的'ADOQuery',但是,在'frmEditBooking'' onShow'事件發生時它沒有執行任何操作。我試圖在窗體上添加另一個'ADOQuery',但是這也不起作用。 – Babah254 2013-03-24 19:10:56

+0

請描述「這似乎不起作用」。你有異常嗎?此方法是否分配給OnShow事件?使用調試器檢查是否調用了此方法,並執行了什麼操作 – 2013-03-24 19:49:44

+0

我沒有遇到異常,我的標籤標題沒有更改。我知道標籤不是問題,因爲它已經改變了使用其他方法。目前它並沒有被用於除了SQL查詢以外的任何其他功能。該方法在我的「Edit」表單的'OnShow'事件上調用。 ADOQuery,Connection和DataSource都在'Data'表單中找到。我使用一個ID(SelectedID),這個ID根據我點擊的「Main」表單上的ID來改變。此ID正確傳遞,因爲我有另一個標籤來證明這一點。我需要我的表單根據他們的ID顯示客戶的姓名。 – Babah254 2013-03-24 20:24:44