sophia kylie taylor Ответов: 3

Обработка нулевых значений на считывателе


Привет,

Я пытаюсь прочитать csv-файл в моем представлении datagrid, но он всегда выдает мне ошибку "объект не может быть приведен из DBnull в другие типы". Я сделал точку останова в своем коде, это происходит, когда читатель пытается загрузить формат datetime в datagridview. Уже работают различные процедуры, которые могут обрабатывать нулевые значения, но, похоже, ошибка не исчезает. Я буду признателен, если вы предложите мне какой-нибудь другой способ обработки нулевых значений

With dt1
           .Columns.Add("Employee Number", Type.GetType("System.String"))
           .Columns.Add("Time In", Type.GetType("System.DateTime"))
           .Columns.Add("Time Out", Type.GetType("System.DateTime"))
           .Columns.Add("Shift Starttime", Type.GetType("System.DateTime"))
           .Columns.Add("ShiftEndTime", Type.GetType("System.DateTime"))


       End With


Dim csvreader As New StreamReader(txtboxcsv.Text, System.Text.Encoding.Default)
        Dim sline As String = ""

        Do
            sline = csvreader.ReadLine
            If sline Is Nothing Then Exit Do
            Dim columns() As String = sline.Split(",")
            Dim row As DataRow = dt1.NewRow
            Try

                row("Employee Number") = columns(0)
                If columns(2) = "IN" Then
                    row("Time In") = columns(1)
                Else
                    row("Time out") = columns(1)
                End If
                Dim d As String
                d = Convert.ToDateTime(columns(1)).ToString("dd-MMM-yyyy")
                Dim shift_start As String
                shift_start = Convert.ToDateTime(row("Time In")).AddHours(1).ToString("MM-dd-yyyy hh tt")
                Dim shift_end As DateTime
                shift_end = Convert.ToDateTime(row("Time In")).AddHours(9).ToString("MM-dd-yyyy hh tt")
                row("Shift Starttime") = shift_start
                row("ShiftEndTime") = shift_end
                
                dt1.Rows.Add(row)
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try

        Loop
        csvreader.Close()

        DataGridView1.DataSource = dt1
        Me.Text = dt1.Rows.Count & "rows"
    End Sub


Что я уже пробовал:

'Dim n0_value As String = "00/00/0000"
                If IsDBNull(row("Time In")) = False Then
                   row("Shift Starttime") = shift_start OrElse
                    row("Shift Starttime") = n0_Value
                  Convert.IsDBNull(row("Shift Starttime"))
                ElseIf If IsDBNull(row("Time out")) = False Then
                    row("Shift EndTime") = shift_end OrElse
                     row("Shift EndTime") = n0_Value
                    Convert.IsDBNull(row("Shift EndTime"))
                   
                End If

Gerry Schmitz

Я думаю, вы могли бы попробовать нулевое время даты. Однако в какой-то момент вам придется иметь с ними дело (то есть с нулями).

sophia kylie taylor

Есть ли в любом случае, что я мог бы сделать дату и время нулевыми?

3 Ответов

Рейтинг:
5

MadMyche

Я использую полный класс полный методов расширения для работы с НУЛЕВОЙ значения, что значительно упрощает извлечение потенциально нулевых значений из вызовов базы данных.

Вам нужно будет перекодировать этот небольшой образец в VB.Net-но вы должны быть в состоянии сделать это довольно легко.Эта строка всегда будет давать мне действительную дату и время.

DateTime GpsTime = row["GpsTime"].FixDate();
Вот как определяется этот метод расширения. Опять же, это C#, и его нужно будет перекодировать в VB.
namespace System {
	public static partial class PublicExtensions {
		public static DateTime FixDate(this object NullableDate, string DefaultDateString = "01/01/0001") {
			DateTime ReturnValue;
			if (NullableDate != null) {
				try { ReturnValue = DateTime.Parse(NullableDate.FixString(DefaultDateString)); }
				catch (Exception) { if (!DateTime.TryParse(DefaultDateString, out ReturnValue)) { ReturnValue = new DateTime(0); } }
			}
			else { if (!DateTime.TryParse(DefaultDateString, out ReturnValue)) { ReturnValue = new DateTime(0); } }
			return ReturnValue;
		}
	}
}
Ссылка:
Методы Расширения (Visual Basic) | Microsoft Docs[^]


Рейтинг:
2

Maciej Los

Я бы предложил использовать: Значение dbnull.Поле Значения (Система) | Microsoft Docs[^]

If DBNull.Value.Equals(row("Time In")) Then 'if null then...
    'your logic here
End If


Рейтинг:
0

OriginalGriff

Во - первых, избавьтесь от Convert-если вы обрабатываете данные, которые могут содержать или не содержать то, что вы хотите, используйте вместо этого TryParse:

Dim d As String = ""
Dim dt As DateTime

If DateTime.TryParse(columns(1), dt) Then
    d = dt.ToString("dd-MMM-yyyy")
End If
Таким образом, d будет либо пустой строкой, либо датой в нужном вам формате.
Сделайте то же самое для других ваших полей, и Вам не нужно nullable DateTimes.