GRAVANDO VALORES NULL NA TABELA

PERCIFILHO 06/05/2016 14:17:15
#461871
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:

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?

JABA 06/05/2016 15:14:41
#461873
Tente com um DBNull.Value
PERCIFILHO 06/05/2016 15:18:39
#461874
Já havia tentado, mas não aceita o DbNull.Value.
Cannot implicitly convert type [ô]System.DBNull[ô] to [ô]System.DateTime?[ô]
JABA 06/05/2016 15:19:18
#461875
Ex:

cmd.Parameters.Add(New OleDbParameter([Ô]@data[Ô], DBNull.Value)

PERCIFILHO 06/05/2016 15:31:22
#461876
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.
PERCIFILHO 06/05/2016 15:57:39
#461877
Se alguém for querer analisar o código, está aqui o exemplo do que eu estou fazendo:


JABA 06/05/2016 16:03:26
#461878
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.
FFCOUTO 06/05/2016 17:19:10
#461880
PERCIFILHO, você precisa converter o valor null para DBNull.Value, caso contrário vai gerar erro. Para isso crie uma função como abaixo:

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

PERCIFILHO 09/05/2016 09:23:49
#461913
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?
FFCOUTO 09/05/2016 14:17:07
#461928
Resposta escolhida
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.
OCELOT 09/05/2016 14:41:12
#461932
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.
Página 1 de 2 [14 registro(s)]
Tópico encerrado , respostas não são mais permitidas