'Fetch rows from the recordset.
rows is None gets all (for fetchall).'

def _fetch(self, rows=None):

    rs = self.rs
    if (self.conn == None):
        self._raiseCursorError(Error, None)
        return
    if ((not rs) or (rs.State == adStateClosed)):
        self._raiseCursorError(Error, None)
        return
    else:
        if ((rs.State == adStateClosed) or rs.BOF or rs.EOF):
            if (rows == 1):
                return None
            else:
                return []
        if rows:
            ado_results = self.rs.GetRows(rows)
        else:
            ado_results = self.rs.GetRows()
        d = self.description
        returnList = []
        i = 0
        if onIronPython:
            type_codes = [descTuple[1] for descTuple in d]
            for j in range((len(ado_results) / len(d))):
                L = []
                for i in range(len(d)):
                    L.append(convertVariantToPython(ado_results[(i, j)], type_codes[i]))
                returnList.append(tuple(L))
            return tuple(returnList)
        else:
            for descTuple in d:
                type_code = descTuple[1]
                returnList.append([convertVariantToPython(r, type_code) for r in ado_results[i]])
                i += 1
            return tuple(zip(*returnList))
