Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Связь BDE c ADO  (Прочитано 18366 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Mirra88
Постоялец

ru
Offline Offline

« : 24-08-2011 01:55 » 

Уважаемые форумчане. Создала Builder-программу в которой из компонентов баз данных только ADOQuery, DBGrid и DataSource. И неожиданно столкнулась с тем, что пока не установила BDE на ПК без Builder эта программа у меня на этом ПК не заработала. Не помогал даже перенос dll-библиотек и других компонентов BDE в папку с программой. Но я везде читала, что ADO - одна из альтернатив BDE. А если исходить из этого моего опыта, то получается что в BDE есть "составные части" ADO, без которых ADO работать не может. Никто не знает в чём может заключаться причина этого парадокса?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 24-08-2011 07:34 » 

Mirra88, парадокса нет. ADO - альтернатива BDE, а не составная часть. Значит программа где-то использует BDE, или где-то указана зависимость программы от BDE.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Mirra88
Постоялец

ru
Offline Offline

« Ответ #2 : 25-08-2011 06:12 » 

Спасибо. Получив такой ответ, возникло у меня в голове одно предположение. Когда я делала программку, то начинала с BDE, но с ним была кодировка абра-кадабра, потому пришлось элементы BDE удалить и перейти к ADO. Вот я и подумала, а вдруг-да даже после удаления BDE-элементов, Builder сохраняет в своих тайниках какие-то ссылки на них. И сделала всё с нуля, т. е. чтоб BDE-элементы даже вообще никогда не касались формы моей программки. И всё теперь работает даже и без установленного BDE!
Вообще Builder свойственны некие глюки. Например с ADO ему свойственен такой глюк. Создашь новую программку с элементами ADOQuery, DBGrid и DataSource, всё правильно соединишь, а запрос не открывается, пишет о какой-то ошибке драйвера ODBC внешней базы данных. Ничего не изменяя в программке просто закроешь и откроешь Builder. Всё работает!
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 25-08-2011 06:17 » 

А подключение к БД ты активируешь?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mirra88
Постоялец

ru
Offline Offline

« Ответ #4 : 25-08-2011 06:34 » 

У меня в строке соединения прописывается имя ODBC-базы данных. Без этого программа вообще не запустится. А запрос активирую так:
 
Код:
Form1->ADOQuery1->SQL->Text="select * from smo"; 
 Form1->ADOQuery1->Prepared;
 Form1->ADOQuery1->Open();
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 25-08-2011 07:34 » 

Перед началом работы с БД я делаю так:

Код: (C++)
        // Подключение к БД
        adoconn->ConnectionString = "...";
        adoconn->Connected = true;

        // Активация запроса
        adoquery->SQL->Text = "...";
        adoquery->Active = true;
 

А в конце - так:

Код: (C++)
        // Дизактивация запроса
        adoquery->Active = false;

        // Отключение от БД
        adoconn->Connected = false;
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mirra88
Постоялец

ru
Offline Offline

« Ответ #6 : 26-08-2011 02:57 » new

Если использовать дополнительно компонент ADOConnection, то тогда такой код:
Код:
adoconn->ConnectionString = "...";
adoconn->Connected = true;
получается. Я до сих пор компонента ADOConnection не использовала, пользуясь вместо него свойством ConnectionString компонента ADOQuery.  А в нём adoconn->Connected = true не сделаешь, можно только adoquery->Active = truе. Но и добавление компонента  ADOConnection не избавило меня от "встроенного глюка" Builder6.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 26-08-2011 03:49 » 

Mirra88, а почему у меня нет этого "встроенного глюка"? Я тоже использую BCB6. Выкладывай уже код.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mirra88
Постоялец

ru
Offline Offline

« Ответ #8 : 26-08-2011 04:34 » 

Тогда я выложу самый "глючный" код. Тот который дома у меня работает, а на работе ошибку внешней базы выдаёт. Но и этот "глючный" вроде бы ничем не отличается от "нормальных".. Единственно, что у меня используется редактор полей, может быть он на новой машине как-то по другому запускается..

Код: (C++)
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   //Закомментирована 2 строки для варианта без редактора полей
   //Form1->ADOQuery1->SQL->Text = "Select OKATO, Punkt As  НасПункт, Centr As  ОблЦентр, RAION358 As  Район,  Dop69 As  Доп, StatusP As      ТипНасПункта from OKATOTFTAT ORDER BY Punkt";
   //Form1->ADOQuery1->SQL->Text = "Select * from OKATOTFTAT ORDER BY PUNKT";
   //Переключаюсь на русский
   LoadKeyboardLayout("00000419",KLF_ACTIVATE);
   //ADOQuery1->ConnectionString="Provider=MSDASQL.1;Persist Security Info=False;Data Source=OKATOTFTAT";
   //ADOQuery1->Active=true;
   //Описание флагов в заголовочном файле
   qwe=false;
   qwe1=false;
   qwe2=false;
   //вызывается, чтоб быстрый поиск быстрее реагировал на нажатие первой клавиши поиска в первый раз
   TForm1::DBGrid1KeyPress(DBGrid1, 'ё');
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  //Выход  
  if (ADOQuery1)
    ADOQuery1->Close();
  Form1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::KeySeek(const AnsiString asSearchVal)
{
  //Поиск
  if (qwe)//Если функцию вызвала не форма при открытии, а сам пользователь, то вывожу его символы на панель
  {
    pnlCaption->Caption = asSearch;
  }
  //Поиск и запись
  TLocateOptions loSearch;
  loSearch.Clear();
  //Игнорировать разницу реестра
  loSearch<<loCaseInsensitive;
  //ключ поиска
  loSearch<<loPartialKey;
  ADOQuery1->First();
  //Осуществляет поиск и делает запись активной (закомментирована строка для варианта без редактора полей)
  //НасПункт - поле по кот-рому ищу, 2-й параметр - что ищу, 3-й - опции
  //ADOQuery1->Locate("НасПункт", (Variant)asSearchVal, loSearch);
  ADOQuery1->Locate("PUNKT", (Variant)asSearchVal, loSearch);
  qwe1=true; //Программа ВОЗВРАЩАЕТСЯ в ловушку клавиатуры и ждёт нажатий клавиш теперь уже пользователем
}

void __fastcall TForm1::DBGrid1KeyPress(TObject *Sender, char &Key)
{
  //Обработчик события OnKeyPress для TDBGrid
  DWORD dwElapsedTime = 0;
  //GetTickCount() - время от начала
    dwElapsedTime = abs(GetTickCount() - dwLastPress);

  //abs(Key) - абсолютная величина целого, это на коды всех символов кроме кирилицы - это 1-й блок
  //на "красную" раскладку клавиатуры - 2-й блок, через || с первым. Ясно, что кроме кирилицы прих-ся перечислять через || другие красные символы
  if((( abs(Key) >= 0x20 && abs(Key) <= 0x7E) || ( abs(Key) >= 0xC0 && abs(Key) <= 0xFF) || abs(Key) == 0x80) ||((Key>='А')
      && (Key<='я')||(Key>='а')&&(Key<='я')||(Key =='ё')||(Key =='Ё') || Key == '№' || Key == ';' || Key == ':' || Key == '?'
      || Key == '/'  || Key == '"'))
  //В буфере какой-то символ
  {
    if(dwElapsedTime > 5000)
    {
    //если долго не нажимать, то буфер для поиска очищается
      asSearch = AnsiString(Key);
      //Весь след. блок из if нагорожен, чтобы не съедался первый символ если он нажат более чем через 5 сек. после открытия
      if (!qwe)//Програма уже ждёт ПЕРВОГО символа от пользователя, а не введённого "формой"
        if (qwe1)//если программа зашла в эту ловушку не менее чем второй раз (в первый раз её вводила форма при инициализации)
          if (!qwe2)//программа действительно зашла сюда ИМЕННО второй раз, ПО СИМВОЛУ ПОЛЬЗОВАТЕЛЯ
            qwe=true;//символ уже сам пользователь нажал!
    }
    else
    //если нажимать быстро, то символы плюсуются (кроме вызова F формой при первом открытии)
    {
      if (!qwe) //Нажимаю символ не подождав 5 сек после открытия программы
      {
          asSearch = AnsiString(Key);
          qwe=true; //теперь функцию будет вызывать не форма, а сам пользователь
      }
      else //Если F вызвана нажатием клавиши пользователем,
      {
        asSearch += AnsiString(Key);
      }
    }//конец блока "если нажимать быстро"
    //Переводит в верхний регистр
    asSearch = AnsiUpperCase(asSearch);
    KeySeek(asSearch);
    dwLastPress = GetTickCount();
  }
  //В буфере (нажат) не символ
  else
  {
    //Нажат не символ, а забой
    if(abs(Key) == 0x7F || abs(Key) == 0x08)
    //Если 0x7F убрать, то при забое стирает на панели сразу всё, а не посимвольно
    {
      if(asSearch.Length() < 2 || dwElapsedTime > 5000)//если все символы убрала забоем или долго медлю
      {
        asSearch = "";
        KeySeek(asSearch);
      }
      else//если есть ещё более одного символа, чтоб их убрать забоем
      {
        asSearch.SetLength(asSearch.Length()-1);
        KeySeek(asSearch);
        dwLastPress = GetTickCount();
      }
    }
    //Нажат не символ, и не забой
    else
    {
      if(Key == VK_ESCAPE)
      //Нажат не символ, а ESCAPE
      {
        asSearch = "";
        KeySeek(asSearch);
      }
      else
      //Нажат не символ, и не забой, и не ESCAPE, а всё остальное
        dwLastPress = 0;
    }
  }
  if (qwe)//Если функцию вызвала не форма при открытии, а сам пользователь
  {
    pnlCaption->Caption = asSearch;//Без этой строки не исчезает последний, убранный забоем, символ и таблица с ним вначале
  }
}
« Последнее редактирование: 26-08-2011 05:58 от RXL » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 26-08-2011 05:57 » 

Код: (C++)
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  //Выход  
  if (ADOQuery1)
    ADOQuery1->Close();
  Form1->Close();
}

