Exemplo básico com IBX!
crie um banco de dados com uma tabela com a seguinte estrutura:
create table teste1 ( codigo integer not null, nome varchar(30) not null, endereco varchar(60), telefone varchar(15), primary key pk_teste1 (codigo) ); create index ix_teste1_nome on teste1 (nome);
crie um novo projeto no Delphi e coloque no form::
1 panel (Align=alTop, Caption=´´)
1 IBDatabase (DefaultTransaction = IBTransaction1, LoginPrompt = False)
1 IBTransaction (DefaultDatabase=IBDatabase1)
1 IBDataSet (Database=IBDatabase1, Transaction = IBTransaction1)
1 DataSource (DataSet = IBDataSet1)
1 dbGrid (Align=alClient, DataSource=DataSource1)
1 dbNavigator (no Panel -- DataSource = DataSource1)
dê um duplo-clique no IBDAtabase e configure::
database = caminho do banco criado anteriormente
clique na opção REMOTE e configure tb:
server = localhost
protocol = tcp
username = sysdba (ou outro usuário)
password = masterkey (a senha do seu usuário)
character set = o character set q vc criou o banco
clique OK
configure ainda no seu IBDatabase a propriedade AllowStreemedConnected = FALSE
agora, dê um duplo-clique no IBTransaction e selecione a opção READ COMMITED, clique OK
vamos configurar então o IBDataSet
na propriedade SelectSQL coloque seu select, ex::
SELECT * FROM TESTE1
WHERE NOME STARTING WITH :par1
agora, clique com o botão direito do mouse no IBDataSet1 e selecione no menu ´Dataset Editor...´
no editor do IBDataSet, na lista a esquerda (key fields) selecione apenas o campo CODIGO, na lista da direita, selecione todos os campos.
clique no botão GENERATE SQL -- nesse momento, observe os SQLs gerados, eles são um bom exemplo de como devem ser! E vc pode notar (e controlar) tudo q vai ocorrer em cada operação.
Clique OK para fechar o assistente.
Agora, dê um duplo-clique no IBDataSet e adicione o campos persistentes (botão direito e selecione o menu ´Add all fields)
bom, coloque agora no PANEL1 um Botão e um Edit.
limpe a propriedade Text do Edit e...
...no botão coloque o caption = ´pesquisar´ e o código no OnClick::
IBDataSet1.Close; IBDataSet1.Params[0].AsString := Edit1.Text; IBDataSet1.Open;
e no evento onCreate do seu Form coloque::
try IBDatabase1.Connected := True; except ShowMessage(´não foi possível realizar a conexão com o BD´); end;
e no OnClose ou OnDestroy do form coloque::
try if IBTransaction1.InTransaction then IBTransaction1.Commit; IBDatabase1.Connected := False; except ShowMessage(´erro de comunicação com o BD´); end;
coloque mais 2 botões no PANEL1 com os captions COMMIT e ROLLBACK, e coloque os códigos no OnClick (respectivamente)::
IBDataSet1.Transaction.CommitRetaining;
e
IBDataSet1.Transaction.RollbackRetaining;
PRONTO!!!
Execute o programa, clique no botão Pesquisar (não vai haver nada) inclua uns registros... clique no botão COMMIT, e etc... vai usando ele (incluir, editar, excluir, etc... etc...)!
Bom, é isso! Espero q ajude a todos os iniciantes. 8)
T+
Afarias
Respostas
Sremulador
16/12/2003
:?: Pra que serve o AllowStreemedConnected;
:?: Como tratar o dead lock.
:?: O fireBird 1.5 RC8 faz o controle do dead lock.
:?: O Qual seria a melhor configuração para o Fbconfig.
Obrigado.
[/b:7ab7d53b6b]
Afarias
16/12/2003
Vc pode colocar esta propriedade para FALSE (recomendo) para q quando vc compilar seu executável e a propriedade Connected estiver TRUE (por esquecimento por exemplo) -- o IBDatabase não tente conectar-se automaticamente com o banco definido em tempo de projeto quando a aplicação for executada.
Evita muitos problemas de erros quando da distribuição da aplicação.
| Como tratar o dead lock.
1º -- Cuidando bem das transações e mantendo-as curtas.
No mais, com Try/Except
| O fireBird 1.5 RC8 faz o controle do dead lock.
Não entendi... O FB 1.5 permite sim o bloqueio explícito de registros (SELECET FOR UPDATE / WITH LOCK) -- é isso?? -- vc pode dar uma olhada sobre isso nas notas de versão do FB 1.5 -- mas muito cuidado ao usar esta funcionalidade.
| O Qual seria a melhor configuração para o Fbconfig.
??firebird.conf?? A padrão! :D ´cada caso é um caso´ -- não há uma configuração definitiva.
T+
Marbravo
16/12/2003
Eu uso delphi5 e não achei esse item no menu.
É possivel fazer esse exemplo no delphi5?
Afarias
16/12/2003
|É possivel fazer esse exemplo no delphi5?
SIM é possível... (aliais, é o Delphi q eu uso)
Atualize seu IBX::
http://codecentral.borland.com/codecentral/ccweb.exe/author?authorid=102
a última atualização para D5 é a 5.04 ::
http://codecentral.borland.com/codecentral/ccweb.exe/listing?id=18961
T+
Marshall Mathers
16/12/2003
[url]http://delphiforum.icft.com.br/forum/viewtopic.php?t=34152[/url]
Poletto
16/12/2003
Complementando o q você escreveu. É possível, se for, como faço, a partir do Delphi, através da linha de comando, CRIAR UM BANCO DE DADOS DO ZERO.
Exemplo:
Servidor : severprincipal
Protocolo: TCP
UserName: SYSDBA
Password: masterkey
Quero criar o Banco de Dados chamado BASETOTAL.GDB, porém preciso verificar se ele já não foi criado antes.
Tipo: IF NOT EXISTSDB(´serverprincipal:BASETOTAL.GDB´) THEN
CREATE DATABASE serverprincipal:BASETOTAL.GDB
E continuando...
IF NOT EXISTSTB(´serverprincipal:BASETOTAL.GDB.NOTAS´) THEN
CREATE TABLE serverprincipal.BASETOTAL.GDB.NOTAS (
.............) etc.. etc...
Os comandos acima não existem ainda...
Mas solicito que me ajude nesse sentido. Acredito que outros também se beneficiarão com isso.
Obrigado.
Afarias
16/12/2003
|BANCO DE DADOS DO ZERO.
vc pode rodar um script com CREATE DATABASE usando o IBScript por exempo, ou ainda usar um IBDatabase como segue::
with IBDatabase1 do
begin
SQLDialect := 3;
DatabaseName := ´severprincipal:caminho\BASETOTAL.GDB´;
Params.Clear;
Params.Add(´USER ´´SYSDBA´´´);
Params.Add(´PASSWORD ´´masterkey´´´);
Params.Add(´PAGE_SIZE 4096´);
Params.Add(´DEFAULT CHARACTER SET ISO8859_1´);
try
CreateDatabase;
except
{tratamento de erro}
end;
end;
|Tipo: IF NOT EXISTSDB(´serverprincipal:BASETOTAL.GDB´) THEN
|CREATE DATABASE serverprincipal:BASETOTAL.GDB
isso não existe. vc pode simplesmente tentar conectar-se com o banco de dados e capturar a exceção (que será gerada caso o banco não exista)
|IF NOT EXISTSTB(´serverprincipal:BASETOTAL.GDB.NOTAS´) THEN
|CREATE TABLE serverprincipal.BASETOTAL.GDB.NOTAS (
Para criar tabelas e outros objetos do banco de dados, utilize um componente de script, como o IBScript
T+
Poletto
16/12/2003
Valeu Muito....
Maicon Loffi
16/12/2003
Pra que serve o AllowStreemedConnected
Vc pode colocar esta propriedade para FALSE (recomendo) para q quando vc compilar seu executável e a propriedade Connected estiver TRUE (por esquecimento por exemplo) -- o IBDatabase não tente conectar-se automaticamente com o banco definido em tempo de projeto quando a aplicação for executada.
Coloquei esta propriedade pra false, agora quando executo o sistema, as tabelas que estão no DataModule, e teriam que ficar ativas (True), elas não ficam, tenho que dar uma Active (True) para cada tabela, ou seja, elas ficam fechadas ao entrar no sistema.
Dart
16/12/2003
Como instalar?
Valeu
Dart
16/12/2003
Não Consigo Atualizar o meu IBX No Delphi 5 da um erro.
e apaga os componentes IBX anteriores.
Como Resolvaer
Valeu
Dart
Mahdak
16/12/2003
Criar um banco em tempo de execução apertando no botao do meu programa, se alguem pudesse me ajudar ficarei grato!!!
[]´s :shock:
Afarias
16/12/2003
Para q o valor da propriedade Connected (ajustada em Design Time no Inspector) seja aplicada quando a aplicação for executada.
Em geral, é melhor deixar o AllowStreemedConnected como FALSE e, conectar no banco (e, de tabela abrir as tabelas) via código, ex:
IBDatabase1.Connected := True;
Query1.Open;
etc...
|Não Consigo Atualizar o meu IBX No Delphi 5 da um erro.
Para atualizar o IBX é necessário ter a atualização (Update Pack 1) do Delphi 5 aplicada.
|Criar um banco em tempo de execução apertando no botao do meu
|programa, se alguem pudesse me ajudar ficarei grato!!!
Vc pode usar o método CreateDatabase do IBDatabase::
with IBDatabase1 do
begin
DatabaseName := ´caminho_do_database´;
Params.Add(´USER ´SYSDBA´);
Params.Add(´PASS ´masterkey´);
Params.Add(´PAGE_SIZE 4096´);
Params.Add(´DEFAULT CHARACTER SET ISO8859_1´);
CreateDatabase;
end;
T+
Dart
16/12/2003
para que serve character set ?
Eliene
16/12/2003
Para atualizar o IBX é necessário ter a atualização (Update Pack 1) do Delphi 5 aplicada.
:?: Não sei onde posso encontrar este (Update Pack 1). Seria o SP1 citado no download da atualização ? Onde posso encontrá-lo ? Baixei a atualização e rodei a atualização. Os componentes existentes na palheta do Interbase sumiram. Por Favor me ajude...
Afarias
16/12/2003
T+
Tap_pedroso
16/12/2003
Afarias
16/12/2003
|USAR COMMIT EM VEZ DE UTILIZAR COMMITRETAINING?
Nenhum. Do ponto de vista do banco é até melhor.
Mas tenha em mente q o Commit fecha a transação, fechando assim todos os DataSets ligados a ela.
T+
Xandeamorim
16/12/2003
Afarias
16/12/2003
server = localhost
para
server = ip ou nome do servidor
T+
Xandeamorim
16/12/2003
Gandalf.nho
16/12/2003
Afarias
16/12/2003
Configurando a transação para ReadCommited vc apenas assegura q quando realizar este procedimento (executar uma consulta) vc terá como resultado TODOS os registros comitados -- independente do ´status´ da sua transação atual.
T+
Roberto Padilha
16/12/2003
Select * from Aluno
where nome starting with :par1
A sintaxe acima (semelhante à do seu exemplo) poderia ser usada no Command Text do ClientDataSet ou de um SimpleDataSet, por exemplo?
Agradeço antecipadamente sua costumeira boa vontade e presteza em auxiliar.
[]s
Afarias
16/12/2003
|Command Text do ClientDataSet ou de um SimpleDataSet, por
|exemplo?
1) poderia ficar no SQLQuery ou SQLDataSet
2) poderia ficar no Command Text do ClientDataSet sem problemas, mas é preferencial q fique no SQLQuery associado. E o ClientDataSet seja utilizado para definir o parâmetro (par1)
3) SimpleDataSet acredito não ser 1 bom componente para ser usado
T+
Roberto Padilha
16/12/2003
Quando o usuário conhece e se lembra do nr. do aluno (que é a chave primária da tabela aluno), pode realizar alterações e exclusões na tabela, a partir desse nr. (Isto já está pronto e funcionando). Porém acho conveniente oferecer ao usuário fazer uma pesquisa pelo nome, selecionando alguns poucos alunos cujo nome começasse, por exemplo, por Jo (Joâo, José...). O resultado desta pesquisa apareceria em um DbGrid que o usuário usaria para selecionar um aluno. Confesso que não estou sabendo escolher os componentes adequados para por em prática essa pesquisa. Já fiz isso uma vez, funcionou bem, mas era com Paradox, onde o TQuery e o DbGrid combinam (não são unidirecionais). Será que existe algum artigo ou apostila que possa ajudar a entender melhor o funcionamento desses componentes e, principalmente, como interagem entre si?
Em sua mensagem anterior, você me informa que o SimpleDataSet não é um bom componente. Poderia explicar-me por que? Posso usar um SQLQuery e mostrar o result set da pesquisa diretamente no DbGrid?
Mais uma vez, muito obrigado pela ajuda.
[]s
Afarias
16/12/2003
|para por em prática essa pesquisa. Já fiz isso uma vez, funcionou bem,
|mas era com Paradox, onde o TQuery e o DbGrid combinam (não são
|unidirecionais).
Se vc deseja esse tipo de operação com DBExpress deverá utilizar ClientDataSets/DataSetProviders junto com seus SQLDataSet ou SQLQuery
|Será que existe algum artigo ou apostila que possa ajudar a entender
|melhor o funcionamento desses componentes e, principalmente, como
|interagem entre si?
Acho q sim. Procure material sobre ClientDataSet, DBExpress e DataSnap (MIDAS) no site da Revista Clube Delphi -- Tb existem muita coisa sobre o assunto no fórum Delphi e na própria revista Clube Delphi
|Em sua mensagem anterior, você me informa que o SimpleDataSet não
|é um bom componente. Poderia explicar-me por que?
componentes como SimpleDataSet foram descontinuados.
o SimpleDataSet nada mais é que 1::
SQLDataSet + DataSetProvider + ClientDataSet
é possível q vc possa usá-lo sem se preocupar (principalmente se seu sistema é simples e pequeno) -- ele tras praticidade, mas essa pratacidade tem contra-pontos.
|Posso usar um SQLQuery e mostrar o result set da pesquisa diretamente
|no DbGrid?
Não. Neste caso vc deverá ´montar´ manualmente os resultados na tela com um StringGrid, ListView ou outro componente.
Ou então usar um ClientDataSet associado ao SQLQuery como citei, ai vc pode ligar o DBGrid ao ClientDataSet.
(ou apenas usar o SimpleDataSet se desejar)
T+
Roberto Padilha
16/12/2003
|no DbGrid?
Não. Neste caso vc deverá ´montar´ manualmente os resultados na tela com um StringGrid, ListView ou outro componente.
Ou então usar um ClientDataSet associado ao SQLQuery como citei, ai vc pode ligar o DBGrid ao ClientDataSet.
Optei pela primeira alternativa mas está ocorrendo uma dificuldade. Quando tento passar os valores da consulta (SQLQuery) para o StringGrid, o programa é interrompido com uma mensagem de erro ´Cursor Unknown´. A primeira parte (a consulta) realiza-se sem erro.
Seguem abaixo listagens das partes que interessam, do programa, para o caso de você poder dar uma olhada e descobrir o erro. às vezes penso que, por ser um programa freeware, o FireBird é mais sujeito a ´bugs´ e existe a possibilidade de que seja um deles o causador.
procedure TF_PesqAluno.EditLetrasChange(Sender: TObject);
var Consulta: string;
begin
Consulta := ´Select COD_ALUNO, NOME, CPF, IDENTIDADE from Aluno ´
+´where NOME starting with ´´´
+EditLetras.Text + ´´´´;
try
transac.TransactionID := 1;
transac.IsolationLevel := xilREPEATABLEREAD;
DM.SQLConnection1.StartTransaction(Transac);
with DM.SQLQry_Aluno do
begin
Close;
SQL.Clear;
SQL.Append(Consulta);
Open;
end;
DM.SQLConnection1.Commit(Transac);
except
on Exc:Exception do
begin
ShowMessage(´Erro na procura por nome. ´+Exc.Message);
DM.SQLConnection1.Rollback(Transac);
end;
end;
MostraGrade;
end;
procedure TF_PesqAluno.MostraGrade;
var i,j: word;
begin
with DM.SQLQry_Aluno do
begin
if Eof then exit;
First;
j := 1;
while not Eof do
begin
with StrGr_Alunos do
begin
cells[0,j] := FieldByName(´COD_ALUNO´).AsString;
cells[1,j] := FieldByName(´NOME´).AsString;
cells[2,j] := FieldByName(´IDENTIDADE´).AsString;
cells[3,j] := FieldByName(´CPF´).AsString;
end;
inc(j);
next;
end;
end;
end;
Agradeço a atenção.
[]s
Roberto Padilha
16/12/2003
Obrigado a todos que me ajudaram, em especial ao AFarias.
[]s
Shaolin
16/12/2003
Não tenho nenhuma destas duas Opções !!!
Gandalf.nho
16/12/2003
Baker
16/12/2003
Uso o componente IBX, eu já sabia usa-lo mas encontrava dificuldade na conexão com o bando de dados do servidor para o cliente. Tentei seguir o exemplo do AFarias, e então deu a mesma mensagem de erro.
Olhem só a configuração do Ibdataset:
server = 192.168.0.1 //que seria no caso o ip da maquina servidor.
protocol = TCP
database = c\programas\meuprograma\db.gdb //pasta compartilhada
user = SYSDBA
password = masterkey
assim clico no botão de TEST e ele me retorna o seguinte erro:
ERRO: ´I/O error for file ´c\programas\meuprograma\db.gdb´
Error while trying to open file
O sistema não pode encontrar o arquivo especificado.´
Já fiz de tudo para tentar me conectar ao bando de dados do servidor, desde configurações via programação, desinstalação de firewalls ou algo do tipo, eu usava o interbase mas desinstalei e instalei o firebird que deu no mesmo... Cansei de chingar o computador...rs* (brincadeiras a parte).
Seria alguma configuração extra em alguma dll, ou estah faltando alguma dll para reconhecer o bendito arquivo.
Ah, também estou usando nas duas maquinas o WinXP...
Bom agradeço a todos pela atenção.
Até mais
Bruno Baker - Programador SinteSoft
Vinicius2k
16/12/2003
Esta questão sempre gera alguma ´confusão´... O problema está no caminho do banco, informe :
[b:edf496b103]c:\programas\meuprograma\db.gdb[/b:edf496b103]
Vc deve informar o caminho FISICO REAL do banco NO SERVIDOR e não compartilhamento. Aliás, não é necessário efetuar o compartilhamento e também não é recomendável por questões de segurança.
Encare a informação do caminho do banco de dados como a passagem de um parametro para o servidor IB/FB e não necessariamente vc precisa ter acesso a este arquivo informado através da rede.
Este caminho que vc informa será levado ao serviço gds_db para que o servidor saiba a qual banco de dados vc deseja se conectar, compreende?
T+
Baker
16/12/2003
A minha aplicação rodou perfeitamente. Valew mesmo você me poupou meses de dor de cabeça..rs...
Fico Grato valew
e até mais
-------------------------------------------------------------------------------------
Bruno Baker - Programador SinteSoft
[url]www.sintesoft.com[/url]
Anderson_blumenau
16/12/2003
procedure TFrm_Empresa.BtNovoClick(Sender: TObject); begin Emp_trans.Active; Emp_DataSet.insert end;
o codigo acima gera o seguinte erro CANNOT MODIFY A READ-ONLY DATASET
Porem eu nao vi nenhuma propriedade somente leitura no componente
Afarias
16/12/2003
Quando estas propriedades (InsertSQL, ModifySQL e DeleteSQL) não estão preenchidas, o DataSet é ReadOnly
T+
Ksotte
16/12/2003
Como assim ´as propriedades InsertSql, ModifySql, etc...´ tem que estar preenchidas ???
Se eu colocar um form (com os devidos campos) ligados dessa forma:
IBDatabase
IBTransaction
IBDataSet
DataSource
quando for inserir dados fizer -->> ibdataset.insert
quando for salvar dados fizer -->> ibdataset.post
quando for editar dados fizer -->> ibdataset.edit
não dá certo ????
Desculpem pela ignorância .. mas sou iniciante...rs..
Abraço
Analyst
16/12/2003
Pessoal, tenho uma tabela no firebird 2.1 com um campo numerico(10,2), To testando esse banco de dados, tentando me aprimorar, mas surgiu um probleminha, ao rodar o meu programa que esta ligado a base pela engine BDE - TDatabase e TTable, DbNavigator e uns DBEdit, lembrando que a tabela já está peenchida com valores, mas ao navegar entre esses registros pelo programa, no lugar de aparecer por exemplo no campo valor da venda 10,50 está aparecendo a palavra (BYTES)...porque isso ocorre com o firebird, o que tenho que fazer para mostrar o valor?
Valeu pessoal!!!
Alessandro