Probabilmente ne mastico meno di te, ma siccome provengo da Access (addiriittura 98) sono abituato ad usare questo DB, più (anche) le possibilità di utilizzo delle Query. Anch'io ho dovuto richiamare il contenuto variabile di alcune tabelle "pesanti" in tempo reale ed ho fatto più o meno così:

codice:
        Private Sub caricaElenco()

        Dim rcrdst_1 As New ADODB.Recordset, rcrdst_2 As New ADODB.Recordset, sSQL As String
        Dim i As Integer

        sSQL = "SELECT IlTuoNuovoRecord From LaTuaTabellaDiOrigine"
        rcrdst_1.Open(sSQL, CnDBLocale, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)

        sSQL = "SELECT IlTuoNuovoRecordDaAggiungere From LaTuaTabellaDaCaricare"
        rcrdst_2.Open(sSQL, CnDBLocale, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)

        For i = 0 To rcrdst_1.RecordCount - 1
            rcrdst_2.AddNew()
            rcrdst_2("IlTuoNuovoRecordDaAggiungere").Value = rcrdst_1("IlTuoNuovoRecord").Value
            rcrdst_2.Update()
            rcrdst_1.MoveNext()
        Next i

    End Sub

E poi, siccome non sono molto bravo con l'SQL, ho usato la funzione Query di Access: L'IDE delle Query mi permette di comporle come voglio, poi copio brutalmente il codice SQL e lo incollo in VB .NET

Per aggiornare la ListBox, semplicemente richiamo la Sub caricaElenco.