使用 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.
既然你不能使用它,那么@TimSchmelter 提供了一个你可以建立的答案:
.FileId = If(row.IsNull("fileid"), 0, Convert.ToInt32(row("fileid"))
我正在尝试使用数据集中数据库 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.
既然你不能使用它,那么@TimSchmelter 提供了一个你可以建立的答案:
.FileId = If(row.IsNull("fileid"), 0, Convert.ToInt32(row("fileid"))