VB.Net а обработка дат в элементах управления сеткой-лучший способ?

В то время как мое приложение работает, я сомневаюсь в методологии и задаюсь вопросом, есть ли » лучший способ”…

Общий дизайн позволяет редактировать 200-300 записей из gridview (phase1) с помощью VB.Net. Сама база данных находится на сервере SQL Server. Есть несколько столбцов, которые пользователь вводит в” приложение“, и есть несколько столбцов, которые будут редактироваться/обслуживаться” пользователями office», если вы хотите. Есть несколько дат, связанных с этим текущим обслуживанием, и именно здесь вращается первый из моих вопросов.

Я нашел в интернете” решения», которые заставили код работать, но подвергаю их сомнению…

Проблема №1, с которой я столкнулся – даты являются NULL в базе данных, и при попытке прочитать их с помощью SqlDataReader привел к ошибкам (не может назначить NULL объекту Date). Хорошо, это привело к использованию тернарного оператора для использования “IsDBNull” и либо назначить значение, считанное из БД, или назначить DateTime.MinValue. Проблема » решена”…

Проблема №2-использование вышеуказанного метода теперь показывает даты, которые являются минимальным значением даты VB-отображение фактических дат в полях, которые пользователь должен редактировать-определенно не «удобный», ни то, что я хочу. Единственным решением этой проблемы было:

Преобразование дат из объектов Date или DateTime в строковые объекты. Это позволило бы мне назначить пустой строке gridview в случае, когда дата изначально была нулевой в БД, которая должна была быть преобразована в DateTime.MinValue (который может быть протестирован), а затем другой тернарный оператор для назначения преобразования “ToString” или пустой строки в поле gridview.

Ok-редактирование завершено. Я добавил » ScriptManager.Команды «RegisterStartupScript» позволяют проверить правильность введенных пользователем дат – все хорошо.

Проблема №3 (или 4) – теперь мне нужно обновить базу данных с данными, введенными пользователем – сохранение пустых строк даты – и обновить базу данных (с помощью параметров…) с нулевыми значениями в этих столбцах даты. Тем не менее, снова – дата является строкой и пуста, поэтому я должен был назначить “MinValue”, сначала, затем другой троичный оператор, чтобы проверить каждую дату против “MinValue”, и либо назначить дату, либо DBNull.Значение…

Да, я думаю, что я мог бы придумать несколько различных строк обновления (включая даты в некоторых, исключая в других), в зависимости от того, была ли строка/дата пустой или нет… Но это приведет только к будущим ошибкам, поэтому, я думаю, я буду держать ряд троичных операторов.

Итак, код для начала процесса редактирования выглядит примерно так:

While sdr.Read
    Dim _date1 As Date = If(IsDBNull(sdr("date1")), DateTime.MinValue, sdr("date1"))
.
.
.
‘ Now add them to a List of my Class:
appsList.Add(New AppClass(… _
             If(_date1 = DateTime.MinValue, " ", _date1.ToString("MM/dd/yyyy")), _
             … )

Теперь, чтобы получить данные обратно из gridview для обновления базы данных:

Dim _date1 As Date
' see if we can convert the various dates...
Try
    '  see if empty…
    If ((CType((row.Cells(19).Controls(0)), TextBox)).Text).Length < 2 Then
        _date1 = DateTime.MinValue
    Else
        _date1 = DateTime.Parse((CType((row.Cells(19).Controls(0)), TextBox)).Text)
    End If
Catch ex As Exception
    ErrFlag = True
    ScriptManager.RegisterStartupScript(Me, Page.GetType, "Script", "alert(‘Date1 Date is not valid - enter as MM/DD/YYYY');", True)
End Try
.
.
.
Dim sql As String = "UPDATE [foo_bar].[dbo].[bar_foo] set date1=@Date1, …….)
cmd.Parameters.AddWithValue("@Date1", If(_date1 = DateTime.MinValue, DBNull.Value, _date1))

Честно говоря, все эти преобразования туда и обратно, кажется, что это приведет к ошибкам или ошибкам в какой-то момент.

So-is this the «best» method for handling this? Нет более чистого способа?

1 ответ

  1. Если вы используете winforms, то вы можете обрабатывать формат и синтаксический анализ Привязок данных. Я не пробовал его на Gridviewtextbox, но в худшем случае вы можете использовать пользовательский шаблон ячейки и текстовое поле с обработчиками формата и синтаксического анализа. Код будет что-то вроде этого:

    mybinding = New Binding("text", DataSet1, "table1.datefield")
      Me.DataGridTextBoxColumn1.TextBox.DataBindings.Add(mybinding)
      AddHandler mybinding.Parse, AddressOf StringToDateTime
      AddHandler mybinding.Format, AddressOf formatdate 
    
     Private Sub StringToDateTime(ByVal sender As Object, ByVal cevent As ConvertEventArgs)
        If cevent.Value.GetType().Equals(GetType(String)) And _
           cevent.DesiredType Is GetType(DateTime) Then
            If cevent.Value <> "" Then
                ' Make sure matches format in format funtion
                cevent.Value = DateTime.Parse(String.Format(cevent.Value, "MMM d, yy"))
            Else
                cevent.Value = DBNull.Value
            End If
    
            'cevent.Value = DateTime.Parse(String.Format(cevent.Value, "MMM d yyyy")
        End If
    End Sub
    
    Public Sub formatdate(ByVal sender As Object, ByVal e As ConvertEventArgs)
        If e.Value.GetType().Equals(GetType(DateTime)) And e.DesiredType Is GetType(String) Then
            ' Hard-coded or user-specified
            ' Make sure matches format in parse funtion
            e.Value = Format(e.Value, "d")
        End If
    End Sub