2016-03-09 8 views
1

У меня возникла странная проблема с использованием компонента TADOQuery.ADOQuery на C++ Builder 6 и Windows 7 64bit

В настоящее время я работаю в месте, где они используют приложения Borland C++ Builder, которые запускаются на виртуальной машине Windows XP. Поэтому мы хотим перейти на Windows 7 и обслуживать его как терминал, чтобы сотрудники могли получать новые компьютеры с Windows 10 без необходимости создавать виртуальную машину Win XP на каждой машине.

В настоящее время приложение использует компоненты BDE и отлично работает на XP. Мы создали 64-битную виртуальную машину Win7 для тестирования, а также установили необходимый драйвер и т. Д., Но BDE просто не сработает. Когда я пытаюсь войти в систему через SQL Explorer, который поставляется с Borland, он просто зависает. Он отправляет запрос, но не получает ответа. Я потратил больше недели на то, чтобы отладить эту проблему, но никуда не денутся.

В любом случае, я отказался от BDE и хотел попробовать перейти на ADO. Поэтому я начал с простого создания TDBGrid и заполнил его данными с помощью компонентов ADO. Он отлично работал как на XP, так и на Win7! Поэтому теперь я пытаюсь преобразовать компоненты BDE приложений (TDataBase, TQuery и т. Д.) В компоненты ADO.

Я столкнулся с интересной проблемой при попытке использовать параметры. Вот пример запроса:

SELECT t1.SEC_CODE, t1.CODE, t1.CTRL_NUM, t1.CHECK_CODE, 
t1.CHECK_NO, t1.CLIENT_ID, t1.AMOUNT, t1.TRANS_NO, decode(t2.prefix,null,t2.name,t2.name||', '||t2.prefix) as fullName, 
t1.ENTRY_DATE, t1.DEPOSIT_DATE, t1.ACCT_COMMENT, t2.NAME, t2.PREFIX 
FROM ACCOUNTING.ACCT_CHECK_IN t1, OISC.CLIENT t2 
WHERE 
(:BEN =1 OR (:BEN =0 AND t1.ENTRY_DATE=:DATE) 
OR (:BEN =2 AND t1.DEPOSIT_DATE IS NOT NULL) 
OR (:BEN =3 AND t1.DEPOSIT_DATE IS NULL)) AND 
(:ALEX =1 OR (:ALEX =0 AND t1.ENTRY_DATE>=:DATE1 AND 
t1.ENTRY_DATE<=:DATE2) OR (:ALEX =2 AND t1.DEPOSIT_DATE>=:DATE1 
AND t1.DEPOSIT_DATE<=:DATE2)) 
AND T2.CLIENT_ID(+)=T1.CLIENT_ID 

ORDER BY t1.SEC_CODE, t1.CHECK_CODE, fullName, t1.check_no 

Пожалуйста, не обращайте внимание на имена параметров, это немного смешно для меня, но вы, ребята, не смогут подключиться.

Первый вопрос заключается в том, что, хотя некоторые параметры имеют одно и то же имя, ADO рассматривает их как индивидуальные параметры! Так что, если я это сделать:

checkload1->Parameters->ParamByName("BEN")->Value=0 

ADO не заменит каждое вхождение «BEN» с 0, и я в конечном итоге с набором результатов 0 записей! Вместо этого я использую это:

checkload1->Parameters->Items[0]->Value = 0; // BEN param 
checkload1->Parameters->Items[1]->Value = 0; 
checkload1->Parameters->Items[3]->Value = 0; 
checkload1->Parameters->Items[4]->Value = 0; 

В принципе, заменяя каждый параметр «BEN» на 0 на основе индекса параметра.

Это приносит мне результаты, но не сразу.

Так вот как это работает: приложение представляет собой пользовательский интерфейс на основе дерева. Существует узел, который говорит «Сегодняшние проверки», и он отображает сегодняшние чеки, когда он расширяется. Отлично, теперь это отлично работает с BDE, и я только присваиваю значение параметра один раз, и он автоматически заменяет его везде, где он видит «BEN» и т. Д.

