Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » InterBase и FireBird: вопросы по работе и их решение

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104

Открыть новую тему     Написать ответ в эту тему

DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Проблема в следующем:
пишу вот такой вот запрос

Код:
 
INSERT INTO Trener(FIO, ZVANIE,ADRES,TELEFON,NVS)
  VALUES(:FIO,:ZVANIE,:ADRES,:TELEFON,:NVS);
 

т.е. надо вставить значения в поля, но при активации IBQuery, выдаётся ошибка validation error for column NVS, value "*** null ***"...
В чём проблема?

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 22:52 17-11-2005 | Исправлено: DroN_S, 11:35 18-11-2005
vndovr

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как устанавливаешь значение для поля NVS перед выполнением запроса - код приведи

Всего записей: 359 | Зарегистр. 05-02-2004 | Отправлено: 23:31 17-11-2005
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vndovr

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

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

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 23:38 17-11-2005 | Исправлено: DroN_S, 23:44 17-11-2005
vndovr

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Перед вызовом запроса ты должен задать параметры - у тебя параметризованный запрос - этот кусок кода интересует.
У тебя поле NVS - primary key - оно не может быть NULL. В запросе ты не устанавливаешь для него никакого значение, т.е. оставляешь его NULL - соответственно это вызывает ошибку.
Ты должен либо перед выполнением запроса задать значение для NVS либо, если значение должно автоматически генерироваться - тебе нужно написать триггер.

Всего записей: 359 | Зарегистр. 05-02-2004 | Отправлено: 23:51 17-11-2005
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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!!
 

 

Цитата:
Ты должен либо перед выполнением запроса задать значение для NVS

как его задать?

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 00:09 18-11-2005
vndovr

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Так.  
У тебя есть таблица. Ты вставляешь в нее запись используя запрос 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();
 

или если у тебя это поле должно генерироваться автоматически в БД, тогда должен быть тригге before insert (вроде):

Код:
 
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
^
 

NVS_ID_GENERATOR - это генератор ключей для NVS.
 
У тебя ошибка - что поле NVS = NULL при попытке вставки - нужно его как-то задать в запросе - вот выше 2 способа.

Всего записей: 359 | Зарегистр. 05-02-2004 | Отправлено: 00:25 18-11-2005
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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!!
 

вот мой тригер...
 
я пишу в SQL компонента  IBQuery вот это

Код:
 
INSERT INTO Trener(FIO, ZVANIE,ADRES,TELEFON,NVS)  
  VALUES(:FIO,:ZVANIE,:ADRES,:TELEFON,:NVS);  
 

делаю проверить запрос, ругается на NULL...
 
я ведь это не в коде пишу, а в компоненте...

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 00:47 18-11-2005
Kitayskiy_svarshik



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Приведи структуру таблицы и код, которым запускаешь IBQuery,
а то ничё не понятно..

Всего записей: 101 | Зарегистр. 09-01-2005 | Отправлено: 12:30 18-11-2005
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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);
 

генератор к таблице

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

тригер к таблице

Код:
 
CREATE TRIGGER TRENER1 FOR TRENER
BEFORE INSERT
 AS
 BEGIN  
        NEW .NT = GEN_ID (TRENERGEN, 1);
END!!
 

 
открываю талицу

Код:
 
SELECT * FROM TRENER
  ORDER BY FIO
 

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 15:08 18-11-2005
Kitayskiy_svarshik



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
А в клиенте ты так запись добавляешь?
 

Код:
 
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();
 
 


Всего записей: 101 | Зарегистр. 09-01-2005 | Отправлено: 19:27 18-11-2005
Pinocchio

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
DroN_S
Желательно обратить внимание на порядок заполнения полей. Это тоже иногда сказывается. Не помню почему, но если вышеприведённый код сработает то

Код:
 
IBQuery->ParamByName ("ZVANIE")->AsString = "trener";  
IBQuery->ParamByName ("FIO")->AsString = "Semin";

, не обязательно сработает.

Всего записей: 683 | Зарегистр. 18-11-2002 | Отправлено: 09:45 19-11-2005
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kitayskiy_svarshik

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

я пишу это не  в коде, а самом IBQuery в SQL и пытаюсь его активировать... вылазиет ошибка

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 16:27 19-11-2005
Kitayskiy_svarshik



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
DroN_S
А параметры :FIO,:ZVANIE,:ADRES,:TELEFON,:NVS ты когда определяешь?

Всего записей: 101 | Зарегистр. 09-01-2005 | Отправлено: 14:46 20-11-2005
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kitayskiy_svarshik

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

в самом IBQuery...

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 17:12 21-11-2005
Kitayskiy_svarshik



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Если ты хотел сделать поле  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  
^
 

 
должен выглядеть так:
 

Код:
 
CREATE TRIGGER BI_TRENER FOR VID_SPORTA
ACTIVE BEFORE INSERT POSITION 0  
AS  
BEGIN  
  IF (NEW.NVS IS NULL) THEN  
      NEW.NVS = GEN_ID(NVS_ID_GENERATOR, 1);  
END  
^
 

 
это раз.
 
При добавлении записи таким образлм

Код:
 
INSERT INTO Trener(FIO, ZVANIE,ADRES,TELEFON,NVS)   VALUES(:FIO,:ZVANIE,:ADRES,:TELEFON,:NVS)
 

 
Нужно явно указывать значение поля NVS, причём оно должно соотв. одному из значений в табл. VID_SPORTA.

Всего записей: 101 | Зарегистр. 09-01-2005 | Отправлено: 10:47 22-11-2005
ne0_2002



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Имеется приложение на 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 на машине клиента при работе с удаленным сервером? Может кто-нибудь просветить в этом вопросе?

Всего записей: 601 | Зарегистр. 18-06-2002 | Отправлено: 12:48 23-03-2006 | Исправлено: ne0_2002, 12:49 23-03-2006
gpi

Alone Wanderer
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ne0_2002

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

В документации по установке клиента написано, что firebird.msg должен быть установлен и на клиенте. У тебя на клиентской машине есть этот файл?

Всего записей: 432 | Зарегистр. 30-05-2004 | Отправлено: 13:20 23-03-2006
ne0_2002



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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 не хватает).

Всего записей: 601 | Зарегистр. 18-06-2002 | Отправлено: 15:21 23-03-2006
gpi

Alone Wanderer
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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, для того чтобы приложения могли найти эту библиотеку.


Всего записей: 432 | Зарегистр. 30-05-2004 | Отправлено: 17:07 23-03-2006
ne0_2002



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gpi
Да уж. Тогда не понятно как быть если несколько приложений используют разные версии серверов и, соответственно, клиентских библиотек... Какой тогда MSG по прописанному в реестре пути ложить?

Всего записей: 601 | Зарегистр. 18-06-2002 | Отправлено: 14:46 24-03-2006
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » InterBase и FireBird: вопросы по работе и их решение


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru