Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» InterBase и FireBird: вопросы по работе и их решение

Автор: DroN_S
Дата сообщения: 17.11.2005 21:52
Проблема в следующем:
пишу вот такой вот запрос

Код:
INSERT INTO Trener(FIO, ZVANIE,ADRES,TELEFON,NVS)
VALUES(:FIO,:ZVANIE,:ADRES,:TELEFON,:NVS);
Автор: vndovr
Дата сообщения: 17.11.2005 22:31
Как устанавливаешь значение для поля NVS перед выполнением запроса - код приведи
Автор: DroN_S
Дата сообщения: 17.11.2005 22:38
vndovr

Цитата:
Как устанавливаешь значение для поля NVS перед выполнением запроса - код приведи

какое значение?
Никакого значения я не привожу..
NVS связа с таблицей VID_SPORTA, а в таблице VID_SPORTA NVS primary key

Добавлено:
могу привести структуру таблиц, если необходимо...
Автор: vndovr
Дата сообщения: 17.11.2005 22:51
Перед вызовом запроса ты должен задать параметры - у тебя параметризованный запрос - этот кусок кода интересует.
У тебя поле NVS - primary key - оно не может быть NULL. В запросе ты не устанавливаешь для него никакого значение, т.е. оставляешь его NULL - соответственно это вызывает ошибку.
Ты должен либо перед выполнением запроса задать значение для NVS либо, если значение должно автоматически генерироваться - тебе нужно написать триггер.
Автор: DroN_S
Дата сообщения: 17.11.2005 23:09
vndovr
тригер написан

Код:
set term !! ;

CREATE trigger VID_SPORTA1 for VID_SPORTA
after update
as
begin
if(old.NVS<>new.NVS) then
update TRENER
set NVS=new.NVS
where NVS=old.NVS;
end!!
Автор: vndovr
Дата сообщения: 17.11.2005 23:25
Так.
У тебя есть таблица. Ты вставляешь в нее запись используя запрос INSERT INTO Trener(FIO, ZVANIE,ADRES,TELEFON,NVS) VALUES(:FIO,:ZVANIE,:ADRES,:TELEFON,:NVS); с помощью компонента IBQuery.

NVS у тебя primary key.

Если он у тебя задается в программе, то перед выполнением запроса (IBQuery.ExecSQL) ты должен задать для него значение используя для этого (к примеру c++ builder)

Код:
...
IBQuery->ParamByName("NVS")->AsInteger = ....
IBQuery->ExecSQL();
Автор: DroN_S
Дата сообщения: 17.11.2005 23:47
vndovr

Код:
CREATE GENERATOR TRENERGEN!!
SET GENERATOR TRENERGEN TO 0!!

CREATE TRIGGER TRENER1 FOR TRENER
BEFORE INSERT
AS
BEGIN
NEW .NT = GEN_ID (TRENERGEN, 1);
END!!
Автор: Kitayskiy_svarshik
Дата сообщения: 18.11.2005 11:30
Приведи структуру таблицы и код, которым запускаешь IBQuery,
а то ничё не понятно..
Автор: DroN_S
Дата сообщения: 18.11.2005 14:08
Kitayskiy_svarshik
вот код таблицы TRENER

Код:
CREATE table VID_SPORTA(
NVS integer not null primary key,
NAZVANIE varchar(40));


CREATE table TRENER(
NT integer not null primary key,
FIO varchar(40),
ZVANIE varchar(30),
ADRES varchar(40),
TELEFON numeric(9),
NVS integer not null references VID_SPORTA);
Автор: Kitayskiy_svarshik
Дата сообщения: 18.11.2005 18:27
А в клиенте ты так запись добавляешь?


Код:
IBQuery->SQL.Text = "INSERT INTO Trener(FIO, ZVANIE,ADRES,TELEFON,NVS) VALUES(:FIO,:ZVANIE,:ADRES,:TELEFON,:NVS)"

IBQuery->ParamByName ("FIO")->AsString = "Semin";
IBQuery->ParamByName ("ZVANIE")->AsString = "trener";
IBQuery->ParamByName ("ADRES")->AsString = "Cherkizovo";
IBQuery->ParamByName ("TELEFON")->AsFloat = "902"; //Лучше сделать это поле char()
IBQuery->ParamByName ("ADRES")->AsInteger = 1;
IBQuery->ExecSQL();

Автор: Pinocchio
Дата сообщения: 19.11.2005 08:45
DroN_S
Желательно обратить внимание на порядок заполнения полей. Это тоже иногда сказывается. Не помню почему, но если вышеприведённый код сработает то

