Fred |
Отправлено: 19.10.2003, 12:37 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 19
|
Привет уважаемым вундеркиндам.
Сможет ли кто мне подсказать как заставить работать stored procedure из программы. Процедура такая:
create procedure New_Procedure ( FN CHAR(30) )
as
begin
insert into TCOMPANY ( FNAME ) values (:FN );
suspend;
end;
Когда я запускаю процедуру из IB Express, она нормально отрабатывает. Когда запускаю из программы:
StoredProc1->ParamByName("FN")->AsString = "FFFFFF";
StoredProc1->ExecProc();
в таблицу вставляется пустая строка. Параметр FN игнорируется.
Посмотрел несколько аналогичных тем на форуме, не помогло. Функция все равно не работает. Сможет ли кто подсказать где тут собака зарыта ?!
С уважением, Fred.
|
|
Admin |
Отправлено: 19.10.2003, 14:27 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
Возникает несколько вопросов.
В каком диалекте база 1-3 (по тексту процедуры я так понимаю 1)
и с помощью каких компонентов получаете к ней доступ (StoredProc1 ?)
Или может что-то у вас с транзакциями.
Также посмотрите что у вас в свойстве Params у
компонента IBStoredProc1, есть ли там этот параметр FN
и правильно ли у него указаны DataType = ftString
и ParamType = ftInput, правильно-ли указана процедура
в свойстве StoredProcName.
--
CODE |
CREATE PROCEDURE "MyProc" (FN VARCHAR(50))
AS
begin
insert into "MyTable" ("Name") values (:"FN");
suspend;
end
--
IBStoredProc1->ParamByName("FN")->AsString = "FFFFFF";
IBStoredProc1->ExecProc();
IBStoredProc1->Close();
IBTransaction1->CommitRetaining();
IBTable1->Refresh();
|
|
|
Fred |
Отправлено: 19.10.2003, 15:01 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 19
|
Спасибо за подсказку, Владимир. Замечательно отработало. Мне не хватало функции StoredProc1->Close(); Извиняюсь что поднял столь бестолковый вопрос.
Кстати, а чем отличается диалект 1 от диалекта 3 ? |
|
Admin |
Отправлено: 20.10.2003, 09:45 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
В IB 6 появилось несколько расширений, как SQL так и типов данных,
которые поддерживаются при помощи диалектов.
Диалект 1 — базы данных 4.x или 5.x, "импортированные" в 6.0
посредством backup в 4.x/5.x и restore в 6.0. Не содержат никаких
отличий от 5.x.
Диалект 2 — предназначен для проверки возможности перевода баз
данных диалекта 1 в диалект 3.
Диалект 3 — "родной" формат IB 6, поддерживающий INT6, DATE, TIME,
TIMESTAMP и прочие расширения.
Таблица отличий диалектов (by Dave Shnepper)
SQL Item |
Dialect 3 |
Dialect 1 ** |
DATE |
Только дата |
Дата и время (Timestamp) |
TIMESTAMP |
Дата и время |
Дата и время (для v.6.x только) |
TIME |
только время |
Ошибка |
"" |
имя поля, таблицы, и т.п. |
строковая константа |
Точность: 1/3 = |
0 |
0.3333333... (double precision) |
NUMERIC(11,*) |
64 bit int |
double precision |
Диалект 1 в версии 6 отличается от версии 5.x поддержкой следующих
ключевых слов: TIMESTAMP, TIME, EXTRACT, YEAR, MONTH, DAY, WEEKDAY,
HOUR, MINUTE, SECONDS, ?TYPE?, CURRENT_DATE, CURRENT_TIME,
CURRENT_TIMESTAMP. Т.е. использование этих ключевых слов в
качестве идентификаторов полей, таблиц и других объектов будет
приводить к ошибке.
примечание: Firebird имеет расширенный список зарезервированных
слов. Список отличий Firebird от Interbase см.
http://www.sedinko.ru/ib/doc10.php#fbdiff
Кроме этого в диалекте 3 не поддерживается автоматическая
конвертация типов в выражениях. Например, если раньше в SQL можно
было написать 1+'3' и получить ответ 4, то в диалекте 3 будет выдано
сообщение об ошибке.
Более подробно диалекты описаны здесь. Работа с большими NUMERIC
и DECIMAL очень подробно описана в документе в документе. Для облегчения
перехода с диалекта 1 на диалект 3 как минимум рекомендуется не
использовать строки в двойных кавычках.
Отредактировано Admin — 20/10/2003, 11:07
|
|
|