На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА
Прежде чем задать вопрос, зайдите в раздел FAQ, возможно там уже есть ответ на него.
Если вы хотите вставить код в сообщение, то пожалуйста выделяйте его тегом [code=dfp] ... [/сode].
Для этого используйте кнопку [code=dfp] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Delphi for PHP.
Модераторы: ViktorXP, vicis
  
> Missing query to execute
    Всем вечерок!
    Недавно пришлось перейти на Rad PHP (Embarcadero® RadPHP™ XE2 Version 4.0.0.1547 ).
    Для проекта необходима работа с БД MySQL.
    Со всеми компонентами разобрался, но возникает непонятная ошибка: Application raised an exception class EDatabaseError with message 'Missing query to execute'.
    Проект состоит из: DBGrid, DataBase,DataSource,Query. Все компоненты настроил правильно, т.к. если ввести SQL -запрос в св-во SQL компонента Query, то сервер возвращает ответ. Ошибка возникает, если это делать программным путём:
    ExpandedWrap disabled
      function Button1Click($sender, $params){
          $query = "select * from books";
          $this->Query1->close();
          $this->Query1->SQL = $query;
          $this->Query1->open();
      }

    Что предпринимал: поменял MySQL сервер с 5.5 на 5.1.Ничего не изменилось.
    Знающие люди, в чём проблема?
      Database1->Debug = True;
        Ошибка всё равно осталась. Пишет тоже самое
          конечно осталась
          но показать должно - что передаётся на сервер
          текст запроса...

          Добавлено
          запускаеш из среды ?
            Спасибо, что меня натолкнули на мысль. Вродеб разобрался, но был очень удивлён (:
            Я так понял: св-во SQL компонента Query должно быть изначально заполнено при первом запуске. Т.е. нельзя именно уже во время выполнения сформировать самый первый запрос. Самый первый запрос задаётся по дефолту в средеПравильно?
            И ещё тогда сразу такой вопрос: Можно ли тогда каким либо образом отправить запрос CREATE TABLE или CREATE DATABASE , и как это сделать, если компонент Query изначально уже должен быть привязан к существующей БД и таблице?
              Цитата NE_KTO_INOI @
              Я так понял: св-во SQL компонента Query должно быть изначально заполнено при первом запуске. Т.е. нельзя именно уже во время выполнения сформировать самый первый запрос

              нет не правильно. всё там можно и без первого запроса
              просто непонятно в каком месте ошибка возникает
              возможно отладчиком стоило бы строку найти

              моё предположение такое (из опыта с Delphi)
              если до первого запроса датасет не был открыт,
              то команда $this->Query1->close() должна выдать ошибку
              в этом случае правильнее написать
              $this->Query1->active = False
                Ошибка возникает как я понял в файле : |_Callstack #15 File: C:\Program Files (x86)\Embarcadero\RadPHP\4.0\rpcl\dbtables.inc.php Line: 591
                Посмотрел этот файл. Там такой код(часть):
                ExpandedWrap disabled
                  function InternalOpen()
                      {
                          if (($this->ControlState & csDesigning)!=csDesigning)
                          {
                              $query=$this->buildQuery();
                              if (trim($query)=='') DatabaseError(_("Missing query to execute"));
                              $this->CheckDatabase();
                  ...

                Т.е. здесь видимо проверяется, пустой ли запрос. Ясное дело ,что если запрос формировать программно, то он вначале пустой, и поэтому возникает ошибка. Правильно, или Вы другое имели ввиду?

                Добавлено
                Так. Хорошая новость. Проблема решилась!Ошибка была вот в чём. Изначально св-во Query->Active стояло в true . Надо в false поставить, и всё шикарно будет(: Вы были правы.Спасибо!
                Только на 2-ой вопрос нужен ещё ответ: Можно ли тогда каким либо образом отправить запрос CREATE TABLE или CREATE DATABASE , и как это сделать, если компонент Query изначально уже должен быть привязан к существующей БД и таблице?
                  Цитата NE_KTO_INOI @
                  Можно ли тогда каким либо образом отправить запрос CREATE TABLE или CREATE DATABASE , и как это сделать, если компонент Query изначально уже должен быть привязан к существующей БД и таблице?

                  для таблиц так можно, а для базы не пробовал
                  ExpandedWrap disabled
                    $this->Database1->execute('CREATE TABLE ....

                  здесь вообще без Query обходиться можно
                  например:
                  ExpandedWrap disabled
                    function SetSysParam($p_Name,$p_Value)
                                    {
                                    $query ='UPDATE param_sys  SET p_value=? WHERE (p_name=?)';
                                    $xarray=array();
                                    $xarray[]=$p_Value;
                                    $xarray[]=$p_Name;
                                    $this->Database1->execute($query,$xarray);
                                    }

                  А для создания базы как минимум права нужны.
                  Вариантов для PHP в интернете описано много:
                  http://lphp.ru/article/280.html
                  http://www.html.by/threads/14218-Sozdanie-BD-cherez-php
                  http://www.google.com.ua/search?hl=ru&q=%D...&rlz=1I7ADFA_ru
                  Хотя задача динамического создания базы мне кажется непонятной.
                  Это задача администратора, а не пользовательской программы, разьве что если инструмент администрирования делать, тогда да...
                    Цитата NE_KTO_INOI @
                    Изначально св-во Query->Active стояло в true

                    изначально это свойство в False
                    это потом программист его поменял в true 8-)
                      Цитата

                      если до первого запроса датасет не был открыт,
                      то команда $this->Query1->close() должна выдать ошибку
                      в этом случае правильнее написать
                      $this->Query1->active = False

                      Ошибку не дает, сам по неграмотности всегда пишу
                      $this->Query1->close()
                      хотя полностью согласен что так правильнее
                      $this->Query1->active = False
                      Плохая привычка
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0317 ]   [ 15 queries used ]   [ Generated: 7.05.24, 07:59 GMT ]