Fórum Valor nulo em parâmetro de SQL #261834
14/12/2004
0
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
Curtir tópico
+ 0Posts
14/12/2004
Bon Jovi
Se for ADO:
ADODataSet1.Parameters.ParamByName(´xxx´).Value := Unassigned;
Outros:
SQLQuery1.ParamByName(´xxx´).Clear;
Gostei + 0
14/12/2004
Garibaldi
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
14/12/2004
Renato_sp
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
14/12/2004
Bon Jovi
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
15/12/2004
Garibaldi
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
15/12/2004
Garibaldi
...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
15/12/2004
Vanius
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
15/12/2004
Garibaldi
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
Clique aqui para fazer login e interagir na Comunidade :)