Разница, в общем, не в том, что во втором случае мы можем использовать параметры в запросе, а в том, что во втором случае СУБД не тратит время на разбор строки запроса для выполнения — это уже было сделано вызовом SQLPrepare. Соответственно, если нам нужно выполнить много (несколько) однотипных запросов с набором разных параметров, мы можем один раз подготовить SQL-выражение, что ускорит работу.
А параметры в виде "?" можно использовать и в SQLExecDirect(...). Вязать их, соответсвенно, нужно до вызова SQLExecDirect(...), но после SQLAllocHandle(...) для выражения (STMT).