У меня есть объект 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.