2011-03-17 53 views
0
Public Function ExecCommand(ByVal sql As String) As SqlDataReader 
    Dim dReader As SqlDataReader 
    Dim cmd As New SqlCommand() 
    cmd.CommandText = sql 
    cmd.Connection = sm 
    Dim isOpened = OpenConnection() 
    If isOpened Then 
     dReader = cmd.ExecuteReader() 
     CloseConnection() 
    End If 
    Return dReader 
End Function 

它说也许在运行时可能会发生空指定,以声明该datareader。这是为什么?从C sharp到Vb简单问题的初学者移民

+2

什么是你的函数应该返回如果'isOpened'是错误的? – Heinzi 2011-03-17 10:58:24

+0

当我看到本网站上发布的一些代码时,我经常想哭。 – 2011-03-17 13:11:11

回答

5

这是因为,如果如果条件不满足的dReader变量可能未初始化。你可以在默认情况下将它初始化为Nothing

Dim dReader As SqlDataReader = Nothing 

显然,这种方法的调用者需要处理这种情况。

另外,作为一个C#移民你可能奇怪为什么你没有得到一个编译时错误,但只是一个警告。

2

如果OpenConnection的()失败,则isOpened是假的。下面的块不会被执行,dReader也不会被分配。

Public Function ExecCommand(ByVal sql As String) As SqlDataReader 
    Dim dReader As SqlDataReader  // Not assigned yet 
    Dim cmd As New SqlCommand() 
    cmd.CommandText = sql 
    cmd.Connection = sm 
    Dim isOpened = OpenConnection() // Fails to connect 
    If isOpened Then     // Not executed 
     dReader = cmd.ExecuteReader() 
     CloseConnection() 
    End If 
    Return dReader      // Return value unknown 

作为旁注,CloseConnection()也不会执行,因此您稍后可能会遇到一些问题。

+0

这很好,谢谢 – 2011-03-19 10:36:24

0

添加在分配dreader为空别的statemnt。

Public Function ExecCommand(ByVal sql As String) As SqlDataReader 
Dim dReader As SqlDataReader=Nothing 
Dim cmd As New SqlCommand() 
cmd.CommandText = sql 


cmd.Connection = sm 

昏暗isOpened = OpenConnection的() 如果isOpened然后 dReader = cmd.ExecuteReader() CloseConnection()
结束如果
返回dReader端功能

+0

其中空引用仍然会发生... – David 2011-03-17 11:03:06