Parâmetro de SQL = Null

Delphi

22/02/2005

Olá Pessoal
Estou com o seguinte problema.
Tenho Inserts e Updates via Sql que recebem parametros. Só que em alguns casos os parametros recebem Null, neste momento a Sql dá erro pq tem q receber algum valor.
Exemplo:
  with Q do
  begin
    Close;
    Sql.Clear;
    SQL.Add(´INSERT INTO CLIENTES´);
    SQL.Add(´(CODIGO,NOME,DATA_NASC)´);
    SQL.Add(´VALUES
    SQL.Add(´(:CODIGO,:NOME,:DATA_NASC)´);
    ParamByName(´CODIGO´).AsInteger := StrtoInt(Edit1.Text);
    ParamByName(´NOME´).AsString := Edit2.Text;
    if Edit3.text <> ´´ then
      ParamByName(DATA_NASC´).AsDate := StrtoDate(Edit3.Text);
    ExecSql;
  end;

O problema está na Data_Nasc que pode ou não ter valor. Antes de passá-la verifico se tem valor caso não tenha, como faço para passar um valor Null para o parametro DT_NASC ?

agradecido
Diogo


Diogoalles

Diogoalles

Curtidas 0

Melhor post

Massuda

Massuda

22/02/2005

Os Erros no Exmplo do Massuda é Invalid Type...
Experimente mudar para
if Edit3.text <> ´´ then 
  ParamByName(DATA_NASC´).AsDate := StrtoDate(Edit3.Text) 
else 
  with ParamByName(DATA_NASC´) do begin 
    DataType = ftDate;
    Clear; 
    Bound := True; 
  end;



GOSTEI 1

Mais Respostas

Cristiam

Cristiam

22/02/2005

Vc pode colocar de duas formas:

if Edit3.text <> ´´ then 
      ParamByName(DATA_NASC´).AsDate := StrtoDate(Edit3.Text); 
else
 ParamByName(DATA_NASC´).AsDate := nil; 
     

Ou
 ParamByName(DATA_NASC´).AsDate := ´´;

Se não me engano com isso vc consegue passar nulo. espero poder te ajudar


GOSTEI 0
Marcio.theis

Marcio.theis

22/02/2005

Bom... nestes casos eu utilizo uma forma diferente para fazer estes inserts....

declaro duas variáveis do tipo string, exemplo: campo, valor: String;

campo:=´CODIGO´;
valor:=Edit1.Text; 
campo:=campo + ´, NOME´;
valor:=valor + ´, ´´´ + Edit2.Text + ´´´´; 
if Edit3.text <> ´´ then 
    begin
    campo:=campo + ´, DATA_NASC´;
    valor:=valor + ´, ´´´ + ConverteData(Edit3.Text) + ´´´´; 
    end;
with Q do 
    begin 
    Close; 
    Sql.Clear; 
    SQL.Add(´INSERT INTO CLIENTES´); 
    SQL.Add(´(´ + campo + ´)´); 
    SQL.Add(´VALUES (´ + valor + ´)´);
    ExecSql; 
    end;


Não testei, mas agredito que funcione certinho...


GOSTEI 0
Diogoalles

Diogoalles

22/02/2005

Não funciona, ele nem compila.
Já testei várias formas inclusive passando Null que também dá erro.

agradecido


GOSTEI 0
Marcio.theis

Marcio.theis

22/02/2005

O que não funciona e nem compila?


GOSTEI 0
Diogoalles

Diogoalles

22/02/2005

Olá Mat,
desculpe, mas não funciona a sugestão do ´cristiam´, a sua idéia está ok.
só que como tenho um sistema com mais de 70 Sql onde posso ter valores Null eu gostaria de ver se não tem somente um paramêtro Null pra passar.

agradecido
Diogo


GOSTEI 0
Cristiam

Cristiam

22/02/2005

Você pode passar ´//´ Como se fosse null?


GOSTEI 0
Massuda

Massuda

22/02/2005

Segundo a Ajuda do Delphi, isto devia funcionar:
  with Q do
  begin
    Close;
    Sql.Clear;
    SQL.Add(´INSERT INTO CLIENTES´);
    SQL.Add(´(CODIGO,NOME,DATA_NASC)´);
    SQL.Add(´VALUES
    SQL.Add(´(:CODIGO,:NOME,:DATA_NASC)´);
    ParamByName(´CODIGO´).AsInteger := StrtoInt(Edit1.Text);
    ParamByName(´NOME´).AsString := Edit2.Text;
    if Edit3.text <> ´´ then
      ParamByName(DATA_NASC´).AsDate := StrtoDate(Edit3.Text)
    else 
      with ParamByName(DATA_NASC´) do begin
        Clear;
        Bound := True;
      end;
    ExecSql;
  end;



GOSTEI 0
Rjun

Rjun

22/02/2005

Defina seu parametro do tipo igual ao do campo no banco de dados.

Depois é so passar Null.

Exemplo :


qryTeste.Parameters.ParamByName(´Parametro´).DataType = ftInteger;
qryTeste.Parameters.ParamByName(´Parametro´).Value = Null;


GOSTEI 0
Paulo_amorim

Paulo_amorim

22/02/2005

Olá

Pode-se usar a funçao Clear também não? Até onde eu lembro isso passa NULL pro parâmetro...
qry.ParamByName(´p1´).Clear;


Até+


GOSTEI 0
Diogoalles

Diogoalles

22/02/2005

bem pessoal,
realizei mais uma série de testes e nenhuma das sugestões funcionou.

para o ´qry.ParamByName(´p1´).Clear;´ e para a questão do Massuda, todas deram erro no execsql, não aceitando.

se alguem ainda tiver uma ideia fico agradecido

abraço
Diogo


GOSTEI 0
Massuda

Massuda

22/02/2005

para o ´qry.ParamByName(´p1´).Clear;´ ... todas deram erro no execsql, não aceitando.
Que erro extatamente ocorreu?

(não se ofenda com a pergunta!) Por acaso, na definição da tabela CLIENTES, o campo DATA_NASC está como NOT NULL ou coisa parecida?


GOSTEI 0
Diogoalles

Diogoalles

22/02/2005

Olá,
é um Campo normal DATE não é chave nem nada e não é obrigatório valor.
mas o caso não seria só para compos DATE, para campos números, data, hora..(exceto String) dá erro.

Os Erros no Exmplo do Massuda é Invalid Type,
as outras mensagens são que o parametro precisa de valor ou que o valor recebido pelo campo é inválido.

agradecido
Diogo


GOSTEI 0
Diogoalles

Diogoalles

22/02/2005

Blz Massuda.
Problema resolvido.

obrigado a todos e fica aqui registrada essa solução.

abraço
Diogo


GOSTEI 0
Replicante

Replicante

22/02/2005

Amigos, não seria mais fácil usar:
if Edit3.text <> ´´ then 
  ParamByName(DATA_NASC´).AsDate := StrtoDate(Edit3.Text) 
else 
  ParamByName(DATA_NASC´).IsNull;

Testei e gravou tranquilo.


GOSTEI 0
Massuda

Massuda

22/02/2005

TParam.IsNull é uma propriedade read-only que indica se o parâmetro é NULL. No seu exemplo, a linha
ParamByName(DATA_NASC´).IsNull;
não altera o valor do parâmetro, apenas testa se ele é NULL.


GOSTEI 0
Replicante

Replicante

22/02/2005

Amigo, aqui eu atribui essa propriedade p/ gravar o ´null´ na tabela, e obtive sucesso. Segue o código que utilizei.
if round(variável) = 0 then
   begin
   qryAUX.Params[0].DataType := ftDate;        
   qryAUX.ParamByName(´VALOR).IsNull;
   end
else
   qryAUX.ParamByName(´VALOR´).AsDate := wDtSCtb;



GOSTEI 0
Paulo_amorim

Paulo_amorim

22/02/2005

Olá

IsNull não seta NULL no campo. Ele apenas verifica isso, como disse o Massuda.
property IsNull: Boolean; Description Inspect IsNull to determine if the field contains a value. If IsNull is True, the field is blank. If IsNull is False, the field has a value.


O que provavelmente acontece eh que vc não informa valor nenhum, e então ele está assumindo Null por causa do parâmetro ser ftDate...

Até+


GOSTEI 0
POSTAR