我使用的是Visual Studio 2008,我无法理解为什么我可以在代码中的断点处停止,但我的属性设置器中的断点不受尊重(不会进入属性设置器)。这是我的类代码的缩写片段:
Dim objReader As SqlDataReader = cmd.ExecuteReader()
Do While objReader.Read()
SetObjectData(objReader)
Loop
objReader.Close()
connection.Close()
Catch ex As Exception
Throw
End Try
End Sub
Private Sub SetObjectData(ByVal theObjReader As SqlDataReader)
Try
Me._SubscriberID = Convert.ToInt32(theObjReader("SubscriberID"))
Me._CompletedDate = theObjReader("CompletedDate")
Me._AcknowledgeDate = theObjReader("AcknowledgeDate")
Catch ex As Exception
Dim msg As String
msg = ex.ToString
End Try
Private _CompletedDate As Nullable(Of Date)
Private _AcknowledgeDate As Nullable(Of Date)
Public Property CompletedDate() As Date?
Get
Return _CompletedDate
End Get
Set(ByVal value As Date?)
If value.HasValue Then
_CompletedDate = value
Else
_CompletedDate = Nothing
End If
End Set
End Property
Public Property AcknowledgeDate() As Date?
Get
Return _AcknowledgeDate
End Get
Set(ByVal value As Date?)
If value.HasValue Then
_AcknowledgeDate = value
Else
_AcknowledgeDate = Nothing
End If
End Set
End Property
SQL Server表中的两个日期都可以为null。在我的测试数据中, CompletedDate 是有效日期, AcknowledgeDate 是Nothing。上面的代码似乎工作,我可以单步执行构造函数,但不能进入属性setter代码。
编辑:
----------------------------------编辑没有。 2:------------------------------------------------ --------
我现在能够看到稍微不同的测试数据,在构造函数的以下行中抛出了System.InvalidCastException:
Me._CompletedDate = theObjReader("CompletedDate")
数据库表中的datetime列实际上是NULL。我认为属性setter代码可以处理这种情况,但我得到了这个:
System.InvalidCastException was caught
Message="Specified cast is not valid."
Source="TCBCommon"
StackTrace:
at TCBCommon.EventItem.SetObjectData(SqlDataReader theObjReader) in C:\Projects\CorporateBrain\TCB-Common\TCBCommon\EventItem.vb:line 48
InnerException:
所以,我猜真正的问题是将null datetime列作为Date数据类型的错误处理。我会对此进行研究,但仍希望能够进入物业制定者并且经历过#34;对可以为空的对象进行.HasValue测试。
答案 0 :(得分:1)
"我可以单步执行构造函数但不能进入属性设置器"让我相信你的断点实际上并不在制定者中,但是你试图从外面进入它。在这种情况下,您可能感兴趣的是Visual Studio设置:
如果你的断点实际上是里面的setter代码,那么这可能不是你的问题。
答案 1 :(得分:1)
在我看来,你并没有打电话给二传手。你发布的那一行
Me._CompletedDate = theObjReader("CompletedDate") 'note the underscore)
正在尝试直接设置私有字段的值。如果要执行属性设置器,则需要实际设置属性:
Me.CompletedDate = theObjReader("CompletedDate") 'no underscore