При использовании компонентов ADO я расширяю узел «Сегодняшние проверки» и код работает, загружая параметры, активируя компонент запроса, и я не получаю никаких результатов! Таким образом, узел остается рухнувшим. Если я снова нажму на знак +, чтобы развернуть дерево, он загружает чеки! И он будет загружать их каждый раз после этого.

Таким образом, в приложении есть опция даты, которая по умолчанию соответствует сегодняшней дате. Если я изменю это на вчерашнюю дату, я все равно получаю сегодняшние чеки ... Это похоже на то, что параметры не обновляются. И если я попытаюсь начать с другой даты в самом начале, я не получаю никаких результатов! Он принесет результаты с сегодняшней датой, но после этого он не примет другую дату.

Я отлаживал код, и даты меняются, но по какой-то причине параметры не меняются.Вот мой кодовый блок:

checkload1->Filter="" ; 
checkload1->Filtered=false ; 
switch(params) 
    { 
    case 0: checkload1->Parameters->Items[0]->Value = 1; // BEN param 
      checkload1->Parameters->Items[1]->Value = 1; 
      checkload1->Parameters->Items[3]->Value = 1; 
      checkload1->Parameters->Items[4]->Value = 1; 
      // ALEX Param 
      checkload1->Parameters->Items[5]->Value = 0; 
      checkload1->Parameters->Items[6]->Value = 0; 
      checkload1->Parameters->Items[9]->Value = 0; 
      checkload1->SQL->Strings[13] = "AND t1.CHECK_STATUS NOT IN ('Refunded', 'Posted') "; 
      break ; 
    case 1: checkload1->Parameters->Items[0]->Value = 0; // BEN param 
      checkload1->Parameters->Items[1]->Value = 0; 
      checkload1->Parameters->Items[3]->Value = 0; 
      checkload1->Parameters->Items[4]->Value = 0; 
      checkload1->Parameters->ParamByName("DATE")->Value=FormatDateTime("dd-mmm-yyyy", Date()) ; 
      checkload1->SQL->Strings[13] = " "; 
      break ; 
    case 2: checkload1->Parameters->Items[0]->Value = 2; // BEN param 
      checkload1->Parameters->Items[1]->Value = 2; 
      checkload1->Parameters->Items[3]->Value = 2; 
      checkload1->Parameters->Items[4]->Value = 2; 
      //ALEX param 
      checkload1->Parameters->Items[5]->Value = 2; 
      checkload1->Parameters->Items[6]->Value = 2; 
      checkload1->Parameters->Items[9]->Value = 2; 
      checkload1->SQL->Strings[13] = "AND t1.CHECK_STATUS IN ('Deposited') "; 
      break ; 
    case 3: checkload1->Parameters->Items[0]->Value = 3; // BEN param 
      checkload1->Parameters->Items[1]->Value = 3; 
      checkload1->Parameters->Items[3]->Value = 3; 
      checkload1->Parameters->Items[4]->Value = 3; 
      //ALEX param 
      checkload1->Parameters->Items[5]->Value = 0; 
      checkload1->Parameters->Items[6]->Value = 0; 
      checkload1->Parameters->Items[9]->Value = 0; 
      checkload1->SQL->Strings[13] = "AND t1.CHECK_STATUS IN ('Held') "; 
      break ; 
    } 
if(!mainform->date1->Checked){ 
checkload1->Parameters->Items[5]->Value = 1; 
checkload1->Parameters->Items[6]->Value = 1; 
checkload1->Parameters->Items[9]->Value = 1; 
} 
checkload1->Parameters->Items[7]->Value = FormatDateTime("dd-mmm-yyyy", fromdate); 
checkload1->Parameters->Items[10]->Value = FormatDateTime("dd-mmm-yyyy", fromdate); 
checkload1->Parameters->Items[8]->Value = FormatDateTime("dd-mmm-yyyy", todate); 
checkload1->Parameters->Items[11]->Value = FormatDateTime("dd-mmm-yyyy", todate); 

