从C sharp到Vb简单问题的初学者移民

时间:2011-03-17 10:55:31

标签: c# .net vb.net

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。那是为什么?

3 个答案:

答案 0 :(得分:5)

这是因为如果不满足If条件,则可能不会初始化dReader变量。默认情况下,您可以将其初始化为Nothing

Dim dReader As SqlDataReader = Nothing

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

同样作为C#移民,您可能会感到惊讶,为什么您没有收到编译时错误,只是警告。

答案 1 :(得分:2)

如果OpenConnection()失败,则isOpened为false。将不执行以下块,并且不会分配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()也不会执行,因此您以后可能会遇到一些问题。

答案 2 :(得分:0)

添加其他statemnt,其中将dreader指定为null。

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  

Dim isOpened = OpenConnection()      如果isOpened那么       dReader = cmd.ExecuteReader()       CloseConnection()
 结束如果
 返回dReader结束函数