我不确定如何在这里搜索要解决的问题。在我正在编写的程序中(在VB.Net中),我试图将从数据库中提取的值分配给结构中的不同变量。
现在我的问题是,有时从数据库中提取的某些值为NULL
,例如,并非每个电话号码都有一个扩展名。这是我目前所拥有的代码:
Structure CustomerContact
Public _name As String
Public _email As String
Public _fax As String
Public _phone1 As String
Public _phone2 As String
Public _phone3 As String
Public _ext1 As String
Public _ext2 As String
Public _ext3 As String
Public _type1 As String
Public _type2 As String
Public _type3 As String
End Structure
Dim contactData As DataTable = CustomerDBFunctions.GetCustomerContacts(Customer)
For Each row As DataRow In contactData.Rows
If contacts.Count < 1 Then
contacts.Add(New CustomerContact With {
._name = row.Item("FullName").ToString() & " (" & row.Item("ContactType").ToString() & ")",
._email = row.Item("Email").ToString(),
._fax = row.Item("Fax").ToString(),
._phone1 = row.Item("Phone").ToString(),
._ext1 = row.Item("Extension").ToString(),
._type1 = row.Item("PhoneType").ToString()})
End If
Next
现在,当数据库中的值为NULL
时出现错误,因为它无法为字符串分配NULL值。我想在存在NULL值的情况下,将变量的值改为设置为""
。我只是不确定如何编写代码。
答案 0 :(得分:2)
从技术上讲,问题不在于该列为空。 String
是引用类型,因此只能为null(尽管如果为null,则无论如何都无法对其调用ToString
)。实际情况是,ADO.NET始终为行包含空值的所有列返回DBNull.Value
。
您可以像这样检查它:
If row.Item("Phone") <> DBNull.Value Then
customerContact._phone1 = row.Item("Phone")?.ToString()
End If
请注意,当列实际上为空而不是?.
时,我在调用.
时使用ToString
而不是DbNull.Value
。原因是我不知道您要使用哪种代码来填充DataTable
。如果是ADO.NET来填充它,则永远不会为null,但是如果它是通过其他方式填充它的自定义代码,则可能会在其中获得实际的null。
由于您使用的是DataTable
返回值,因此它具有方便的IsNull
方法供您使用,该方法可以一点点地清理代码:
If Not row.IsNull("Phone") Then
customerContact._phone1 = row.Item("Phone")?.ToString()
End If
很显然,如果您经常这样做,最好将其包装成可重用的函数。另外,如果您想将其缩短为一行,可以这样做:
._phone1 = If(row.IsNull("Phone"), row.Item("Phone")?.ToString(), Nothing)
答案 1 :(得分:0)
字符串串联可用于将Nothing
转换为""
(我的答案here中的其他替代方法)
._fax = row!Fax & "",