2013-08-21 2 views
0

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это устаревший код, и я просто не могу переписать все (верьте мне, я бы хотел).Параметры 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, но ничего не работает. Есть идеи?

ВАЖНО: Я conecting непосредственно через BDE и не с использованием BDE -> ODBC -> подход DB2.

EDIT: окружающей среды информация:

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". 
+0

Извините за то, что может быть тупым q., Но если QueryA работает, почему бы просто не построить Sql.Text во время выполнения и вообще избежать параметров? Кажется, я помню, что такие проблемы, как ваша, не были неслыханны с BDE. – MartynA

+0

@ Мартин, избегая параметров путем ручного построения запросов с данными в них, является тем, что приводит к * SQL-инъекциям * уязвимостям. –

+0

@MartynA Проблема в том, что все приложение (и оно большое) опирается на параметры ... просто невозможно изменить все ... Кроме того, как сказал Роб Кеннеди, это огромная уязвимость. –

ответ

0

Ну, похоже, нет решения для этой проблемы. Как указатель @TOndrej и @DavidG, this QC issue никогда не решался, никто, кажется, не знает, как обойти его.

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

0

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

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

+0

Просто попытался создать параметр вручную, но не повезло ... похоже, что нет решения для этого :( –

1

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

+0

Хорошая идея! К сожалению, не работает. Попробовал оба?'(с ручным созданием параметра) и ':?', по-прежнему та же ошибка. –

+0

Крысы жаль, что это не сработало – DavidG

+0

? используется на других языках (семья C и Java?), Delphi всегда использовала: для обозначения параметров. –

0

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

Смежные вопросы