多次阅读SQLFreeStmt official document后,我仍然无法确定何时使用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);
}
但我认为效率非常低,应该有一种方法可以重用相同的语句句柄。但在谷歌搜索并阅读SQLFreeStmt official document之后,我无法获得有关如何使用哪个选项的详细解释和示例。
例如:
SQLAllocHandle(SQL_HANDLE_STMT);
SQLExecDirect(stmt_handle, query, SQL_NTS);
SQLBindCol(stmt_handle, ......);
SQLFetchScroll(stmt_handle, SQL_FETCH_NEXT, 1);
如果我想要另一个具有不同绑定列的SQL查询,我应该如何将选项传递给SQLFreeStmt()
?如果我想进行插入操作,我应该如何将选项传递给SQLFreeStmt()
?
有人可以提供一些详细的解释或示例吗?非常感谢提前!
答案 0 :(得分: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列,以在调用SQLFetch时接收“one_col”的内容。如果你想取消绑定列,以便你可以使用SQLGetData来获取数据,那么你将使用SQLFreeStmt(SQL_UNBIND)。
除了提及重复使用我们不了解您的方案的语句之外,您之外的问题很难回答。您似乎已经阅读了SQLFreeStmt上的文档,现在正在寻找一种方法来使用SQLFreeStmt,而它应该是相反的方式。
您可以重复使用语句句柄来说明只需确保语句已关闭且没有绑定列或参数即可准备新查询。我怀疑分配一个新的声明并在最后释放它是许多驱动程序中的一个昂贵的操作,但如果你想避免它,你有一条重用的路径。