GRAVANDO VALORES NULL NA TABELA
Olha eu aqui de novo!!!!
Estou com um [Ô]pequeno[Ô] probleminha ao gravar dados na tabela. (Estou utilizando o Sql Server Compact Edition 4.0)
Tenho um DataGridView preenchido com alguns dados e vou gravar esses dados na tabela:
Quando chega na linha [Ô]gravar.DataPagamento = null[Ô] -> ocorre um erro:
A consulta com parâmetros espera um valor de parâmetro que não foi fornecido.
tudo por causa do null, pois se eu colocar qualquer outra data ele aceita.
Defini na estrutura do banco de dados que esses dois campos deve permitir valores nulos;
Também defini na classe os campos anuláveis:
Como faço para gravar esses valores como null?
Estou com um [Ô]pequeno[Ô] probleminha ao gravar dados na tabela. (Estou utilizando o Sql Server Compact Edition 4.0)
Tenho um DataGridView preenchido com alguns dados e vou gravar esses dados na tabela:
for (int i = 0; i < dgvParcelas.Rows.Count; i++)
{
Lancamento gravar = new Lancamento();
gravar.Id = Convert.ToInt32(dgvParcelas.Rows[i].Cells[0].Value);
gravar.Quinzena = Convert.ToInt32(dgvParcelas.Rows[i].Cells[1].Value);
gravar.IdConta = Convert.ToInt32(dgvParcelas.Rows[i].Cells[2].Value);
gravar.DataVencimento = Convert.ToDateTime(dgvParcelas.Rows[i].Cells[4].Value);
gravar.Valor = Convert.ToDouble(dgvParcelas.Rows[i].Cells[5].Value);
gravar.DataPagamento = null;
gravar.ValorPago = null;
gravar.Insert();
}
Quando chega na linha [Ô]gravar.DataPagamento = null[Ô] -> ocorre um erro:
A consulta com parâmetros espera um valor de parâmetro que não foi fornecido.
tudo por causa do null, pois se eu colocar qualquer outra data ele aceita.
Defini na estrutura do banco de dados que esses dois campos deve permitir valores nulos;
Também defini na classe os campos anuláveis:
private DateTime? _dataPagamento;
[Browsable(true)]
[DisplayName([Ô]Pagamento[Ô])]
[DataObjectField(false, false, true)]
public DateTime? DataPagamento
{
get { return _dataPagamento; }
set { _dataPagamento = value; }
}
private double? _valorPago ;
[Browsable(true)]
[DisplayName([Ô]Pago[Ô])]
[DataObjectField(false, false, true)]
public double? ValorPago
{
get { return _valorPago ; }
set { _valorPago = value; }
}
Como faço para gravar esses valores como null?
Tente com um DBNull.Value
Já havia tentado, mas não aceita o DbNull.Value.
Cannot implicitly convert type [ô]System.DBNull[ô] to [ô]System.DateTime?[ô]
Cannot implicitly convert type [ô]System.DBNull[ô] to [ô]System.DateTime?[ô]
Ex:
cmd.Parameters.Add(New OleDbParameter([Ô]@data[Ô], DBNull.Value)
Desculpe, JABA, mas estou usando a OOP. Não estou utilizando comandos Sql com parâmetros.
Vou fazer um outro teste aqui para ver se encontro algo errado aqui.
Vou fazer um outro teste aqui para ver se encontro algo errado aqui.
Se alguém for querer analisar o código, está aqui o exemplo do que eu estou fazendo:
Citação:Desculpe, JABA, mas estou usando a OOP. Não estou utilizando comandos Sql com parâmetros.
Vou fazer um outro teste aqui para ver se encontro algo errado aqui.
O fato de se usar SqlParameters não significa que não seja OOP. De qualquer forma, eu compreendi o seu comentário.
PERCIFILHO, você precisa converter o valor null para DBNull.Value, caso contrário vai gerar erro. Para isso crie uma função como abaixo:
Nos parâmetros dos comandos das funções Insert e Update utilize essa função para passar o valor da propriedade onde está
troque por
private object ParseValue(object value)
{
var t = Nullable.GetUnderlyingType(value.GetType()) ?? value.GetType();
return (value == DBNull.Value || value == null) ? null : Convert.ChangeType(value, t);
}
Nos parâmetros dos comandos das funções Insert e Update utilize essa função para passar o valor da propriedade onde está
_return.Parameters.AddWithValue([Ô]@[Ô] + pro.Name, pro.GetValue(this));
troque por
_return.Parameters.AddWithValue([Ô]@[Ô] + pro.Name, ParseValue(pro.GetValue(this)));
Bom dia, FFCouto. Obrigado por me ajudar.
Porém, após fazer essas alterações nos códigos, ainda assim não funcionou.
Agora ocorre um outro erro:
An overflow occurred while converting to datetime
Será que esse erro tem a ver com o banco de dados que estou utilizando, que é o Sql Server Compact Edition 4.0?
Por acaso você chegou a testar o exemplo que eu passei com essas alterações que você fez?
Porém, após fazer essas alterações nos códigos, ainda assim não funcionou.
Agora ocorre um outro erro:
An overflow occurred while converting to datetime
Será que esse erro tem a ver com o banco de dados que estou utilizando, que é o Sql Server Compact Edition 4.0?
Por acaso você chegou a testar o exemplo que eu passei com essas alterações que você fez?
PERCIFILHO, não cheguei a testar. Mas como uso SqlServer acreditava do comportamento ser o mesmo.
O que pode está acontecendo é você estar passando não uma data nula mas sim uma data como o valor mÃnimo 01/01/0001 00:00, se for isso, de fato, o Sql vai gerar esse erro. Tente mudar o tipo de dados para DateTime?, que é um tipo nullable e você poder atribuir null. Dessa forma a rotina vai funcionar de forma correta.
O que pode está acontecendo é você estar passando não uma data nula mas sim uma data como o valor mÃnimo 01/01/0001 00:00, se for isso, de fato, o Sql vai gerar esse erro. Tente mudar o tipo de dados para DateTime?, que é um tipo nullable e você poder atribuir null. Dessa forma a rotina vai funcionar de forma correta.
O problema é que você postou um código que não inclui a operação com o banco de dados em si, e o seu erro provavelmente está lá, apesar de eu achar que está no caminho certo seria mais fácil se você mostrasse o código que faz o insert no banco de dados, onde você monta a SQL e adiciona os parâmetros, pois provavelmente é lá que precisa ser alterado.
Tópico encerrado , respostas não são mais permitidas