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?

Foi útil?

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"

  1. 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.

  2. .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.

  3. 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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top