Возникают проблемы с полностью законным Dbnull. Использование наборов данных передается в качестве представлений данных модели. ASP.NET MVC2

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

Вопрос

Я люблю MVC, но, к сожалению, все учебники, демонстрации и все ресурсы используют структуру объекта для генерации ViewData и большинства используют LINQ для SQL вместо наборов данных.
Я повторно использую существующую бизнес -логику, и клиент (который сам по себе является отличным кодером) хочет продолжать использовать наборы данных ... поэтому я не могу отойти от них.

У меня есть одна таблица, которая содержит столбцы, которые могут быть нулевыми в базе данных. Когда я пытаюсь получить доступ к ним ... даже проверить, но налете ли это, я получу исключение:

"Значение для столбца 'fnn_carriers_desc' в таблице 'fnn_carriers_desc' is dbnull"

Теперь это генерируется файлом dateSet.designer.vb.

Я знаю, что ты собираешься сказать. "Fnn_brand is null !!!" И это правда. Но ... следуйте за трассировкой стека, и строки в моем коде, которая генерирует эту ошибку, такова:

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

Руководство было бы очень оценено! Мое инаутирование говорит мне, что это не проблема MVC, но, возможно, то, что я не понимаю в наборах данных.

Это код в файле reference.vb, который бросает исключение:

<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

Вещи, которые я пробовал:

  • Комментируя, что исключение сделает его возвращение NULL, что я хочу, но набор данных будет восстановлен при изменении таблицы или хранимой процедуры, которая генерирует изменения результата таблицы.
  • Изменил правила для столбца на данных DataTable. фактически не дал результата и также будет переопределена при регенерации таблицы.
  • IstoThing (столбец) или ISDBNull (столбец) фактически вызывает ошибку, поскольку столбец извлекается и отбрасывается.

Мне нужно знать, что лучше всего решить это, надеюсь, продолжить с архитектурой MVC.

Помогите мне коллеги -ботаники ... Ты моя единственная надежда!

Это было полезно?

Решение 2

Если кому -то интересно, я нашел лучшее решение ... одно, которое позволяет вам продолжать использовать наборы данных без слоя в середине.

Столбец нулевы, набор данных фактически предоставляет для вас метод.

Model.isFNN_CARRIERS_DESCNull()

Таким образом, можно было бы проверить нулевую эту колонку ... не вызывая сбой.

Другие советы

ОК, поэтому у вас есть некоторая логика доступа к данным, которая опирается на наборы данных. Это прекрасно (подумайте об этом, что это могло быть намного хуже, например, VB6 :-)). Нам всем приходится иметь дело с устаревшим кодом. Это нормально. Устаревший кодекс существует везде.

Хотя это не является причиной для загрязнения вашего нового приложения MVC. Итак, вот что я бы предложил вам. Инкапсулируйте этот устаревший код в какой -то внешний репозиторий, который работает только с сильными типами. Пример:

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

а затем реализовать:

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

Теперь ваш контроллер никогда не должен слышать о наборах данных и дерьме, как это:

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

Понимаете. Теперь все чисто и просто. Ваше представление работает с сильно напечатанным объектом продукта и никогда не должен иметь дело с наборами данных и наборами данных и исключениями, такими как тот, который вы описываете, никогда не должно произойти :-)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top