C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Опять про Stored Procedure., Вызов из CBuildera.
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

Вернуться в Работа с базами данных в C++Builder