Код:
IBQuery->ParamByName ("ZVANIE")->AsString = "trener";
IBQuery->ParamByName ("FIO")->AsString = "Semin";
Автор: DroN_S
Дата сообщения: 19.11.2005 15:27
Kitayskiy_svarshik

Цитата:
IBQuery->SQL.Text = "INSERT INTO Trener(FIO, ZVANIE,ADRES,TELEFON,NVS) VALUES(:FIO,:ZVANIE,:ADRES,:TELEFON,:NVS)"

я пишу это не в коде, а самом IBQuery в SQL и пытаюсь его активировать... вылазиет ошибка
Автор: Kitayskiy_svarshik
Дата сообщения: 20.11.2005 13:46
DroN_S
А параметры :FIO,:ZVANIE,:ADRES,:TELEFON,:NVS ты когда определяешь?
Автор: DroN_S
Дата сообщения: 21.11.2005 16:12
Kitayskiy_svarshik

Цитата:
А параметры :FIO,:ZVANIE,:ADRES,:TELEFON,:NVS ты когда определяешь?

в самом IBQuery...
Автор: Kitayskiy_svarshik
Дата сообщения: 22.11.2005 09:47
Если ты хотел сделать поле NVS в таблице VID_SPORTA автоинкрементным (по-моему так по-русски), то тригер


Код:
CREATE TRIGGER BI_TRENER FOR TRENER
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.NVS IS NULL) THEN
NEW.NVS = GEN_ID(NVS_ID_GENERATOR, 1);
END
^
Автор: ne0_2002
Дата сообщения: 23.03.2006 11:48
Имеется приложение на BCB6 использующее в работе базу Firebird. С некоторых пор (кажется после перехода на FIBPlus, но я не уверен) сообщения об ошибках FB начали кроме текста ошибки содержать еще и что-то вроде:

Цитата:
Can't format message 13:697 -- message file C:\firebird.msg not found. Dynamic SQL Error. SQL error code = -303. Conversion error from string "".

В принципе все сообщения я в обработчике исключений обрабатываю и переделываю в удобоваримый для пользователя вид, но все же интересен вопрос почему добавляется указанный текст и какого черта клиентская библиотека GDS32.DLL вообще ищет firebird.msg на машине клиента при работе с удаленным сервером? Может кто-нибудь просветить в этом вопросе?
Автор: gpi
Дата сообщения: 23.03.2006 12:20
ne0_2002

Цитата:
почему добавляется указанный текст и какого черта клиентская библиотека GDS32.DLL вообще ищет firebird.msg на машине клиента при работе с удаленным сервером?

В документации по установке клиента написано, что firebird.msg должен быть установлен и на клиенте. У тебя на клиентской машине есть этот файл?
Автор: ne0_2002
Дата сообщения: 23.03.2006 14:21
gpi

Цитата:
В документации по установке клиента написано, что firebird.msg должен быть установлен и на клиенте.

Нет, этого файла на клиенте у меня нету. И что-то не нашел я такого в документации (README.Win32LibraryInstallation.txt и README_installation.txt). Если не затруднит, то в каком именно файле такое написано?

Кстати, похожая ситуация и с сервером, который в EventLog пишет подобное:

Цитата:
The description for Event ID ( 251 ) in Source ( FirebirdGuardianDefaultInstance ) could not be found. It contains the following insertion string(s): Server Started: Guardian starting: C:\Program Files\Firebird\bin\fbserver.exeRootDirectory = /opt/firebird
# RemotePipeName "

Т.е. вроде как описание события дается, но сама Window описание этого же события не находит + дописывает какой-то мусор (вероятно в конце \0 не хватает).
Автор: gpi
Дата сообщения: 23.03.2006 16:07
ne0_2002
В файлах документации, дествительно, ничего не нашёл. Я про это вычитал в "Мир Interbase" и "Firebird Руководство разработчика баз данных"
Но есть и ссылка http://ibase.ru/devinfo/inst_manual.htm

Цитата:
Если речь идет не об установке сервера, а об установке клиентской части на "пустой" компьютер, то разумеется, нам потребуются

instreg.exe, firebird.msg/interbase.msg, gds32.dll.

Все это можно сложить в одну папку, и запустить оттуда instreg (если это instreg от Firebird 1.5, то он сам прописывает в реестр путь на 1 подкаталог выше. То есть, его надо запускать из специального подкаталога bin, или просто прописать нужный ключ в реестре самостоятельно). Если в реестре не будет информации о местонахождении файла msg, то клиентская часть постоянно будет сообщать что этот файл не найден. При этом, однако, путь к gds32.dll все равно должен быть в PATH, для того чтобы приложения могли найти эту библиотеку.

