Почему мой параметризованный запрос с полями Integer не работает? - PullRequest
4 голосов
/ 12 июля 2010

У меня есть объект TQuery, указывающий на базу данных dBase, и мне интересно, как мне следует параметризовать мой оператор вставки.

Следующий INSERT-запрос будет нормально работать с qry.ExecSQL:

qry.SQL.Text :=
  'INSERT INTO KUNDE ' +
  '(FNAVN, ENAVN, INSTNR) ' +
  'VALUES ' +
  '(:FirstName, :LastName, ' + IntToStr(InstructorNo) + ' )';

qry.ParamByName('FirstName').AsString := FirstName;
qry.ParamByName('LastName').AsString := LastName;

Но эта полностью параметризованная версия завершается с ошибкой BDE «Введите mismtach в выражении»:

qry.SQL.Text :=
'INSERT INTO KUNDE ' +
'(FNAVN, ENAVN, INSTNR) ' +
'VALUES ' +
'(:FirstName, :LastName, :InstructorNo)';

qry.ParamByName('FirstName').AsString := FirstName;
qry.ParamByName('LastName').AsString := LastName;
qry.ParamByName('InstructorNo').AsInteger := InstructorNo;

Я пробовал различные варианты назначения InstructorNo, например .Value вместо AsInteger, но все они выдают одну и ту же ошибку.

Столбец INSTNR определен как Числовой, maxwidth = 4, десятичные дроби = 0. Значение, которое я пытаюсь присвоить, равно 999.

Параметр функции InstructorNo имеет тип Integer.

Это какая-то известная ошибка в BDE?

РЕДАКТИРОВАТЬ: я частично понял это

Я могу преодолеть эту проблему в некоторых полях, используя .AsSmallInt вместо .AsInteger, однако в другом числовом поле ни Integer, SmallInt, ни Word не работают. Единственным выходом было вручную вставить значение в оператор SQL. Что такого особенного в числовом поле dBase с maxwidth = 6?

ДРУГОЕ РЕДАКТИРОВАТЬ: Наконец-то получил

Мне пришлось использовать .AsFloat, чтобы получить сохраненное значение. Хотя немного странно использовать поле типа float для CustomerID.

1 Ответ

1 голос
/ 22 июля 2010

При назначении значения через .AsInteger параметр помечается как 4-байтовое целое число.
Это не помещается в 2-байтовое целое число dBase (4-позиционное целое число составляет 2 байта).сообщение об ошибке.

- jeroen

...