Fórum Valor nulo em parâmetro de SQL #261834

14/12/2004

0

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

Responder

Posts

14/12/2004

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;


Responder

Gostei + 0

14/12/2004

Garibaldi

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


Responder

Gostei + 0

14/12/2004

Renato_sp

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


Responder

Gostei + 0

14/12/2004

Bon Jovi

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);


Responder

Gostei + 0

15/12/2004

Garibaldi

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:


Responder

Gostei + 0

15/12/2004

Garibaldi

[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


Responder

Gostei + 0

15/12/2004

Vanius

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


Responder

Gostei + 0

15/12/2004

Garibaldi

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


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar