У меня возникла странная проблема с использованием компонента 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 лет назад, и они переходят на веб-интерфейс пользователя, но это все еще строится. До тех пор мне нужно внести необходимые изменения/обновления в рамках моей работы.