async def METHOD_NAME(self, sql: str, *params) -> Tuple[Optional[List[List]], Optional[str]]:
    """
    Execute a single SQL statement. Parameters are optional.
    Returns a (result, error) tuple, where result is a 2-dimensional list in
    row-major order, and error is a string error message, if any.
    The result will be None if the error is not None.
    Therefore, always check if there is an error before attempting to use the result.
    Args:
        sql: SQL statement
        params: Parameters to the SQL statement, one of str, int, float or None
    Returns:
        A (result, error) tuple
    Example:
    result, err = db.exec(sql)
    if err:
        print(error)
        return
    print(result)
    result, error = db.exec('CREATE TABLE student(name TEXT, age INTEGER)')
    result, error = db.exec('INSERT INTO student VALUES ("Alice", 18)')
    result, error = db.exec('INSERT INTO student VALUES (?, ?)', "Bob", 19)
    result, error = db.exec('SELECT name, age FROM student WHERE age > 17')
    result, error = db.exec('SELECT name, age FROM student WHERE age > ?', 17)
    """
    r, err = await self._exec([(sql, *params)])
    if err:
        return None, err
    return r[0], None