Valor nulo em parâmetro de SQL

Delphi

14/12/2004

Olá pessoal,
Estou trabalhando num programa que gera SQLs dinâmicas para inserir valores numa tabela. Sendo dinâmica, às vezes os parâmetros ficam nulos, pois não tem nenhum dado a ser inserido, e ao executar a query, volta um erro pq um parâmetro tem valor nulo. Há uma maneira de eu contornar isso, mantendo, de fato, os parâmetros sem valor algum?

Obrigado


Garibaldi

Garibaldi

Curtidas 0

Respostas

Bon Jovi

Bon Jovi

14/12/2004

Nesses casos prefiro nao usar parametros. Mas tente o seguinte:

Se for ADO:
ADODataSet1.Parameters.ParamByName(´xxx´).Value := Unassigned;

Outros:
SQLQuery1.ParamByName(´xxx´).Clear;


GOSTEI 0
Garibaldi

Garibaldi

14/12/2004

[quote:c9e21dffd0=´Bon Jovi´]Nesses casos prefiro nao usar parametros. Mas tente o seguinte:

Se for ADO:
ADODataSet1.Parameters.ParamByName(´xxx´).Value := Unassigned;

Outros:
SQLQuery1.ParamByName(´xxx´).Clear;[/quote:c9e21dffd0]

Não é que eu explicitamente queira que o parâmetro fique nulo, o problema é q os parâmetros recebem valores dinamicamente através da propriedade Value, já que pode ser um integer, currency, string OU NULL. Só que quando faço SQLQuery.ExecSQL(false) com algum parâmetro nul, volta um erro dizendo que o parãmetro não tem nenhum valor, e eu só queria que inserisse um valor nulo mesmo.


GOSTEI 0
Renato_sp

Renato_sp

14/12/2004

Que banco de dados esta utilizando? e ao ser feito a base dos dados colocou o campo permitindo null? verifique se eles estao como not null ( pq ai nao pode ser aceito valores nulos ).
De mais detalhes dos dados , da estrutura da tabela etc que fica mais facil de solucionar seu problema, de principio verifica a estrutura dos dados

Ate mais...
Renato / SP


GOSTEI 0
Bon Jovi

Bon Jovi

14/12/2004

Tinha entendido errado, pensei q vc quisesse que o parâmetro fosse desconsiderado.

Mas então, confira isso q o colega acima perguntou e tb verifique se as propriedades ParamType e DataType dos parâmetros estão setados corretamente em relação ao tipo de dados no banco. Ex.:

object SQLQuery1: TSQLQuery
  Params = <
    item
      DataType = ftInteger
      Name = ´CAMPO´
      ParamType = ptInput
    end>
  SQL.Strings = (
    ´INSERT INTO TABELA´
    ´(CAMPO)´
    ´VALUES´
    ´(:CAMPO)´
    )
  SQLConnection = SQLConnection1
end


Daí deve funcionar:

SQLQuery1.ParamByName(´CAMPO´).Value := Null;
SQLQuery1.ExecSQL(False);


GOSTEI 0
Garibaldi

Garibaldi

14/12/2004

A princípio, estou utilizando para testes, um banco baseado em Firebird. O problema não é o campo ser obrigatório, já verifiquei isso, estou testando num campo qualquer, sem ser obrigatório. Todos os campos que eu passo valores, independentemente do tipo, são gravados corretamente, só não funciona qdo é nulo
Deixe me tentar explicar de novo, monto uma query para inserir valores numa tabela. Esses valores são passados para parâmetros antes da execução do INSERT, e esses valores vem de uma query normal (SELECT), e portanto, o tipo ou o conteúdo a ser passado para o parâmetro está fora do meu controle. Tudo funciona, menos quando um parâmetro fica simplesmente vazio.
Vejam um exemplo genérico:

[color=green:055d88e50e]while not SQLQuery1.Eof do
begin
SQLQuery2.ParamByName(´xxx´).Value:= Query1.FieldByName(´xxx´).Value; //se este valor for nulo, nada feito, dá pau no ExecSQL...
SQLQuery1.Next;
end;
Query2.ExecSQL(false);[/color:055d88e50e]

Sacaram minha jogada??

Uma das soluções que brotaram na minha cabeça seria verificar quais campos são nulos e eliminar os parâmetros correspondentes, mas isso iria desestruturar todo o procedimento que criei.

Por enquanto galera, só tenho a agradecer a atenção, valeu :wink:


GOSTEI 0
Garibaldi

Garibaldi

14/12/2004

[quote:2ce04820f1=´Bon Jovi´]
...verifique se as propriedades ParamType e DataType dos parâmetros estão setados corretamente em relação ao tipo de dados no banco. Ex.:

[/quote:2ce04820f1]

Aliás, capaz q é só essa bobeira de DataType....vou dar uma olhada, valeu


GOSTEI 0
Vanius

Vanius

14/12/2004

Bom dia Garibaldi.

Tive um probleminha destes a um tempo atrás.
Tive q alterar a query quando o valor é NULL.
exemplo.:

WHERE CodCliente = NULL // isto realmente da pau

Alterei para
WHERE CodCliente IS NULL

entao, o codigo ficou +- assim
if variavel <> NULL then
begin
SQL.Add(´AND CodCliente = :pCodCliente´);
ParamByName(´pCodCliente´).Value := Variavel;
end else
begin
SQL.Add(´AND CodCliente IS NULL´);
end;

Espero ter ajudado.

Abraços,

Vanius Girodo


GOSTEI 0
Garibaldi

Garibaldi

14/12/2004

Olá pessoal,
Venho agradecer a ajuda que vocês me deram, aparentemente, o problema está resolvido. O que fiz foi verificar se o campo era nulo e, caso fosse, apenas arrumar a propriedade DataType (valeu por lembrar Bon Jovi), do contrário, só passo o parâmetro e funciona muito bem.
Vejam o que fiz foi:

[color=green:db0d0a13c1]while not SQLQuery1.Eof do
begin
if VarIsNull(SQLQuery1.FieldByName(´xxx´).Value) then
SQLQuery2.ParamByName(´xxx´).DataType:= SQLQuery1.FieldByName(´xxx´).DataType
else SQLQuery2.ParamByName(´xxx´).Value:= SQLQuery1.FieldByName(´xxx´).Value;
SQLQuery1.Next;
end;
SQLQuery2.ExecSQL(false); [/color:db0d0a13c1]


Obrigado a todos :D


GOSTEI 0
POSTAR