Parâmetro de SQL = Null
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:
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
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
Curtidas 0
Melhor post
Massuda
22/02/2005
Os Erros no Exmplo do Massuda é Invalid Type...
Experimente mudar paraif 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
22/02/2005
Vc pode colocar de duas formas:
Ou
Se não me engano com isso vc consegue passar nulo. espero poder te ajudar
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
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;
Não testei, mas agredito que funcione certinho...
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
22/02/2005
Não funciona, ele nem compila.
Já testei várias formas inclusive passando Null que também dá erro.
agradecido
Já testei várias formas inclusive passando Null que também dá erro.
agradecido
GOSTEI 0
Marcio.theis
22/02/2005
O que não funciona e nem compila?
GOSTEI 0
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
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
22/02/2005
Você pode passar ´//´ Como se fosse null?
GOSTEI 0
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
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;
Depois é so passar Null.
Exemplo :
qryTeste.Parameters.ParamByName(´Parametro´).DataType = ftInteger;
qryTeste.Parameters.ParamByName(´Parametro´).Value = Null;
GOSTEI 0
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...
Até+
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
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
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
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
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
é 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
22/02/2005
Blz Massuda.
Problema resolvido.
obrigado a todos e fica aqui registrada essa solução.
abraço
Diogo
Problema resolvido.
obrigado a todos e fica aqui registrada essa solução.
abraço
Diogo
GOSTEI 0
Replicante
22/02/2005
Amigos, não seria mais fácil usar:
Testei e gravou tranquilo.
if Edit3.text <> ´´ then ParamByName(DATA_NASC´).AsDate := StrtoDate(Edit3.Text) else ParamByName(DATA_NASC´).IsNull;
Testei e gravou tranquilo.
GOSTEI 0
Massuda
22/02/2005
TParam.IsNull é uma propriedade read-only que indica se o parâmetro é NULL. No seu exemplo, a linhanão altera o valor do parâmetro, apenas testa se ele é NULL.
ParamByName(DATA_NASC´).IsNull;
GOSTEI 0
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
22/02/2005
Olá
IsNull não seta NULL no campo. Ele apenas verifica isso, como disse o Massuda.
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é+
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