Have you considered getting the rowcount from your database using a simple SQL query for count(*)? That will return the rowcount and you can just assigned that to your table variable. Then you only need to iterate through your DDT object once to populate the table.
And no... using ADO objects or simply Sys.OleObject("ADODB.Connection") can work, too.
For that matter, IIRC, if you create a DDT.ADODriver object, it's a static object, not dynamic. So, even if the data changes after the fact, it should still contain your "original" values. If you create another DDT.ADODriver object later after the test has been run, it will contain your new data. You should be able to just contain the values.