Параметры BDE, DB2 и TQuery

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: это устаревший код, и я просто не могу все переписать (поверьте мне, я бы хотел).

Я пытаюсь запустить устаревшее приложение Delphi, которое использует BDE и DB2, но я просто не могу выполнять параметризованные запросы.

QueryA.SQL.Text := 'select count (*) from syscat.tables where tabname = ''Foo''';
QueryA.Open; // works as expected

QueryB.SQL.Text := 'select count (*) from syscat.tables where tabname = :name';
QueryB.ParamByName('name').ParamType := ptInput;
QueryB.ParamByName('name').DataType := ftString;
QueryB.ParamByName('name').AsString := 'Foo';
QueryB.Open; // Error: "Operation not applicable"

QueryC.SQL.Text := 'select count (*) from syscat.tables where tabname = :name';
QueryC.ParamByName('name').ParamType := ptInput;
QueryC.ParamByName('name').DataType := ftString;
QueryC.ParamByName('name').Clear;
QueryC.Open; // Surprisingly, no erros here

Теперь ... Почему образец QueryB не работает? Я пробовал все, что мог вообразить: использовать Value вместо AsString, вызывать Prepare и UnPrepare, но, похоже, ничего не работает. Любые идеи?

ВАЖНО: я подключаюсь напрямую через BDE и не использую подход BDE -> ODBC -> DB2.

РЕДАКТИРОВАТЬ: Информация о среде:

Delphi Version: 5, UpdatePack 1
BDE: 5.01
OS: Windows 7 SP1, x64

D:\SQLLIB\BIN>db2level
DB21085I  Instance "DB2" uses "32" bits and DB2 code release "SQL09052" with
level identifier "03030107".
Informational tokens are "DB2 v9.5.201.346", "s080911", "WR21421", and Fix Pack "2a".
Product is installed at "D:\SQLLIB" with DB2 Copy Name "DB2COPY1".

person Rafael Ibraim    schedule 21.08.2013    source источник
comment
Извините за тупой вопрос, но если QueryA работает, почему бы просто не создать Sql.Text во время выполнения и вообще не избегать параметров? Я, кажется, припоминаю, что проблемы, подобные вашей, не были чем-то неслыханным с BDE.   -  person MartynA    schedule 21.08.2013
comment
@Martyn, избегание параметров путем ручного построения запросов с данными в них - вот что приводит к уязвимостям SQL-инъекций.   -  person Rob Kennedy    schedule 21.08.2013
comment
@MartynA Проблема в том, что все приложение (а оно большое) зависит от параметров ... изменить все просто невозможно ... Кроме того, как сказал Роб Кеннеди, это огромная уязвимость.   -  person Rafael Ibraim    schedule 21.08.2013
comment
Извините!   -  person Ondrej Kelle    schedule 21.08.2013
comment
@TOndrej Ага, я видел это, но я все еще надеюсь, что кто-то здесь знает обходной путь для этой ситуации ...   -  person Rafael Ibraim    schedule 21.08.2013


Ответы (4)


Имеется отчет о дефектах http://qc.embarcadero.com/wc/qcmain.aspx?d=12905 для Delphi 7, который кажется почти таким же. Я думаю только о том, что произойдет, если вы замените: name знаком вопроса. "?" В параметрах Java db2 используется знак? Вам нужно будет использовать параметры как позицию

person DavidG    schedule 22.08.2013
comment
Хорошая идея! К сожалению, не работает. Пробовал оба ?' (with manual parameter creation) and :? ', все та же ошибка. - person Rafael Ibraim; 22.08.2013
comment
? используется в других языках (семейство C и Java?), Delphi всегда использовал: для обозначения параметров. - person Matt Allwood; 23.08.2013
comment
Обратите внимание, что QualityCentral теперь закрыт, так что вы можете Больше нет доступа к qc.embarcadero.com ссылкам. Если вам нужен доступ к старым данным QC, посмотрите QCScraper. - person Remy Lebeau; 09.06.2017

Я бы попытался проверить или заменить Params с помощью TQuery.Params. Например, вы можете вызвать TQuery.Params.Clear, чтобы удалить все параметры, а затем вызвать TQuery.Params.CreateParam, чтобы создать параметр и посмотреть, работает ли он и какое сообщение вы получите. Или вы можете использовать автоматическое создание параметров, как вы есть, и проверить свойства TQuery.Params.Items

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

person nachbar    schedule 22.08.2013
comment
Просто попытался создать параметр вручную, но не повезло ... похоже, для этого нет решения :( - person Rafael Ibraim; 22.08.2013

Не используется BDE, но с запросами ADO информация о типе параметра должна заполняться базой данных. Это происходит только в том случае, если строка подключения была установлена ​​(напрямую или с помощью объекта TADOConnection). Попробуйте удалить вызовы ParamType и DataType и убедитесь, что соединение установлено.

person Matt Allwood    schedule 23.08.2013

Что ж, похоже, у этой проблемы нет решения. Как видно из указателя @TOndrej и @DavidG, эта проблема контроля качества так и не была решена. и, кажется, никто не знает, как это обойти.

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

person Rafael Ibraim    schedule 23.08.2013