我有以下代码调用序列:
SQLPrepare
SQLExecute(hstmt, SQL_CLOSE);
SQLFreeStmt
//It works till here
SQLExecute //Now it fails.
为什么我需要再次调用SQLPrepare,我只是释放了光标。我不应该再次准备SQL语句。
答案 0 :(得分:1)
正确的行为是SQLPrepare / SQLExecute / SQLFreStmt(stmt,SQL_CLOSE)应该在同一个stmt句柄上允许另一个SQLExecute而无需重新准备。您可以在“ODBC程序员指南”中将此视为有效的状态转换。你可以使用这个序列,如果你已经完成了一个SQLPrepare(sql)并且只获取了一些行(而不是所有的行),就像没有SQLFreeStmt(stmt,SQL_CLOSE)那样,或者在返回SQL_NO_DATA之前获取,你会得到一个无效的游标如果您发出了另一个SQLExecute,请说明。 SQLFreeStmt(stmt,SQL_DROP)等同于SQLFreeHandle(SQL_HANDLESTMT,stmt)并释放整个stmt句柄,这意味着你根本不能再使用它。
答案 1 :(得分:0)
SQLFreeStmt(hstmt,SQL_CLOSE)清除与该语句句柄有关的所有内容,看看summary:
SQLFreeStmt停止处理 与特定声明相关联, 关闭任何相关的打开游标 随着声明,丢弃待定 结果,或者,可选地,释放所有 与之相关的资源 陈述句柄。
如果您不想再次使用SQLPrepare
,可以改用SQLExecDirect
。