Secondo me, la tua soluzione è buona. Ho visto un esempio simile in un libro in cui spiega come sviluppare oggetti commerciali.
In pratica ti costruisci un metodo in una classe o in un modulo, (come hai fatto)

La funzione che restituisce il DataReader, probabilmente l'avrei fatta aggiungento due parametri, StringaConnessione e StringaSql

L'esempio che ho visto è del tipo:

dim objReader as OleDbDataReader = miaClasse.MiaFunzione(StringaConnession, StringaSQl)

Se non restituisce Nothing itera o associalo alla griglia

chiudi objReader

A proposito, in letteratura si consiglia di non utilizzare il dataset almeno che non sia assolutamente necessario. Il DataReader è molto meno pesante.

Ti mando un esempio:
codice:
    Protected s$ = ""

    '-------------------------------------------------------------------------------------
    'Restituisce un oggetto DataReader o nothing in caso di errore
    'parametri: Stringa di connessione, stringa sql
    '-------------------------------------------------------------------------------------
    Public Function GetDataReader(ByVal stringaConnessione$, ByVal stringaSQL$) As OleDbDataReader
        Dim Reader As OleDbDataReader
        Try
            Dim Connessione As New OleDbConnection(stringaConnessione)
            Connessione.Open()
            Dim Comando As New OleDbCommand(stringaSQL, Connessione)
            Reader = Comando.ExecuteReader(CommandBehavior.CloseConnection)
            Return Reader
        Catch Errore As Exception
            Return Nothing
        End Try


    End Function


    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim sql$ = "SELECT * FROM CAMPI"
        Dim StringaConnessione$ = Application("connessione_access_prova").ToString

        Dim Reader As OleDbDataReader = GetDataReader(StringaConnessione, sql)
        If Reader Is Nothing Then Exit Sub

        Dim Colonne% = Reader.FieldCount
        s = "<table border='1' cellspacing='1' cellpadding='2'>"
        s &= "<tr>"
        Dim i, j As Integer
        For j = 0 To Colonne - 1
            s &= "<th>" & Reader.GetName(j) & "</th>"
        Next
        s &= "<th>" & "link" & "</th>"
        s &= "</tr>"

        While (Reader.Read)
            s &= "<tr>"
            For j = 0 To Colonne - 1
                s &= "<td>" & Reader.Item(j).ToString & "</td>"
            Next
            s &= "<td>" & "link" & "</td>"
            s &= "</tr>"

        End While


        Reader.Close()


        Me.DataBind()
    End Sub
dove l'istruzione:
codice:
Reader = Comando.ExecuteReader(CommandBehavior.CloseConnection)
forza la chiusura automatica della connessione non appena viene richiamato il metodo close dell'oggetto datareader

Ciao