ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это устаревший код, и я просто не могу переписать все (верьте мне, я бы хотел).Параметры 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".
Извините за то, что может быть тупым q., Но если QueryA работает, почему бы просто не построить Sql.Text во время выполнения и вообще избежать параметров? Кажется, я помню, что такие проблемы, как ваша, не были неслыханны с BDE. – MartynA
@ Мартин, избегая параметров путем ручного построения запросов с данными в них, является тем, что приводит к * SQL-инъекциям * уязвимостям. –
@MartynA Проблема в том, что все приложение (и оно большое) опирается на параметры ... просто невозможно изменить все ... Кроме того, как сказал Роб Кеннеди, это огромная уязвимость. –