2013-03-24 2 views
0

У меня есть форма, которая должна отображать и отображать данные из базы данных MYSQL.
SQL-код, который я написал, отлично работает, поскольку я попытался выполнить его в MYSQL.Получение данных из таблицы SQL в Delphi

Я также использовал аналогичный формат кода для одного в моей форме, в другой форме, для извлечения и отображения данных 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 –

+0

Этот http://stackoverflow.com/questions/15552718/using-multiple-sql-queries/15554868#15554868 очень похож на ваш –

+0

Где вы устанавливаете строку подключения? – Sparky

ответ

1

Один использует «ExecSQL», когда один не ожидает получить курсор в наборе данных (другими словами, используйте «ExecSQL» с «обновления», «вставки» и «удалить» заявления, но не с " Выбрать').

Вы должны заменить команду «execsql» на «open» ... и удалить «open» перед «sql.clear».

Не используйте подзапрос, если вы должны использовать соединение.

Я думаю, что ваш код должен выглядеть следующим образом

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

+0

@ Babah254: Я не знаю, можете ли вы использовать подзапрос в инструкции IN. Обычно вы должны писать литеральные значения, которые может содержать idcustomers_main, например, выбрать имя, фамилию из customers_main, где idcustomers_main в (12,13,14). Что возвращает этот подзапрос? Вы также можете удалить назначение «custname», написав Label1.Caption: = fieldbyname ('surname'). Asstring + '' + fieldbyname ('name'). Asstring. –

+0

SubQuery не здесь, но ** повторное использование ** ADOQuery1 - выглядит так, как будто это уже используется –

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

+0

Просьба описать «это, похоже, не работает». Вы получаете исключение? Этот метод назначен для события OnShow? Используйте отладчик для проверки, если этот метод вызывается и что сделано –

+0

Я не получаю исключения, я не получаю никаких изменений в заголовке ярлыков. Я знаю, что метка не проблема, поскольку она изменилась с использованием других методов. В настоящее время он не используется ни для чего, кроме SQL Query. Этот метод вызывается в событии 'OnShow' формы' Edit'. ADOQuery, Connection и DataSource находятся в форме «Данные». Я использую идентификатор (SelectedID), который изменяется в зависимости от того, на какой идентификатор нажимается, в моей форме «Главная». Этот идентификатор передается правильно, так как у меня есть еще один ярлык, подтверждающий это. Мне нужна моя форма для отображения имени клиента в соответствии с их идентификатором. – Babah254

 Смежные вопросы

  • Нет связанных вопросов^_^