При вызове SQLFreeStmt, как определить вариант (SQL_CLOSE, SQL_UNBIND и SQL_RESET_PARAMS)?

После прочтения официального документа SQLFreeStmt много раз, я все еще не могу понять, когда использовать какой option? (Хорошие новости SQL_DROP устарела, поэтому я могу сосредоточиться только на SQL_CLOSE, SQL_UNBIND а также SQL_RESET_PARAMS).

Я знаю, что самый безопасный способ это:

for ()
{
    SQLAllocHandle(SQL_HANDLE_STMT, conn_handle, &stmt_handle);
    do some thing;
    SQLFreeHandle(SQL_HANDLE_STMT, stmt_handle);
}

Но я думаю, что эффективность очень низкая, и должен быть метод, позволяющий повторно использовать тот же дескриптор оператора. Но после поиска в Google и чтения официального документа SQLFreeStmt я не могу получить подробное объяснение и примеры того, как использовать какую опцию.

Например:

SQLAllocHandle(SQL_HANDLE_STMT);
SQLExecDirect(stmt_handle, query, SQL_NTS);
SQLBindCol(stmt_handle, ......);
SQLFetchScroll(stmt_handle, SQL_FETCH_NEXT, 1);

Если я хочу, чтобы другой запрос SQL с другими столбцами привязки, как я должен передать параметр SQLFreeStmt()? Если я хочу сделать операцию вставки, как я должен передать опцию SQLFreeStmt()?

Может ли кто-нибудь дать подробные объяснения или примеры? Большое спасибо заранее!

1 ответ

Решение

SQL_CLOSE закрывает курсор. Обычно вам нужно сделать это, только если вы не загрузили все данные. например,

SQLAllocHandle (for stmt)
SQLPrepare(stmt, 'select one_col from table_with_100_rows')
SQLExecute(stmt)
SQLFetch(stmt)
SQLFreeStmt(stmt,SQL_CLOSE) # needed here because there are 99 rows left
                            # that is cursor is still open
# here might want to call SQL_UNBIND and SQL_RESET_PARAMS especially
# if the columns or parameters differ
SQLPrepare(stmt, 'select another_col from another_table')

Если вы извлекаете все строки в цикле, пока не получите SQL_NO_DATA, курсор будет закрыт для вас. SQL_UNBIND просто удаляет любой связанный столбец, связанный с оператором. В приведенном выше примере вы могли привязать переменную к столбцу 1, чтобы получить содержимое 'one_col' при вызове SQLFetch. Если вы хотите отменить привязку столбца, чтобы вы могли получить данные, скажем, с помощью SQLGetData, вы бы сделали SQLFreeStmt(SQL_UNBIND).

На ваш вопрос за этим довольно сложно ответить, так как кроме упоминания повторного использования утверждения, мы не знаем ваш сценарий. Вы, кажется, прочитали документы по SQLFreeStmt и теперь ищете способ использовать SQLFreeStmt, когда это должно быть наоборот.

Вы можете повторно использовать дескриптор оператора, чтобы сказать, что подготовьте новый запрос, просто убедившись, что оператор закрыт и не имеет связанного столбца или параметров. Я сомневаюсь, что выделение нового оператора и его освобождение в конце - это дорогостоящая операция во многих драйверах, но у вас есть путь для повторного использования, если вы хотите избежать этого.

Другие вопросы по тегам