if(filters != "") checkload1->SQL->Strings[12] = filters; 
else checkload1->SQL->Strings[12]=" " ; 
checkload1->Prepared = true; 
checkload1->Active=true ; 

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

Я знаю, что это древний материал, но эти программы были написаны буквально 15-20 лет назад, и они переходят на веб-интерфейс пользователя, но это все еще строится. До тех пор мне нужно внести необходимые изменения/обновления в рамках моей работы.

ответ

1

Хорошо, я получил это, чтобы работать!

Для тех, кто борется с BDE для работы с Windows 7 64 бит, вот решение! Помните, что база данных, с которой я имею дело, - это приложения Oracle 8i и Borland C++, созданные с помощью C++ Builder 6.

Следуйте фотографиям и стрелкам. Я попытался поместить каждую фотографию с собственным комментарием, но затем этот сайт сказал, что я не могу разместить более двух ссылок ... К черту их, поэтому я поставил все на одну картинку.

Follow the arrows and hopefully you can connect it with my comments below.

Это TQuery, например, ищет bnetdata как базы данных. Отлично, на следующем рисунке мы добавляем компонент ADOConnection

Щелкните по выделенной строке подключения.

Выберите строку подключения и нажмите кнопку «Создать».

Выберите выделенный поставщик и нажмите кнопку Далее.

Проверьте имя источника данных источника данных, затем щелкните стрелку, чтобы выбрать его. Обратите внимание, что позднее вы введете имя пользователя и пароль и установите флажок для сохранения пароля.

Выберите тот же источник данных, что и компоненты BDE. Обратите внимание, что это один из источников под вашим системным DSN в ODBC Administrator. Если его там нет, то создайте его.

Обратный отсбор от администратора ODBC. Обратите внимание, что это все еще среда XP. Вам понадобится создать тот же источник данных (bnetdata в моем случае) в машине Windows 7.

Теперь нажмите на расширенный и проверьте параметр readwrite из списка.

После того, как вы нажмете OK на компоненте ADOConnection, как вы видите сейчас в инспекторе объектов. Посмотрите на выделенные области. Теперь нам нужно установить свойство connected в true. Когда вы это сделаете, он попросит вас войти в базу данных. Введите имя пользователя и пароль и нажмите «ОК». Теперь свойство соединения станет истинным. После этого вам необходимо установить для свойства LoginPrompt значение false. Теперь нажмите «Сохранить» в проекте.

Итак, у вас есть компонент базы данных BDE, нажмите на него, а затем очистите имя псевдонима и имя драйвера, а затем поместите свое имя базы данных в свойство databaseName (в моем случае это bnetdata).

Сохраните проект и скомпилируйте его в XP. Скопируйте приложение и вставьте его в машину Windows 7 и дважды щелкните по нему, и он будет работать! Я успешно конвертировал все приложения для работы в Windows 7. Самая сложная задача заключалась в том, чтобы установить Borland и заставить Windows 7 распознавать драйвер ODBC Oracle на вкладке «Драйверы» в ODBC Administrator.

Опять же, SQL Explorer, который поставляется с установкой Borland, не будет работать.Таким образом, мне все равно придется разрабатывать в моей Windows XP VM, но пользователи могут использовать приложение в Windows 7 VM, которое служит терминалом на сервере Windows ... Работает для меня !!

Надеюсь, это поможет кому-то!

EDIT:

Я также попытался Microsoft OLE DB Provider для Oracle в ADOConnection и он также работал. Не видел ощутимого влияния на скорость или производительность. Оба, похоже, действуют одинаково. Я просто удивлен, как добавление компонента ADOConnection позволило приложению подключиться к базе данных и работать так же, как в XP!

Также, чтобы очистить вещи, вам не нужно будет менять компоненты BDE в приложении. Необходимо только добавить ADOConnection, а все остальные компоненты остаются неизменными (компоненты BDE). Я пытался конвертировать в компоненты ADO, но больше не нужно.

Microsoft OLE DB Provider for Oracle