我正在尝试使用数据集中的数据库返回数据初始化对象,如下所示:
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
语句。这种方式对我来说似乎效率低下,任何人都可以建议一种更好的方法来初始化场景一或二的对象吗?如果问题不清楚,请告诉我,我会尝试解释。
请注意这是样本数据。
答案 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。
既然你无法使用它,那么@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
,然后您需要安全编码类型,但您可以获得编译时安全性并避免不必要的转换。