Così a prima vista mi sembra che la tua funzione 'crea_dreader' non ritorni nessun dato o sbaglio?

Forse così va meglio...

codice:
Public Function crea_dreader(ByVal sql As String) as SqlClient.SqlDataReader
        'Creazione datareader, viene passata la stringa sql da eseguire
        Dim objCommand As SqlClient.SqlCommand
        Dim objReader As SqlClient.SqlDataReader
        Dim cnPath As String

        cnPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\cn.txt"
        Dim objConnection As New SqlClient.SqlConnection
        objConnection.ConnectionString = verNameFile(cnPath)
        objConnection.Open()

        If (objConnection.State = ConnectionState.Open) Then
            objCommand = New SqlClient.SqlCommand(sql, objConnection)
            objReader = objCommand.ExecuteReader()
           
            'objReader = Nothing
            objConnection.Close()

           Return objReader
        End If
    End Function