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