Valor nulo em parâmetro de SQL
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
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
Curtidas 0
Respostas
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;
Se for ADO:
ADODataSet1.Parameters.ParamByName(´xxx´).Value := Unassigned;
Outros:
SQLQuery1.ParamByName(´xxx´).Clear;
GOSTEI 0
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.
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
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
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
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.:
Daí deve funcionar:
SQLQuery1.ParamByName(´CAMPO´).Value := Null;
SQLQuery1.ExecSQL(False);
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
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:
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
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
...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
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
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
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
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