在没有SQLPrepare的SQLFreeStmt之后我可以调用SQLExecute吗?

时间:2010-05-14 09:46:11

标签: odbc

我有以下代码调用序列:

SQLPrepare
SQLExecute(hstmt, SQL_CLOSE);
SQLFreeStmt
//It works till here
SQLExecute //Now it fails.

为什么我需要再次调用SQLPrepare,我只是释放了光标。我不应该再次准备SQL语句。

2 个答案:

答案 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