There are so many things wrong with this approach: the "open" method does a select which creates a DataReader on the connection, rendering the connection unusable until the reader is closed - and since the "outside world" can't access the reader at all, the connection can't be used anyway.
There is no way to enforce closing and disposing of the scarce resources used: the connection, the command, and the reader are all objects which need to be disposed properly or your app will run out fairly quickly.
The Db name and table name are hard coded into a module, which means it can't be reused.
The DGV fill would be better done from a DataAdapter than a DataReader, and the DataTable used as the DataSource.
The SELECT assumes column order, as so does the DGV fill code. Don't use SELECT * - list the columns you need.
The SELECT collects all columns, and that's wasteful if there are any columns you don;t need this time round. Again, list the columns you want rather than using SELECT *
Once your queries get more complex, you either have to write incredibly flexible module methods, or leave yourself wide open to SQL Injection, which can damage or destroy your DB.
You can't generally "modularize" DB access to the level you want as you'd need new - identical - module methods for each table and query, and most DBs have a lot of tables!
Do it in your method when you need it, and use
Using
statements to control disposal when items go out of scope:
Using con As New SqlConnection(strConnect)
con.Open()
Using cmd As New SqlCommand("SELECT iD, description FROM myTable", con)
Using reader As SqlDataReader = cmd.ExecuteReader()
While reader.Read()
Dim id__1 As Integer = CInt(reader("iD"))
Dim desc As String = DirectCast(reader("description"), String)
Console.WriteLine("ID: {0}" & vbLf & " {1}", iD, desc)
End While
End Using
End Using
End Using