使用db null检查对象初始化

时间:2015-08-28 13:08:24

标签: vb.net object initialization dbnull

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

Example Dataset

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

Scenerio 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")
                        }

但这不起作用,因为列数据可以为null,如果在这种方法中如何进行db null检查,我不会这样做。

然后我有 scenerio 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语句。这种方式对我来说似乎效率低下,任何人都可以建议一种更好的方法来初始化场景一或二的对象吗?如果问题不清楚,请告诉我,我会尝试解释。

请注意这是样本数据。

2 个答案:

答案 0 :(得分:1)

从阅读T Field<T>(this DataRow row, string columnName)开始,我相信对于引用和值类型都会检查DBNull.Value,如果传递DBNull.Value则返回默认值。

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

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

  

如果指定的DataColumn的值为null并且T是引用类型或可空类型,则返回类型将为null。 Field方法不会返回Value。

DataRowExtensions.Field

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

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

答案 1 :(得分:0)

它效率不高但代码很多,所以也许有一种更易读/可维护的方法。

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

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

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