От чего такая странная проверка? ADOQuery1 — указатель, а значит данная проверка — только на NULL и не NULL. Я так понимаю, это компонент, который ты в редакторе формы разместила на Form1. Значит, созданием и удалением объекта, на который ADOQuery1 указывает, ты не управляешь.
Проверяй свойство State.

Код: (C++)
    if (ADOQuery1->State != dsInactive)
        ADOQuery1->Close();
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mirra88
Постоялец

ru
Offline Offline

« Ответ #10 : 26-08-2011 14:09 » 

Спасибо. Закрыла и вот так:
 
Код:
if (ADOQuery1->State != dsInactive)
        ADOQuery1->Close();
От глюка это не избавило.. Причём, дома и на работе всё это несколько по разному выглядит (последнее, конечно, уже не только про "встроенный глюк"). Например, тот же приведённый мною выше код дома из Builder6 нормально запускается, а на работе нормально запускается только СФОРМИРОВАННЫЙ ДОМА exe-ник. Хотя Builder я и там и там устанавливала с одного дистрибутива. А вот операционные системы разные, дома Windows2003, а на работе  Windows XP. Возможно со временем, когда у меня накопится больше практики, то я смогу разгадать эту загадку. Пока же я просто вынуждена её обходить. И благо, что у меня есть такая возможность. Ну и ещё я могу строить предположения, чисто интуитивные. Подозреваю редактор полей.
« Последнее редактирование: 26-08-2011 14:18 от Mirra88 » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 26-08-2011 16:17 » 

Mirra88, в коде, что ты привела, больше ничего и нету...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mirra88
Постоялец

ru
Offline Offline

« Ответ #12 : 26-08-2011 16:20 » 

А там действительно больше ничего и нету. Но редактор-то полей (ширина, русские надписи на дисплее и пр.) настраивается не в коде, а на форме.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines