Pregunta

campo int SQLServer. Valor a veces nulo. DataAdapter llena el conjunto de datos OK y puede mostrar datos en DatagridView OK.

Al intentar recuperar los datos mediante programación del conjunto de datos, el código de recuperación del campo Conjunto de datos genera un error 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);
            }

Superé esto al verificar DBNull en el acceso get y devolver null pero ... Cuando se modifica la estructura del conjunto de datos (aún en desarrollo) mis cambios (como era de esperar) se han ido.

¿Cuál es la mejor manera de manejar esta situación? Parece que estoy atascado con tratar con eso en el nivel de conjunto de datos. ¿Hay algún tipo de atributo que pueda indicar al generador de códigos automáticos que deje los cambios en su lugar?

¿Fue útil?

Solución

El conjunto de datos tendrá una propiedad booleana para indicar nulo.

int curr_reading = ( Iscurr_readingColumnNull) ? 
                   <default_value> : row.curr_readingColumn;

Otros consejos

En el diseñador de conjunto de datos escrito, está la propiedad nullvalue . Por defecto, su valor es lanzar excepción (de ahí su código generado) Puede configurarlo en el valor predeterminado deseado, es decir, 0. Entonces devolverá 0 en lugar de una excepción. (se genera otro código)

VS2008: esto funciona directamente en el diseñador de conjuntos de datos.

VS2005: solo funciona con cadenas en el diseñador pero puede editar directamente el XSD y establecer la propiedad msprop: nullValue = " 0 "

  1. Deja el código generado automáticamente solo. No hay forma de " interceptar " se está generando, por lo que cualquier cambio que realices se garantiza que se perderá tarde o temprano.

  2. .NET (bueno, al menos los bits de datos del sistema .NET 2.0) no se convertirá de DBNull en otra cosa. Esto apesta pero no puedes hacer nada al respecto.

  3. Escriba un método de extensión llamado ToNullable () o similar: puede hacer esto:

.

public static Nullable<T> ToNullable(this object x){
    if(x == DBNull.Value)
       return default(T); // return null thing
    else
       return (T)x;
}

entonces puedes hacerlo

int? thing = DataRow["column"].ToNullable<int>();

Si la memoria no funciona, debe marcar la fila como editada, usando .BeginEdit () o similar, luego realice las ediciones y guarde la fila, probablemente usando .EndEdit () o similar. Es posible que desee leer un poco sobre estos métodos (pueden estar en el DataSet, DataTable o DataRow): mi memoria está un poco borrosa.

Espero que esto ayude al menos un poco.

if(row["curr_reading"] is DBNull){

}else{
    row.curr_reading;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top