Ir para conteúdo
  • Cadastre-se

dev botao

Salvando String com valor null no postgres utilizando DBExpress e conexão ODBC


  • Este tópico foi criado há 1669 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Boa tarde Pessoal,

   Estou com a seguinte dificuldade.

       - Tenho um campo chamado usuario do tipo character varying em uma tabela com base de dados Postgres.

       - Utilizo o DBExpress com a conexão ODBC

      - Preciso Salvar esse campo em uma determinada situação como null, mais ele sempre esta salvando como ''. Faço da seguinte forma:

                ClientDataset.Edit;
                ClientDataset.FieldByName('usuario=').AsString := '';
                ClientDataset.post;
                ClientDataset.ApplyUpDates(-1);

    Pesquisei e tentei fazer assim, mas ai ele me retorna erro: 'No error Information; Error while executing the query':

                ClientDataset.Edit;
                ClientDataset.FieldByName('usuario').Value := Null;
                ClientDataset.post;
                ClientDataset.ApplyUpDates(-1);

  Se faço o mesmo teste usando Firedac ele salva corretamente como null, tanto usando conexão ODBC como direto pelo driver do Postgres.

  Resumindo, tem alguem que utilize DBExpress com ODBC e conexão postgres, que consiga ou saiba salvar null um campo String?

 

 

Editado por douglas_k
Link para o comentário
Compartilhar em outros sites

Em 21/08/2019 at 14:40, douglas_k disse:

Boa tarde Pessoal,

   Estou com a seguinte dificuldade.

       - Tenho um campo chamado usuario do tipo character varying em uma tabela com base de dados Postgres.

       - Utilizo o DBExpress com a conexão ODBC

      - Preciso Salvar esse campo em uma determinada situação como null, mais ele sempre esta salvando como ''. Faço da seguinte forma:

                ClientDataset.Edit;
                ClientDataset.FieldByName('usuario=').AsString := '';
                ClientDataset.post;
                ClientDataset.ApplyUpDates(-1);

    Pesquisei e tentei fazer assim, mas ai ele me retorna erro: 'No error Information; Error while executing the query':

                ClientDataset.Edit;
                ClientDataset.FieldByName('usuario').Value := Null;
                ClientDataset.post;
                ClientDataset.ApplyUpDates(-1);

  Se faço o mesmo teste usando Firedac ele salva corretamente como null, tanto usando conexão ODBC como direto pelo driver do Postgres.

  Resumindo, tem alguem que utilize DBExpress com ODBC e conexão postgres, que consiga ou saiba salvar null um campo String?

 

 

Ainda não encontrei a solução, acredito que vou trocar nesse caso para firedac essas leituras, mais se alguém tiver alguma solução para o DBExpress me avise.

 

Obrigado.

Link para o comentário
Compartilhar em outros sites

  • Consultores

Até onde me lembro o código deveria ser algo como:

                ClientDataset.Edit;
                ClientDataset.FieldByName('usuario').Clear;
                ClientDataset.post;
                ClientDataset.ApplyUpDates(-1); 

 

  • Curtir 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

1 hora atrás, EMBarbosa disse:

Até onde me lembro o código deveria ser algo como:


                ClientDataset.Edit;
                ClientDataset.FieldByName('usuario').Clear;
                ClientDataset.post;
                ClientDataset.ApplyUpDates(-1); 

 

Boa tarde, Obrigado pela sugestão. Testei de algumas formas assim, usando o Clear, mais devo estar fazendo algo incorreto, pois mesmo o código executando e não retornando nenhum erro, na base de dados o valor não salva, ele sempre fica com o valor já salvo no campo string. Testei com duas tabelas diferentes, com clientdatasets diferentes e não tive sucesso.

 

Obrigado.

Link para o comentário
Compartilhar em outros sites

  • Consultores
Agora, douglas_k disse:

Boa tarde, Obrigado pela sugestão. Testei de algumas formas assim, usando o Clear, mais devo estar fazendo algo incorreto, pois mesmo o código executando e não retornando nenhum erro, na base de dados o valor não salva, ele sempre fica com o valor já salvo no campo string. Testei com duas tabelas diferentes, com clientdatasets diferentes e não tive sucesso.

 

Obrigado.

Se no lugar do clear acontecer o mesmo problema com outros valores então possivelmente é problema na lógica mesmo. Talvez controle transacional.

  • Curtir 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

5 minutos atrás, EMBarbosa disse:

Se no lugar do clear acontecer o mesmo problema com outros valores então possivelmente é problema na lógica mesmo. Talvez controle transacional.

