| 
| 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
 |  
|  |  |