Importar TXT com open dialog?
Tenho um banco de dados em Interbase. Quero importar um arquivo em txt e colocar os dados no banco de dados.
Estou com um problema na hora de executar a inserção no banco de dados.
Será que alguem pode me ajudar a completar este código
Segue o que eu já fiz
var
TEXTO : TextFile;
LINHA :STRING;
tam,postab:integer;
begin
Opendialog1.Execute;
Opendialog1.Title := ´FAVOR SELECIONAR O ARQUIVO´;
AssignFile(TEXTO,Opendialog1.FileName);
Reset(TEXTO);
while not Eof(TEXTO) do
begin
LINHA := ´´;
ReadLn(TEXTO,LINHA);
if LINHA <>´´ then
begin
tam := length(LINHA);
postab := pos(#9,LINHA);
[color=red:877b438fb6] ibdataset1.execsql(´INSERT INTO teste (nome, idade) VALUES(´ +39+QuoteStr(copy(LINHA,1,postab-1))+ ´ , ´ + copy(LINHA,postab+1,tam-postab)´ + ´ )´);[/color:877b438fb6] end;
[color=red:877b438fb6][/color:877b438fb6]Estou com Problema na linha acima.
Como faço para executar e inserir todos os dados no meu banco de dados.
Obrigado
Alexandre
Estou com um problema na hora de executar a inserção no banco de dados.
Será que alguem pode me ajudar a completar este código
Segue o que eu já fiz
var
TEXTO : TextFile;
LINHA :STRING;
tam,postab:integer;
begin
Opendialog1.Execute;
Opendialog1.Title := ´FAVOR SELECIONAR O ARQUIVO´;
AssignFile(TEXTO,Opendialog1.FileName);
Reset(TEXTO);
while not Eof(TEXTO) do
begin
LINHA := ´´;
ReadLn(TEXTO,LINHA);
if LINHA <>´´ then
begin
tam := length(LINHA);
postab := pos(#9,LINHA);
[color=red:877b438fb6] ibdataset1.execsql(´INSERT INTO teste (nome, idade) VALUES(´ +39+QuoteStr(copy(LINHA,1,postab-1))+ ´ , ´ + copy(LINHA,postab+1,tam-postab)´ + ´ )´);[/color:877b438fb6] end;
[color=red:877b438fb6][/color:877b438fb6]Estou com Problema na linha acima.
Como faço para executar e inserir todos os dados no meu banco de dados.
Obrigado
Alexandre
Alerocha
Curtidas 0
Respostas
Abueno_silva
18/08/2003
Qual é exatamente o problema que ocorre?
Porque você está inserindo o #39 (aspas simples), se a função quotedstr já faz isso?
Porque você está inserindo o #39 (aspas simples), se a função quotedstr já faz isso?
GOSTEI 0
Alerocha
18/08/2003
Está dando uma função de excesso de parametros. Mas além disso eu acho que a função execsql está errada ou não?
Qual é exatamente o problema que ocorre?
Porque você está inserindo o #39 (aspas simples), se a função quotedstr já faz isso?
GOSTEI 0
Abueno_silva
18/08/2003
Desculpe, passei batido pela execsql... Na verdade, ela é uma procedure que não recebe nenhum parâmetro. Você tem que montar o insert com a procedure SQL.Add antes:
ibdataset1.sql.clear;
ibdataset1.sql.add(´insert into teste(nome,idade)´);
ibdataset1.sql.add(´values (´);
ibdataset1.sql.add(QuotedStr(copy(LINHA,1,postab-1)) + ´,´);
ibdataset1.sql.add(copy(LINHA,postab+1,tam-postab) + ´ )´);
ibdataset1.ExecSQL;
Tente assim, e verifique se os valores retornados pela função copy estão corretos.
[]´s
ibdataset1.sql.clear;
ibdataset1.sql.add(´insert into teste(nome,idade)´);
ibdataset1.sql.add(´values (´);
ibdataset1.sql.add(QuotedStr(copy(LINHA,1,postab-1)) + ´,´);
ibdataset1.sql.add(copy(LINHA,postab+1,tam-postab) + ´ )´);
ibdataset1.ExecSQL;
Tente assim, e verifique se os valores retornados pela função copy estão corretos.
[]´s
GOSTEI 0
Abueno_silva
18/08/2003
Perdão... é a [b:879d5a7408]função[/b:879d5a7408] add, e não procedure...
GOSTEI 0
Alerocha
18/08/2003
Bueno,
Infelizmente não deu certo. Primeiro mudei o parametro
ibdataset1.sql para ibdataset1.selectsql pois sá assim funciona.
Mas depois de gerado dá um erro que náo acha a coluna idade, mas a mesma existe no interbase.
Infelizmente não deu certo. Primeiro mudei o parametro
ibdataset1.sql para ibdataset1.selectsql pois sá assim funciona.
Mas depois de gerado dá um erro que náo acha a coluna idade, mas a mesma existe no interbase.
GOSTEI 0
Abueno_silva
18/08/2003
Bom, eu não tenho muita experiência com ibdataset (sempre uso ibquery e ibsql). Como você só necessita incluir os registros de importação, sem ter um result set disponível, te aconselho a trocar o ibdataset por um ibsql, já que este, além de ser mais simples de utilizar, é muito mais rápido (justamente por não produzir um result set).
A sintaxe é exatamente a que lhe passei anteriormente, você só precisa trocar o ExecSql por ExeqQuery;
Tente isto que deve dar certo.
[]´s
A sintaxe é exatamente a que lhe passei anteriormente, você só precisa trocar o ExecSql por ExeqQuery;
Tente isto que deve dar certo.
[]´s
GOSTEI 0
Alerocha
18/08/2003
Eu fiz a mudança que vc me sugeriu.
IBsql1.sql.clear;
IBsql1.sql.add(´insert into teste(nome,idade)´);
IBsql1.sql.add(´values (´);
IBsql1.sql.add(QuotedStr(copy(LINHA,1,postab-1)) + ´,´);
IBsql1.sql.add(copy(LINHA,postab+1,tam-postab) + ´ )´);
IBsql1.execquery;
Mas quando importa da um erro que não existe a coluna idade?
Vc tem algum exemplo de importar arquivo que vc já utilizou. Assim eu posso verificar onde está meu erro.
Obrigado
IBsql1.sql.clear;
IBsql1.sql.add(´insert into teste(nome,idade)´);
IBsql1.sql.add(´values (´);
IBsql1.sql.add(QuotedStr(copy(LINHA,1,postab-1)) + ´,´);
IBsql1.sql.add(copy(LINHA,postab+1,tam-postab) + ´ )´);
IBsql1.execquery;
Mas quando importa da um erro que não existe a coluna idade?
Vc tem algum exemplo de importar arquivo que vc já utilizou. Assim eu posso verificar onde está meu erro.
Obrigado
GOSTEI 0
Abueno_silva
18/08/2003
Eu poderia passar alguns exemplos de insert para você (não necessariamente de um arquivo texto), mas acho que agora o problema está no banco. Você tem certeza que a coluna está com o nome idade? Você por um acaso não poderia me passar a estrutura da tabela teste para que pudesse verificar?
GOSTEI 0
Alerocha
18/08/2003
A estrutura da tabela teste é
CREATE TABLE ´TESTE´
(
´ID´INTEGER NOT NULL,
´NOME´VARCHAR(50),
´IDADE´VARCHAR(2),
CONSTRAINT ´FK_TESTE´ PRIMARY KEY (´ID´)
);
Como o projeto é um teste para um outro projeto. Eu posso passar o projeto junto com o banco que é muito pequeno.
Se der me passe estes aruivos de insert que eu tento ver alguma coisa
segue meu email alebraga@globo.com
CREATE TABLE ´TESTE´
(
´ID´INTEGER NOT NULL,
´NOME´VARCHAR(50),
´IDADE´VARCHAR(2),
CONSTRAINT ´FK_TESTE´ PRIMARY KEY (´ID´)
);
Como o projeto é um teste para um outro projeto. Eu posso passar o projeto junto com o banco que é muito pequeno.
Se der me passe estes aruivos de insert que eu tento ver alguma coisa
segue meu email alebraga@globo.com
GOSTEI 0
Abueno_silva
18/08/2003
Vou lhe providenciar os arquivos de insert assim que puder. Enquanto isso, já que o campo idade é varchar, tente a seguinte modificação na query:
na linha:
IBsql1.sql.add(copy(LINHA,postab+1,tam-postab) + ´ )´);
troque por:
IBsql1.sql.add(quotedstr(copy(LINHA,postab+1,tam-postab)) + ´ )´);
na linha:
IBsql1.sql.add(copy(LINHA,postab+1,tam-postab) + ´ )´);
troque por:
IBsql1.sql.add(quotedstr(copy(LINHA,postab+1,tam-postab)) + ´ )´);
GOSTEI 0
Alerocha
18/08/2003
Agora foi, mais surgiu um novo problema.
Validation error for column ID, value ***null***.
Tenho que inserir um número nesta columa, mas como.
Validation error for column ID, value ***null***.
Tenho que inserir um número nesta columa, mas como.
GOSTEI 0
Abueno_silva
18/08/2003
Blz... já lhe enviei um mail com um exemplo simples de insert e update, e nele tem exatamente o seu problema (campo PK null). Ele pode ir desse jeito mesmo, ou como está no e-mail(não identifiquei as colunas por inserir todos os dados), mas no IB/FB você tem que criar um generator e um trigger para gerar o ID automaticamente:
Para criar o generator:
CREATE GENERATOR GEN_TESTE_ID;
SET GENERATOR GEN_TESTE_ID TO 0;
Para criar o trigger:
SET TERM ^ ;
/* Trigger: TESTE_BI0 */
CREATE TRIGGER TESTE_BI0 FOR TESTE
ACTIVE BEFORE INSERT POSITION 0
AS
begin
if (new.ID is null) then
new.ID = gen_id(GEN_TESTE_ID,1);
end
^
Isso vai funcionar como um campo auto-increment...
[]´s
Para criar o generator:
CREATE GENERATOR GEN_TESTE_ID;
SET GENERATOR GEN_TESTE_ID TO 0;
Para criar o trigger:
SET TERM ^ ;
/* Trigger: TESTE_BI0 */
CREATE TRIGGER TESTE_BI0 FOR TESTE
ACTIVE BEFORE INSERT POSITION 0
AS
begin
if (new.ID is null) then
new.ID = gen_id(GEN_TESTE_ID,1);
end
^
Isso vai funcionar como um campo auto-increment...
[]´s
GOSTEI 0
Alerocha
18/08/2003
Eu inserir o campo null criei a Tigger, mas agora da um erro de
violação da chave primaria ou chave unica constraint ´fk_teste´.
No banco de dados já existem alguns registros
violação da chave primaria ou chave unica constraint ´fk_teste´.
No banco de dados já existem alguns registros
GOSTEI 0
Abueno_silva
18/08/2003
Você tem duas opções: ou apaga os registros que já existem (para não acontecer duplicidade de chave primária como agora), ou exclui o generator (drop generator gen_teste_id) e o cria novamente, com o id de início maior do que os registros que você já tem:
CREATE GENERATOR GEN_TESTE_ID;
SET GENERATOR GEN_TESTE_ID TO <id inicial>;
[]´s
CREATE GENERATOR GEN_TESTE_ID;
SET GENERATOR GEN_TESTE_ID TO <id inicial>;
[]´s
GOSTEI 0
Alerocha
18/08/2003
Bueno,
consegui achar o erro. Muito obrigado pela ajuda.
At
Alexandre
consegui achar o erro. Muito obrigado pela ajuda.
At
Alexandre
GOSTEI 0
Abueno_silva
18/08/2003
Falta o ReadLn:
While not(Eof(TEXTO) do
Begin
[b:9a10c1922c] Readln(TEXTO,LINHA);[/b:9a10c1922c]
tam := length(LINHA);
postab := pos(#9,LINHA);
...
End;
[]´s
While not(Eof(TEXTO) do
Begin
[b:9a10c1922c] Readln(TEXTO,LINHA);[/b:9a10c1922c]
tam := length(LINHA);
postab := pos(#9,LINHA);
...
End;
[]´s
GOSTEI 0