Após cadastrar 5 funcionarios, meu IB trava.. so reiniciando
gente tenho um sistema desenvolvido com o interbase, tudo funciona direitinho, porem, após cadastrar 05 funcionários ele trava e tenho que reiniciar o sistema, alguem pode me ajudar? :oops:
Mariocanel
Curtidas 0
Respostas
Otto
15/07/2004
Mario, nos informe mais detalhes....
qual a versão do seu IB , windows...
cole sua rotina de insert...
usa table ou query.... :wink:
qual a versão do seu IB , windows...
cole sua rotina de insert...
usa table ou query.... :wink:
GOSTEI 0
Persist
15/07/2004
Será que vc não faz uma conexão a cada inserção e seu IB suporta somente 5 conexões?
GOSTEI 0
Mariocanel
15/07/2004
meu interbase é o que vem no delphi 7(6.5)
meus códigos:
CREATE TABLE POLICIAL (
POLICIAL_ID DM_CHAVE_PRIMARIA /* INTEGER NOT NULL */,
NOME CHAR(80) CHARACTER SET OCTETS,
ENDERECO CHAR(60) CHARACTER SET OCTETS,
MATRICULA CHAR(15) CHARACTER SET OCTETS,
........
........
);
ALTER TABLE POLICIAL ADD PRIMARY KEY (POLICIAL_ID);
/******************************************************************************/
/**** Triggers ****/
/******************************************************************************/
SET TERM ^ ;
/* Trigger: INSERT_MATRICULA_POLICIAL */
CREATE TRIGGER INSERT_MATRICULA_POLICIAL FOR POLICIAL
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (exists
(select MATRICULA from POLICIAL
where MATRICULA=NEW.MATRICULA)) then
exception NOME_MATRICULA_JA_EXISTE;
end
^
/* Trigger: INSERT_NOME_POLICIAL */
CREATE TRIGGER INSERT_NOME_POLICIAL FOR POLICIAL
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (exists
(select NOME from POLICIAL
where NOME=NEW.NOME)) then
exception NOME_POLICIAL_JA_EXISTE;
end
^
/* Trigger: NEW_POLICIAL_ID */
CREATE TRIGGER NEW_POLICIAL_ID FOR POLICIAL
ACTIVE BEFORE INSERT POSITION 0
AS
begin
new.policial_id =gen_id(gen_policial,1);
end
^
/* Trigger: UPDATE_MATRICULA_POLICIAL */
CREATE TRIGGER UPDATE_MATRICULA_POLICIAL FOR POLICIAL
ACTIVE BEFORE UPDATE POSITION 0
as
begin
if (old.MATRICULA<>new.MATRICULA) then
if (exists
(select MATRICULA from POLICIAL
where MATRICULA=NEW.MATRICULA)) then
exception NOME_MATRICULA_JA_EXISTE;
end
^
/* Trigger: UPDATE_NOME_POLICIAL */
CREATE TRIGGER UPDATE_NOME_POLICIAL FOR POLICIAL
ACTIVE BEFORE UPDATE POSITION 0
as
begin
if (old.NOME<>new.NOME) then
if (exists
(select NOME from POLICIAL
where NOME=NEW.NOME)) then
exception NOME_POLICIAL_JA_EXISTE;
end
^
SET TERM ; ^
/******************************************************************************/
/**** Privileges ****/
/******************************************************************************/
/* Privileges of users */
GRANT ALL ON POLICIAL TO MARIOCANEL WITH GRANT OPTION;
Tudo issi feito no IBEXPERT,porem quando levo para o Delphi, taí, nao se se tenho que criar uma proceure para ativar a trigger, ou deixando assim ele resolve, porem, dá KEY VIOLATION
aí baseado no datacar(clubedelphi, usei tal código)
procedure TDM.Incrementa(Nome_Tabela: String; Chave_Primaria: TField);
var Qry : TSQLQuery;
begin
if Chave_Primaria.DataSet.State <> dsInsert then
exit; //termina a execução caso não esteja em modo de inserção
Qry:=TSQLQuery.Create(nil); //cria uma instância do objeto
try
Qry.SQLConnection:=SQLConnect; //componente de conexão
Qry.SQL.Add(´SELECT MAX(´+Chave_Primaria.FieldName+´) FROM ´+Nome_Tabela);
Qry.Open;
if Qry.Fields[0].IsNull then //se a tabela está vazia retornará nulo
Chave_Primaria.AsInteger:=1 //então este será o primeiro registro
else Chave_Primaria.AsInteger:=Qry.Fields[0].AsInteger+1;
finally
FreeAndNil(Qry); //tira o objeto da memória
end;
Obs:TDM é meu datamodule
meus códigos:
CREATE TABLE POLICIAL (
POLICIAL_ID DM_CHAVE_PRIMARIA /* INTEGER NOT NULL */,
NOME CHAR(80) CHARACTER SET OCTETS,
ENDERECO CHAR(60) CHARACTER SET OCTETS,
MATRICULA CHAR(15) CHARACTER SET OCTETS,
........
........
);
ALTER TABLE POLICIAL ADD PRIMARY KEY (POLICIAL_ID);
/******************************************************************************/
/**** Triggers ****/
/******************************************************************************/
SET TERM ^ ;
/* Trigger: INSERT_MATRICULA_POLICIAL */
CREATE TRIGGER INSERT_MATRICULA_POLICIAL FOR POLICIAL
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (exists
(select MATRICULA from POLICIAL
where MATRICULA=NEW.MATRICULA)) then
exception NOME_MATRICULA_JA_EXISTE;
end
^
/* Trigger: INSERT_NOME_POLICIAL */
CREATE TRIGGER INSERT_NOME_POLICIAL FOR POLICIAL
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (exists
(select NOME from POLICIAL
where NOME=NEW.NOME)) then
exception NOME_POLICIAL_JA_EXISTE;
end
^
/* Trigger: NEW_POLICIAL_ID */
CREATE TRIGGER NEW_POLICIAL_ID FOR POLICIAL
ACTIVE BEFORE INSERT POSITION 0
AS
begin
new.policial_id =gen_id(gen_policial,1);
end
^
/* Trigger: UPDATE_MATRICULA_POLICIAL */
CREATE TRIGGER UPDATE_MATRICULA_POLICIAL FOR POLICIAL
ACTIVE BEFORE UPDATE POSITION 0
as
begin
if (old.MATRICULA<>new.MATRICULA) then
if (exists
(select MATRICULA from POLICIAL
where MATRICULA=NEW.MATRICULA)) then
exception NOME_MATRICULA_JA_EXISTE;
end
^
/* Trigger: UPDATE_NOME_POLICIAL */
CREATE TRIGGER UPDATE_NOME_POLICIAL FOR POLICIAL
ACTIVE BEFORE UPDATE POSITION 0
as
begin
if (old.NOME<>new.NOME) then
if (exists
(select NOME from POLICIAL
where NOME=NEW.NOME)) then
exception NOME_POLICIAL_JA_EXISTE;
end
^
SET TERM ; ^
/******************************************************************************/
/**** Privileges ****/
/******************************************************************************/
/* Privileges of users */
GRANT ALL ON POLICIAL TO MARIOCANEL WITH GRANT OPTION;
Tudo issi feito no IBEXPERT,porem quando levo para o Delphi, taí, nao se se tenho que criar uma proceure para ativar a trigger, ou deixando assim ele resolve, porem, dá KEY VIOLATION
aí baseado no datacar(clubedelphi, usei tal código)
procedure TDM.Incrementa(Nome_Tabela: String; Chave_Primaria: TField);
var Qry : TSQLQuery;
begin
if Chave_Primaria.DataSet.State <> dsInsert then
exit; //termina a execução caso não esteja em modo de inserção
Qry:=TSQLQuery.Create(nil); //cria uma instância do objeto
try
Qry.SQLConnection:=SQLConnect; //componente de conexão
Qry.SQL.Add(´SELECT MAX(´+Chave_Primaria.FieldName+´) FROM ´+Nome_Tabela);
Qry.Open;
if Qry.Fields[0].IsNull then //se a tabela está vazia retornará nulo
Chave_Primaria.AsInteger:=1 //então este será o primeiro registro
else Chave_Primaria.AsInteger:=Qry.Fields[0].AsInteger+1;
finally
FreeAndNil(Qry); //tira o objeto da memória
end;
Obs:TDM é meu datamodule
GOSTEI 0
Persist
15/07/2004
Não sei se tem algo a ver, mas vc está dando Qry.Open, atualiza a chave de auto-incremento e depois FreeAndNil(Qry) sem dar Qry.Close.
Verifique também o número de conexões no banco após a terceira inserção.
Verifique também o número de conexões no banco após a terceira inserção.
GOSTEI 0
Mariocanel
15/07/2004
gente ainda nao sei como usar a trigger, pois, como uso esse nesse procedimento no delphi, ou seja, trago para o delphi do interbase, ou nao precisa? como faço?
GOSTEI 0