使用 db null 检查初始化对象

Object initializing with db null check

我正在尝试使用数据集中数据库 return 中的数据初始化一个对象,如下所示:

Class Pdf
    Public FileId As Integer
    Public AccountNumber As Integer
    Public DateSaved As DateTime
    Public FileName As String
    Public DateImported As DateTime

场景 1 我可以像这样初始化对象:

Dim pdf = New Pdf With {.FileId = ds.Tables(0).Rows(i)("fileid"),
                        .AccountNumber = ds.Tables(0).Rows(i)("accountnumber"),
                        .DateSaved = ds.Tables(0).Rows(i)("datesaved"),
                        .FileName = ds.Tables(0).Rows(i)("filename"),
                        .DateImported = ds.Tables(0).Rows(i)("dateimported")
                        }

但这不起作用,因为列数据可以为空,而我不知道如何在这种方法中进行数据库空检查。

然后我有场景2:

Dim pdf As New pdf
If Not IsDBNull(ds.Tables(0).Rows(i)("fileid")) Then
    PdfFileId = ds.Tables(0).Rows(i)("fileid")
Else
    PdfFileId = 0
End If

If Not IsDBNull(ds.Tables(0).Rows(i)("accountnumber")) Then
    pdf.AccountNumber = ds.Tables(0).Rows(i)("accountnumber")
Else
    pdf.AccountNumber = 0
End If

If Not IsDBNull(ds.Tables(0).Rows(i)("datesaved")) Then
    pdf.DateSaved = Format(ds.Tables(0).Rows(i)("datesaved"), "yyyy-MM-dd")
Else
    pdf.DateSaved = Nothing
End If

If Not IsDBNull(ds.Tables(0).Rows(i)("dateimported")) Then
    pdf.DateImported= Format(ds.Tables(0).Rows(i)("dateimported"), "yyyy-MM-dd")
Else
    pdf.DateImported= Nothing
End If

我该怎么做才能避免在下面做这么多 If 语句。这种方式对我来说似乎效率低下,任何人都可以建议一种更好的方法来初始化方案一或方案二中的对象吗?如果问题不清楚,请告诉我,我会尽力解释。

请注意这是示例数据。

它不是效率低而是代码很多,所以也许还有更多 readable/maintainable 方法。

If运算符是一个,也可以用DataRow.IsNull:

For i As Int32 = 0 To ds.Tables(0).Rows.Count - 1
    Dim row = ds.Tables(0).Rows(i)
    Dim pdf = New Pdf With {
        .FileId = If(row.IsNull("fileid"), 0, row.Field(Of Int32)("fileid")),
        .AccountNumber = If(row.IsNull("accountnumber"), 0, row.Field(Of Int32)("accountnumber")),
        .DateSaved = If(row.IsNull("datesaved"), Date.MinValue, row.Field(Of Date)("datesaved")),
        .FileName = If(row.IsNull("filename"), "", row.Field(Of String)("filename")),
        .DateImported = If(row.IsNull("dateimported"), Date.MinValue, row.Field(Of Date)("dateimported"))
    }
Next

(将您的 class 的名称从 Object 更改为 Pdf

您还应该将 Option Strict 设置为 On,然后您需要代码类型安全,但您可以获得编译时安全并避免不需要的转换。

根据阅读 T Field<T>(this DataRow row, string columnName),我相信对引用和值类型的 DBNull.Value 进行检查,如果通过 DBNull.Value 则返回默认值。

因此您可以使用它而不是每次检查 DBNull.Value:

.FileName = ds.Tables(0).Rows(i).Field(Of String)("FileName")

If the value of the specified DataColumn is null and T is a reference type or nullable type, the return type will be null. The Field method will not return Value.

DataRowExtensions.Field

既然你不能使用它,那么@TimSchmelter 提供了一个你可以建立的答案:

.FileId = If(row.IsNull("fileid"), 0, Convert.ToInt32(row("fileid"))