Автор: ne0_2002
Дата сообщения: 24.03.2006 13:46
gpi
Да уж. Тогда не понятно как быть если несколько приложений используют разные версии серверов и, соответственно, клиентских библиотек... Какой тогда MSG по прописанному в реестре пути ложить?
Автор: Spike169
Дата сообщения: 29.03.2006 10:01
При подключении базы данных появляется ошибка:

invalid request BLR at offset 139
function STRING_LENGTH is not defined
module name or entrypoint could not be found

Что это за ошибка и как с ней бороться?
Автор: gpi
Дата сообщения: 29.03.2006 11:31
Spike169
Может быть, библиотека с UDF, в которой должна находиться функция STRING_LENGTH, объявленная в базе, отсутствует на сервере
Автор: Spike169
Дата сообщения: 29.03.2006 11:53
gpi
А где ее взять?
Автор: OXDBA
Дата сообщения: 29.03.2006 13:15
Поставить IBExpert, подконнектиться к базе, выбрать в окне DataBase Explorer "Функции", doubleclick по STRING_LENGTH, в открывшемся окне, в столбце имя библиотеки будет название недостающей dll. Далее поиск по всей машине, если найдено, то скопировать в директорию \UDF, если нет - потребовать от разработчика БД.
P.S. Вообще-то в стандартной ib_udf.dll есть функция STRLEN.

Добавлено:
Spike169
Зачем посты дублировать? http://forum.ru-board.com/topic.cgi?forum=33&topic=6576#1
Да, после того как найдешь dll, необходимо снести IB 6.0 с машины и поставить либо FireBird 1.5.3, либо InterBase 7.5 c последним сервиспаком.
Автор: Silla
Дата сообщения: 12.07.2006 14:03
Доброго времени суток!
При добавлении записи, вернее при Посте выскакивает следующая ошибка:
Unsuccesfull execution caused by system error that doesnot preclude succesful execution of subsequent statements. Invalid transaction handle (excepting explicit transaction start)

Как с этим бороться?
Бывает, что при добавлени пяти, двадцати, одной записи.
Но при этом практически всегда данные сохранются (как ни странно).
Delphi 7, FIBPlus, Firebird 1.5, Windows XP HE
Заранее спасибо.
Автор: agny123
Дата сообщения: 12.07.2006 15:51
ну по ходу косяк с транзакцией, можно кусок кода?
Автор: Silla
Дата сообщения: 12.07.2006 17:04
Добавил запись, Вызов формы (модально), заполнил поля, пост.
все самое, что ни есть простое.
Все это происходит на машине на которой стоит фаерберд, права у пользователя не админские. Решил, что проблема в компьютере, пытаюсь определить, с чем конфликтует. Права дал админские, жду результата.
На машине-клиенте (вторая) такого не происходит.

По ходу, еще вопросик.
Чем больше работаешь, тем сильнее тормозит машина, т.е. выборка данных просходит все медленнее и медленнее. Затем всем надоедает, выходят из программы (т.е. все коннекты закрывают) и запускают прогу заново, так и работают.
Как и это побороть?
Заранее еще раз спасибо.
Автор: OXDBA
Дата сообщения: 13.07.2006 09:51
Silla

Цитата:
nvalid transaction handle (excepting explicit transaction start)

Обычно такая ошибка возникает пр работе с одной тразакцией из разных нитей(threads).
т.е если транзакция стартует, открывается датасет, а из другой нити транзакция коммитится/откатывается, то получим excepting explicit transaction start.


Цитата:
Решил, что проблема в компьютере, пытаюсь определить, с чем конфликтует

Транзакция ни с чем на компьютере(кроме твоего кода ) конфликтовать не может.


Цитата:
Чем больше работаешь, тем сильнее тормозит машина

Для начала посмотри не кончилась ли оперативка и что творится в Temporary directories FB.
Автор: vserd
Дата сообщения: 13.07.2006 10:16
Silla

Цитата:
Чем больше работаешь, тем сильнее тормозит машина, т.е. выборка данных просходит все медленнее и медленнее. Затем всем надоедает, выходят из программы (т.е. все коннекты закрывают) и запускают прогу заново, так и работают.

явная проблема утечки ресурсов. Ты гдето выделяешь память, или другие ресурсы, пользуешся, но не освобождаешь их. Ищи в своем коде, также читай доку на API на предмет автоматического выделения памяти и необходимости вручную ее освобождения.
Автор: agny123
Дата сообщения: 13.07.2006 11:44
а если попробовать закрыть транзакцию когда начинает тормозить? скорее проблема в этом...

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465

Предыдущая тема: Сравнение двух строк


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.