У меня странная проблема с использованием TADOQuery
составная часть.
В настоящее время я работаю в месте, где они используют приложения 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 лет назад, и они переходят на веб-интерфейс пользователя, но он все еще строится. До этого мне нужно внести необходимые изменения / обновления как часть моей работы.
Хорошо, я получил это на работу!
Для тех, кто борется с BDE для работы на 64-битной Windows 7, вот решение! Помните, что база данных, с которой я имею дело, — это приложения Oracle 8i и Borland C ++, созданные с помощью C ++ Builder 6.
Следите за фото и стрелками. Я пытался разместить каждую фотографию со своим собственным комментарием, но затем этот сайт сказал, что я не могу опубликовать более 2 ссылок … К черту их, поэтому я поместил все на одну фотографию.
Этот TQuery, например, ищет bnetdata в качестве базы данных. Отлично, на следующем рисунке мы добавляем компонент ADOConnection
Нажмите на строку подключения, которая выделена.
Выберите использовать строку подключения и нажмите на сборку.
Выберите выделенного провайдера и нажмите «Далее».
Проверьте использование имени источника данных, затем нажмите стрелку, чтобы выбрать его. Обратите внимание, что позже вы введете имя пользователя и пароль и отметите возможность сохранения пароля.
Выберите тот же источник данных, который используют компоненты BDE. Обратите внимание, что это один из источников в системном DSN администратора ODBC. Если его там нет, то создайте его.
Вот снимок от администратора ODBC. Обратите внимание, что это все еще среда XP. Вам нужно будет создать тот же источник данных (в моем случае bnetdata) на машине с Windows 7.
Теперь нажмите на «Дополнительно» и выберите опцию «readwrite» из списка.
После того, как вы нажмете OK на компоненте ADOConnection, как вы теперь видите в инспекторе объектов. Посмотрите на выделенные области. Теперь нам нужно установить для подключенного свойства значение true. Когда вы это сделаете, он попросит вас войти в базу данных. Введите имя пользователя и пароль и нажмите ОК. Свойство подключения теперь станет истинным. После этого вам нужно установить для свойства LoginPrompt значение false. Теперь нажмите сохранить в проекте.
Допустим, у вас также есть компонент базы данных BDE, нажмите на него, затем очистите псевдоним и имя драйвера, а затем поместите имя вашей базы данных в свойство databaseName (в моем случае это bnetdata).
Сохраните проект и скомпилируйте в XP. Скопируйте приложение и вставьте его в компьютер с Windows 7, дважды щелкните по нему, и оно будет работать! Я успешно преобразовал все приложения для работы в Windows 7. Самым сложным было установить Borland и заставить Windows 7 распознавать драйвер Oracle ODBC на вкладке «Драйверы» в администраторе ODBC.
Опять же, SQL Explorer, который поставляется с установкой Borland, не будет работать. Итак, мне все еще нужно будет разрабатывать свою виртуальную машину Windows XP, но пользователи могут использовать приложение в виртуальной машине Windows 7, которая служит терминалом на сервере Windows … Работает для меня !!
Надеюсь, это поможет кому-то!
РЕДАКТИРОВАТЬ:
Я также попробовал Microsoft OLE DB Provider для Oracle в ADOConnection, и он также работал. Не видел ощутимого влияния на скорость или производительность. Оба, кажется, работают одинаково. Я просто удивлен, как добавление компонента ADOConnection позволило приложению подключаться к базе данных и работать так же, как в XP!
Также, чтобы прояснить ситуацию, вам не нужно менять компоненты BDE в приложении. Нужно только добавить ADOConnection и все остальные компоненты остаются прежними (компоненты BDE). Я пытался перейти на использование компонентов ADO, но в этом больше нет необходимости.
Других решений пока нет …