Importar TXT com open dialog?

Delphi

18/08/2003

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


Alerocha

Alerocha

Curtidas 0

Respostas

Abueno_silva

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?


GOSTEI 0
Alerocha

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

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


GOSTEI 0
Abueno_silva

Abueno_silva

18/08/2003

Perdão... é a [b:879d5a7408]função[/b:879d5a7408] add, e não procedure...


GOSTEI 0
Alerocha

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.


GOSTEI 0
Abueno_silva

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


GOSTEI 0
Alerocha

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


GOSTEI 0
Abueno_silva

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

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


GOSTEI 0
Abueno_silva

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)) + ´ )´);


GOSTEI 0
Alerocha

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.


GOSTEI 0
Abueno_silva

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


GOSTEI 0
Alerocha

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


GOSTEI 0
Abueno_silva

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


GOSTEI 0
Alerocha

Alerocha

18/08/2003

Bueno,

consegui achar o erro. Muito obrigado pela ajuda.

At

Alexandre


GOSTEI 0
Abueno_silva

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


GOSTEI 0
POSTAR