Tener trato con problemas DBNULL completamente de fiar. Tablas de datos utilizando conjuntos de datos que se pasa como el modelo Vistas de datos. ASP.NET MVC2

StackOverflow https://stackoverflow.com/questions/4744868

Pregunta

Yo soy amante MVC pero desgraciadamente todos los tutoriales, demostraciones y recursos de todo el uso de Entity Framework para generar ViewData y la mayor utilización de LINQ a SQL en lugar de conjuntos de datos.
Estoy reutilización de la lógica de negocio existente y el cliente (que es un gran codificador en su propio derecho) quiere seguir utilizando conjuntos de datos ... así que no puedo mover lejos de éstos.

Tengo una tabla que contiene las columnas que están autorizados para ser NULL en la base de datos. Cuando intento acceder a estos ... incluso para comprobar si es nula i obtener una excepción:

"El valor para la columna 'FNN_CARRIERS_DESC' en la tabla 'FNN_CARRIERS_DESC' es DBNull"

Ahora bien, esto es generado por el archivo dataset.designer.vb.

Sé lo que vas a decir. "FNN_BRAND es nulo !!!" y eso es cierto. Pero ... seguir la traza de la pila y la línea en mi código que está generando este error es la siguiente:

 <%= Html.TextBox("FNN_CARRIERS_DESCTextBox", If(IsNothing(Model.FNN_CARRIERS_DESC), Model.FNN_CARRIERS_DESC, ""))%>

Orientación sería muy apreciada! Mi inutition me dice que esto no es estrictamente un problema de MVC, pero tal vez algo que no entiendo acerca de los conjuntos de datos.

Este es el código en el archivo Reference.vb que produce la excepción:

<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _
     Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")>  _
    Public Property FNN_CARRIERS_DESC() As String
        Get
            Try 
                Return CType(Me(Me.tableVIT_FNN_CommsService.FNN_CARRIERS_DESCColumn),String)
            Catch e As Global.System.InvalidCastException
                Throw New Global.System.Data.StrongTypingException("The value for column 'FNN_CARRIERS_DESC' in table 'VIT_FNN_CommsService' is DBNul"& _ 
                        "l.", e)
            End Try
        End Get
        Set
            Me(Me.tableVIT_FNN_CommsService.FNN_CARRIERS_DESCColumn) = value
        End Set
    End Property

cosas que he intentado:

  • Al comentar la excepción hará que vuelva nulo que es lo que quiero, sino el conjunto de datos será reconstruido cuando los cambios de la tabla o el procedimiento almacenado que genera el resultado cambia la tabla.
  • cambiado las reglas para la columna en la tabla de datos. En realidad no produjo ningún resultado y también será reemplazado en la regeneración mesa.
  • IsNothing (columna) o IsDBNull (columna) en realidad hace que el error debido a que la columna se recupera y fundido.

Necesito saber la mejor manera de resolver esto, es de esperar teniendo en la arquitectura MVC.

Help Me compañeros empollones ... que eres mi única esperanza!

¿Fue útil?

Solución 2

Si alguien está interesado he encontrado una solución mejor ... uno que le permite mantener el uso de conjuntos de datos sin una capa de en medio.

Una columna es anulable el conjunto de datos realmente proporciona un método para usted.

Model.isFNN_CARRIERS_DESCNull()

lo que se podría comprobar la capacidad de nulos de esta columna ... sin causar un accidente.

Otros consejos

Aceptar para que tenga alguna lógica de acceso a datos existentes que se basa en conjuntos de datos. Eso está perfectamente bien (piensan de él que podría haber sido mucho peor, como VB6 :-)). Todos tenemos que lidiar con el código heredado. Eso es normal. código heredado existe en todas partes.

A pesar de que esto no es una razón para contaminar su nueva aplicación MVC brillando con ella. Así que aquí es lo que le sugeriría. Encapsular este código heredado en algún repositorio externo que funciona sólo con tipos fuertes. Ejemplo:

Public Interface IProductsRepository
    Function GetProduct(id As Integer) As Product
End Interface

y luego poner en práctica:

Public Class LegacyProductsRepository
    Implements IProductsRepository
    Public Function GetProduct(id As Integer) As Product
        ' TODO: call your legacy code here and convert the datasets
        ' and datatables you were dealing with into a nice strongly
        ' typed model object
    End Function
End Class

Ahora el controlador debe no tener que escuchar acerca de conjuntos de datos y basura como esta:

Public Class ProductsController
    Inherits Controller
    Private ReadOnly _repository As IProductsRepository
    Public Sub New(repository As IProductsRepository)
        _repository = repository
    End Sub

    Public Function Show(id As Integer) As ActionResult
        Dim product = _repository.GetProduct(id)
        Return View(product)
    End Function
End Class

Ves. Ahora todo está limpio y sencillo. Su punto de vista trabaja con un objeto producto inflexible y no debe nunca tratar con conjuntos de datos y tablas de datos y excepciones como el que usted está describiendo no debería ocurrir nunca: -)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top