Duvida delphi insert

Galera estou usando apenas o datamodule para gravar no banco…isso é certo?
tipo o erro que ocorre éh:
quando eu passo os valores por exemplo… nome = MARIA, acontece o seguinte erro… unknown coluna MARIA???o_O

DataModule1.conn.ExecuteDirect('insert into pessoas (NOME, CPF, TELEFONE)'+ ' values('+pessoa.Nome+','+pessoa.Cpf+','+pessoa.Telefone+')');

GRATO.

Fala Java_Terminator!
Então, este erro é o típico “coluna não encontrada” da tabela.
Está apontando certinho pro banco correto na conexão?

Até mais!

Tenta jogar este trecho de código em um ShowMessage() pra ver como a instrução está ficando:

(‘insert into pessoas (NOME, CPF, TELEFONE)’+
’ values(’+pessoa.Nome+’,’+pessoa.Cpf+’,’+pessoa.Telefone+’)’);

Só complementanto:

Está correto você utilizar o DataModule para fazer as suas consultas, insert’s e etc.
Mas no seu DataModule você deve ter um trio de ClientDataSet, DataSetProvider e SQLDataSet (ou SQLQuery), imagino eu.

Assim, ficaria melhor você inserir por um ClientDataSet mesmo do que por um SQLConnection de forma direta,
já que você tem o benefício do tratamento de erros do DataSetProvider e da manipulação dos data packages
criados pelo Provider.

E seria interessante você ter funções no seu DataModule para inserir registros em vez de chamar a inserção
pela instância do DataModule.

DataModule.inserePessoa();
E no insere pessoa você trabalha com o ClientDataSet.

Fica só como dica: :wink:

Abraços!

Como o gbpereira disse (bem de Delpheiro) pode colocar a instrução em um ShowMessage.
Provavelmente você verá que as aspas são retiradas e a instrução ficará como:

insert into pessoas (NOME, CPF, TELEFONE) values (MARIA, 12345987, 123456789));

Ou seja, ele entenderá como Colunas!
Uma dica é usar QuotedStr para não ter estes problemas. :wink:

Até mais!

Bom, escrevi um exemplo simples só pra mostrar o que poderia ser feito:

  Pessoa := TPessoa.Create();
  Pessoa.Nome     := 'Alexandre';
  Pessoa.CPF        := '12345';
  Pessoa.Telefone := '12345';

  Instrucao := 'insert into (NOME, CPF) values (' + QuotedStr(Pessoa.Nome) + ', ' + QuotedStr(Pessoa.CPF) + ', ' + QuotedStr(Pessoa.Telefone) + ')';
  DataModule.Conexao.ExecuteDirect(Instrucao);

Levanto em consideração que seu telefone e CPF são do tipo String
Há outras formas bem melhores de se fazer esta inserção, utilizando parâmetros, semelhante ao que se faz em Java com o PrepareStatement.

Abraços!

AlexandreGama , perfeito seu exemplo…
obrigado.

Ja aproveitando … como que eu poderia fazer o select;;;
utitlizando esse componente que eu estou usando?
Isso daqui funciona? se sim, como guardar os valoes ? :smiley:

DataModule1.conn.ExecuteDirect(‘select * from pessoa’);
grato.

Que bom que foi útil!
Até mais!

Escrevi enquanto você postava! hehe

Com o select eu faria utilizando um SQLDataSet.

Você pode colocar no seu DataModule um SQLDataSet (paleta dbExpress) e conectá-lo ao seu SQLConnection
pela propriedade SQLConnection do seu SQLDataSet.

Na propriedade CommandText do SQLDataSet você coloca a sua consulta inteira e via código você poderia ter:

SQLDataSet.Open();
Pessoa.Nome := SQLDataSet.FieldByName('NOME').AsString;
ShowMessage(Pessoa.Nome);  //só pra teste mesmo

Onde o FieldByName é o nome da sua coluna no Banco de Dados.

Você pode incrementar isso adicionando, como eu disse, um ClientDataSet e um DataSetProvider pra uma manipulação
melhor dos dados.

Até mais!

Não mencionei um detalhe:
Sobre a sua dúvida de guardar valores

Na verdade quando você faz SQLDatSet.Open() os seus dados são retornados para
este SQLDataSet e por um while por exemplo, você pode percorrer este DataSet
e pegar todos os valores.

Exemplo:

SQLDataSet.Open();
SQLDataSet.First;

while not SQLDataSet.Eof do
begin
   ShowMessage(SQLDataSet.FieldByName('NOME').AsString);
   SQLDataSet.Next;
end;

Você poderia manipular, a grosso modo, como se faz em Java, com ArrayList.

Abraços!

AlexandreGama , tu é fera mesmo…
Obrigado…

Que bom que está funcionando por aí!!
Precisando, só postar! :wink:

Até mais!