async def METHOD_NAME(
    self, query: str, values: Optional[list] = None
) -> Tuple[int, List[dict]]:
    async with self.acquire_connection() as connection:
        self.log.debug("%s: %s", query, values)
        async with connection.cursor() as cursor:
            if values:
                await cursor.execute(query, values)
            else:
                await cursor.execute(query)
            if query.startswith("UPDATE") or query.startswith("DELETE"):
                return cursor.rowcount, []
            try:
                rows = await cursor.fetchall()
            except pyodbc.ProgrammingError:
                return cursor.rowcount, []
            if rows:
                fields = [c[0] for c in cursor.description]
                return cursor.rowcount, [dict(zip(fields, row)) for row in rows]
            return cursor.rowcount, []