Parâmetro de SQL = Null

22/02/2005

107

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


Responder

Post mais votado

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;



Responder

Mais Posts

22/02/2005

Cristiam

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


Responder

22/02/2005

Marcio.theis

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...


Responder

22/02/2005

Diogoalles

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

agradecido


Responder

22/02/2005

Marcio.theis

O que não funciona e nem compila?


Responder

22/02/2005

Diogoalles

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


Responder

22/02/2005

Cristiam

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


Responder

22/02/2005

Massuda

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;



Responder

22/02/2005

Rjun

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;


Responder

22/02/2005

Paulo_amorim

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é+


Responder

22/02/2005

Diogoalles

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


Responder

22/02/2005

Massuda

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?


Responder

22/02/2005

Diogoalles

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


Responder

22/02/2005

Diogoalles

Blz Massuda.
Problema resolvido.

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

abraço
Diogo


Responder

23/02/2005

Replicante

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.


Responder

23/02/2005

Massuda

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.


Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar