Haben Sie Probleme beim Umgang mit völlig legit DBNULL. Mit Datasets Tables werden als die Modelldaten Ansichten weitergegeben. ASP.NET MVC2

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

Frage

ich liebe MVC aber leider alle Tutorials, Demos und alle Ressourcen verwenden Entity Framework Viewdata und die meisten Verwendung von LINQ to SQL anstelle von Datensätzen zu generieren.
Ich Wiederverwendung vorhandene Business-Logik und den Client (der ein großer Codierer in seinem eigenen Recht ist) will Datensätze halten mit ... so dass ich von diesen wegbewegen kann nicht.

Ich habe eine Tabelle, die Spalten enthält, die erlaubt sind NULL in der Datenbank zu sein. Wenn ich versuche, diese zuzugreifen ... auch zu überprüfen, ob es die Null-i eine Ausnahme erhalten:

"Der Wert für Spalte 'FNN_CARRIERS_DESC' in der Tabelle 'FNN_CARRIERS_DESC' ist DBNull"

Nun wird dies durch die dataset.designer.vb Datei erzeugt wird.

Ich weiß, was du sagen. "FNN_BRAND IS Null !!!" und das ist wahr. Aber ... dem Stack-Trace folgen und die Zeile in meinem Code, der diesen Fehler erzeugt, ist dies:

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

Guidance würde sehr geschätzt! Mein inutition sagt mir, dies ist nicht unbedingt ein MVC Problem, aber vielleicht etwas, was ich nicht verstehen, über Datensätze.

Dies ist der Code in der Reference.vb Datei, die die Ausnahme auslöst:

<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

Dinge, die ich habe versucht:

  • die Ausnahme kommentierte heraus wird es null machen zurückkehren, das ist das, was ich will, aber der Datensatz wird neu erstellt, wenn die Tabelle ändert oder die gespeicherte Prozedur, die die Tabellen Ergebnis Änderungen erzeugt.
  • Changed die Regeln für die Spalte auf der Datentabelle. kein Ergebnis tatsächlich nachgegeben und wird auch auf dem Tisch Regeneration außer Kraft gesetzt werden.
  • IsNothing (Spalte) oder IsDBNull (Spalte) URSACHEN tatsächlich den Fehler, da die Spalte wird abgerufen und gegossen.

Ich brauche den besten Weg, zu wissen, dieses Problem zu lösen, hoffentlich in der MVC-Architektur zu halten.

Helfen Sie mir Kollegen Nerds ... Du bist meine einzige Hoffnung!

War es hilfreich?

Lösung 2

If anyone is interested i found a better solution... one that lets you keep using datasets without a layer in the middle.

A column is nullable the dataset actually provides a method for you.

Model.isFNN_CARRIERS_DESCNull()

so one could check the nullability of this column...without causing a crash.

Andere Tipps

OK so you have some existing data access logic which relies on data sets. That's perfectly fine (think of it that it could have been much worse like VB6 :-)). We all have to deal with legacy code. That's normal. Legacy code exists everywhere.

Although this is not a reason to pollute your shinning new MVC application with it. So here is what I would suggest you. Encapsulate this legacy code into some external repository which works with strong types only. Example:

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

and then implement:

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

Now your controller should never have to hear about datasets and crap like this:

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

You see. Now everything is clean and simple. Your view works with a strongly typed product object and shouldn't ever deal with datasets and datatables and exceptions like the one you are describing should never happen :-)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top