Dataset campo DBNull -> int?
Pergunta
SQLServer int campo. Valor às vezes nulo. DataAdapter enche dataset OK e pode exibir dados em DataGridView OK.
Ao tentar recuperar os dados de forma programática a partir do conjunto de dados do código de recuperação campo Dataset lança um erro StronglyTypedException.
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public int curr_reading {
get {
try {
return ((int)(this[this.tableHistory.curr_readingColumn]));
}
catch (global::System.InvalidCastException e) {
throw new global::System.Data.StrongTypingException("The value for column \'curr_reading\' in table \'History\' is DBNull.", e);
}
Got passado isso verificando para DBNull no acessador get e retornando nulo, mas ... Quando a estrutura do conjunto de dados é modificado (ainda em desenvolvimento) minhas alterações (sem surpresa) se foram.
O que é a melhor maneira de lidar com esta situação? Parece que eu estou preso a lidar com isso no nível de conjunto de dados. Existe algum tipo de atributo que pode dizer o gerador de código automático para deixar as mudanças no lugar?
Solução
O conjunto de dados terá uma propriedade booleana para indicar nulo.
int curr_reading = ( Iscurr_readingColumnNull) ?
<default_value> : row.curr_readingColumn;
Outras dicas
No DataSet Designer existe a propriedade nullvalue
.
Por padrão, seu valor é throw exception
(daí o seu código gerado)
Você pode configurá-lo para o default value
desejado .. ie. 0.
Em seguida, ele irá retornar 0 em vez de uma exceção. (Outro código é gerado)
VS2008:. Isso funciona diretamente no designer conjunto de dados
VS2005: Ele só funciona para cordas do designer, mas você pode editar diretamente o XSD um conjunto do msprop propriedade: nullValue = "0"
-
Deixe o código gerado automaticamente sozinho. Não há nenhuma maneira de "interceptar" ele ficar gerado assim todas as alterações que fizer são garantidos para começar fundido afastado mais cedo ou mais tarde.
-
.NET (bem, pelo menos o .NET 2.0 pedaços System.Data) não converter de DBNull em qualquer outra coisa. Esta é uma porcaria, mas você não pode fazer nada sobre isso.
-
Escrever um método de extensão chamado ToNullable () ou similar: ele pode fazer isso:
.
public static Nullable<T> ToNullable(this object x){
if(x == DBNull.Value)
return default(T); // return null thing
else
return (T)x;
}
então você pode fazer
int? thing = DataRow["column"].ToNullable<int>();
Se a memória serve, você precisa marcar a linha como sendo editada - usando .BeginEdit () ou similar - em seguida, fazer as suas edições e salvar a linha, provavelmente usando .EndEdit () ou similar. Você pode querer fazer um pouco de leitura para estes métodos (eles podem estar no DataSet, DataTable ou DataRow.) - minha memória é um pouco nebulosa
Espero que isso ajude, pelo menos um pouco.
if(row["curr_reading"] is DBNull){
}else{
row.curr_reading;
}