Na verdade se salvo outros valores ele faz corretamente, se por exemplo mover o valor 'Teste' ele salva corretamente, agora o .Clear, simplesmente não altera o valor, fica o mesmo que ja estava.

Link para o comentário
Compartilhar em outros sites

8 minutos atrás, douglas_k disse:

Na verdade se salvo outros valores ele faz corretamente, se por exemplo mover o valor 'Teste' ele salva corretamente, agora o .Clear, simplesmente não altera o valor, fica o mesmo que ja estava.

Só para exemplificar, nessa sequencia de testes todos executam e tem o resultado esperado, menos o ultimo que seria o .clear. Ele chega executar só não altera a base de dados.

  dmSupervisor.cldsTeste.Active := False;
  dmSupervisor.cldsTeste.CommandText := 'SELECT * ' +
                                         'FROM sis_usuarios ' +
                                         'WHERE login_siusua=:P1';
  dmSupervisor.cldsTeste.Params[0].DataType := ftString;
  dmSupervisor.cldsTeste.Params[0].AsString := '0';
  dmSupervisor.cldsTeste.Active := True;
  while not dmSupervisor.cldsTeste.Eof do
    begin
      dmSupervisor.cldsTeste.Edit;
      dmSupervisor.cldsTeste.FieldByName('nome_siusua').AsString := 'Teste';
      dmSupervisor.cldsTeste.post;
      dmSupervisor.cldsTeste.ApplyUpDates(-1);
      dmSupervisor.cldsTeste.Next;
    end;

  dmSupervisor.cldsTeste.Active := False;
  dmSupervisor.cldsTeste.CommandText := 'UPDATE sis_usuarios ' +
                                        'SET nome_siusua=null ' +
                                        'WHERE login_siusua=:P1';
  dmSupervisor.cldsTeste.Params[0].DataType := ftString;
  dmSupervisor.cldsTeste.Params[0].AsString := '0';
  dmSupervisor.cldsTeste.Execute;

  dmSupervisor.cldsTeste.Active := False;
  dmSupervisor.cldsTeste.CommandText := 'SELECT * ' +
                                        'FROM sis_usuarios ' +
                                        'WHERE login_siusua=:P1';
  dmSupervisor.cldsTeste.Params[0].DataType := ftString;
  dmSupervisor.cldsTeste.Params[0].AsString := '0';
  dmSupervisor.cldsTeste.Active := True;
  while not dmSupervisor.cldsTeste.Eof do
    begin
      dmSupervisor.cldsTeste.Edit;
      dmSupervisor.cldsTeste.FieldByName('nome_siusua').AsString := 'Outro Teste';
      dmSupervisor.cldsTeste.post;
      dmSupervisor.cldsTeste.ApplyUpDates(-1);
      dmSupervisor.cldsTeste.Next;
    end;

  dmSupervisor.cldsTeste.Active := False;
  dmSupervisor.cldsTeste.CommandText := 'SELECT * ' +
                                        'FROM sis_usuarios ' +
                                        'WHERE login_siusua=:P1';
  dmSupervisor.cldsTeste.Params[0].DataType := ftString;
  dmSupervisor.cldsTeste.Params[0].AsString := '0';
  dmSupervisor.cldsTeste.Active := True;
  while not dmSupervisor.cldsTeste.Eof do
    begin
      dmSupervisor.cldsTeste.Edit;
      dmSupervisor.cldsTeste.FieldByName('nome_siusua').Clear;
      dmSupervisor.cldsTeste.post;
      dmSupervisor.cldsTeste.ApplyUpDates(-1);
      dmSupervisor.cldsTeste.Next;
    end;

 

Link para o comentário
Compartilhar em outros sites

  • Consultores
29 minutos atrás, douglas_k disse:

Na verdade se salvo outros valores ele faz corretamente, se por exemplo mover o valor 'Teste' ele salva corretamente, agora o .Clear, simplesmente não altera o valor, fica o mesmo que ja estava.

Pode ser um bug no componente então. Ou no ClientDataSet ou no DBX que você usa por trás.

Lembro de ter tido um problema como esse. Estava até no QC da Embarcadero...

  • Obrigado 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

14 horas atrás, EMBarbosa disse:

Pode ser um bug no componente então. Ou no ClientDataSet ou no DBX que você usa por trás.

Lembro de ter tido um problema como esse. Estava até no QC da Embarcadero...

Show, contornei usando o update direto com sql, se encontrar alguma solução para o caso publico aqui.

Muito obrigado EMBarbosa.

Até mais.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 1669 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.