Логин:     Забыли пароль?
 
Пароль:   Регистрация

Форум / Программирование - Проблемы с MySQL  

Проблемы с MySQL


Страницы: «1» «2»
IlluminatI
IlluminatI
2-ой класс
Сообщения: 38
[Сообщение #1] 11 февраля 2010, 22:35
Привет всем. Пишу курсовую в которой используется MySQL. Работаю с помощью компонента TMySQL (http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1318).
Проблема в следующем: подключение проходин нормально, БД и таблицы создаются, но: при выполнение следующего кода:

 Lessons:=MySQL.Query('SHOW TABLES');
 while Lessons.FetchRow do
  ListBox1.Items.Add(Lessons.Values[Lessons.RecNo]);
 // возможны опечатки, так как писал "от руки", не копируя из делфи

добавляется название только одной (первой) таблицы, а все остальные - пустые строки (т.е если таблицы 3, то вернется название первой, и две пустые строки, в лист боксе будет 3 элемента).

При этом данные из таблиц читаются нормально, в архиве есть пример с исходником, делал на подобии.

Может быть, кто-то сталкивался с подобным? Подскажите, в чем тут дело?

Ерёмин А.А.
Ерёмин А.А.
*Администратор
Сообщения: 435
[Сообщение #2] 11 февраля 2010, 22:41
Из Delphi с MySQL не работал, но попробуем разобраться.

А при выполнении этого запроса, скажем, через phpMyAdmin весь список передаётся нормально?

Да, и ещё: уверены, что данные нужно забирать именно как Lessons.Values[Lessons.RecNo] ?

IlluminatI
IlluminatI
2-ой класс
Сообщения: 38
[Сообщение #3] 11 февраля 2010, 23:08
phpMyAdmin у меня не установлен, но через MySQLQueryBrowser этот запрос возвращает все таблице в БД (как и должно быть).

Насчет данных - в компоненте есть два варианта, один по имени (но я не знаю по какому имени их считывать, поэтому остановился на втором) - в исходниках сказано, что и тот и тот метод рабочие - RecNo - номер извлекаемой записи, увеличивается автоматически. По-идее, он проходит цикл столько раз, сколько таблиц в базе, но вот после первой возвращает пустые строки =\

Может, компонент багнутый? хотя, из таблиц этим-же способом данные нормально читаются

Ерёмин А.А.
Ерёмин А.А.
*Администратор
Сообщения: 435
[Сообщение #4] 12 февраля 2010, 09:46
Lessons.RecNo - номер записи, т.е. 0, 1, 2... Но вот Lessons.Values[Lessons.RecNo] - не очень похоже на правду. А если несколько полей в выборке, то как к ним обратиться? По логике в Values указывается номер поля, а текущая запись меняется автоматически через FetchRow. В общем я предлагаю заменить на Lessons.Values[0] - может так будет работать?

IlluminatI
IlluminatI
2-ой класс
Сообщения: 38
[Сообщение #5] 12 февраля 2010, 13:17
интересная мысль, как попробую отпишусь

IlluminatI
IlluminatI
2-ой класс
Сообщения: 38
[Сообщение #6] 17 февраля 2010, 23:39
в примере есть такой код:

  //запросим все строки из таблицы "groups"
  query_result := MySQL.Query('SELECT * FROM `groups`');
  if query_result = nil then //если nil значит произошла ошибка в запросе
  begin       //причинами могут быть отсутствие таблицы или некорректный запрос или...
    ShowMySQLError; //посмотрим ошибку
    Exit;
  end;
  //выполнили запрос к "groups", получили набор данных (query_result <> nil),
  //FetchRow извлекает первую и последующие строки из результирующего набора данных
  //работать с этой строкой можно до тех пор пока не извлекли следующую
  //если FetchRow вернула False, значит или строк нет или они кончились
  while query_result.FetchRow do //пробежимся по записям
  begin                          //и заполним lvGroups
    ListItem := lvGroups.Items.Add;
    ListItem.Caption := query_result.ValueByName['name'];
    New(Data);
    Data.id := query_result.ValueByName['id'];
    ListItem.Data := Data;
    //query_result.RecNo информирует какую строку мы извлекли (порядковый номер. отсчёт от 0)
  end;
  //query_result.FetchRow(5) если надо извлечь, например, пятую строку

судя по нему, получить название нужно с помощью query_result.ValueByName['---'], в таком случае, какое имя имеет столбец с названиями таблиц после запроса SHOW TABLES;

поглядел синтаксис, в выпадающем окошке (Code Helper кажется), конструкция Lessons.Values[]: string;

заменил код на такой:

 Lessons := MySQL.Query('SHOW TABLES');
 i:=0;
 while Lessons.FetchRow do
  begin
   ComboBox1.Items.Add(Lessons.Values[i]);
   inc(i);
  end;
результат, к сожалению, такой же :( таблиц в БД - 2, в комбобоксе - две записи, первая - название первой таблицы, а вторая пустая. Что еще может быть?

Ерёмин А.А.
Ерёмин А.А.
*Администратор
Сообщения: 435
[Сообщение #7] 18 февраля 2010, 12:06
Так вы же сами сделали то же самое. Для Values указывается номер поля, а не номер записи - записи двигаются сами. Что будет, если там вписать Values[0]?

Цитата (IlluminatI):

в таком случае, какое имя имеет столбец с названиями таблиц после запроса SHOW TABLES;

Обычно он имеет имя "Tables_in_ИМЯ-БАЗЫ-ДАННЫХ", но может и отличаться.

IlluminatI
IlluminatI
2-ой класс
Сообщения: 38
[Сообщение #8] 18 февраля 2010, 16:30
т.е, как я понимаю, получать данные через ValueByName['Tables_in_ИМЯ-БАЗЫ-ДАННЫХ'] не очень корректно? Хотя код вида ComboBox1.Items.Add(Lessons.ValueByName['Tables_in_mysql']) работает :)

Насчет Values[0] я что-то не очень вас понял :-[ вы имели ввиду такое: Lessons.Values[0]? если да, то она возвращает после запроса пустую строку.

Ерёмин А.А.
Ерёмин А.А.
*Администратор
Сообщения: 435
[Сообщение #9] 18 февраля 2010, 17:02

Цитата (IlluminatI):

т.е, как я понимаю, получать данные через ValueByName['Tables_in_ИМЯ-БАЗЫ-ДАННЫХ'] не очень корректно?

Если быть уверенным, что используемый движок выдаёт именно с таким названием поля - корректно. Ну и при условии, что движок фиксированный, т.е. работа с одной и той же СУБД.

Цитата (IlluminatI):

Хотя код вида ComboBox1.Items.Add(Lessons.ValueByName['Tables_in_mysql']) работает

Ну наконец-то :-)

Цитата (IlluminatI):

вы имели ввиду такое: Lessons.Values[0]? если да, то она возвращает после запроса пустую строку.

Да, такое. А Values[1] тоже не работает? Если нет, значит у них там что-то иначе сделано.

IlluminatI
IlluminatI
2-ой класс
Сообщения: 38
[Сообщение #10] 18 февраля 2010, 20:00
точно также возвращает пустую строку. Насчет движка и СУБД я уверен, так что буду использовать так :) Спасибо за помощь! Если что, буду писать :)


Страницы: «1» «2» (всего страниц: 2, текущая: 1)
Всего сообщений: 12 (сейчас показаны: с 1 по 10)

Перейти в раздел:


 © 2004 - 2017, Delphi.int.ru
Версия форума: 1.10 (19.01.2010)
RSS Delphi.int.ru Expert Код
Выполнено за 0.09 сек.
Обратная связь  
Рейтинг@Mail.ru Majordomo.ru - надёжный хостинг