使用unixODBC api异步执行sql失败

时间:2012-03-06 10:25:39

标签: postgresql asynchronous unixodbc

我想从一个应用程序锁定一个表并插入一些数据。我的要求是,如果该表已被任何其他进程锁定,那么我需要在特定时间后尝试锁定。

我在centOS机器上使用unixODBC驱动程序,我的数据库是postgresql。我做了一个关于如何使用odbc api异步执行sql的研究。我发现SQLSetStmtAttr api可用于异步执行sql语句。但它不起作用。

这就是我编写代码的方式:

 ret =  SQLSetStmtAttr( stmt1,  SQL_ATTR_ASYNC_ENABLE,(SQLPOINTER) SQL_ASYNC_ENABLE_ON, 0);
// above statement returned success

 if((ret = SQLExecDirect(stmt1,"lock table test",SQL_NTS)) == SQL_STILL_EXECUTING)
  {
     printf("\nCanceling\n");
     ret = SQLCancel(stmt);
  }

//但是进程在SQLExecDirect api上挂起,因为该表“test”已被另一个进程锁定。 (从某种意义上说,等待所有其他进程释放锁定)

为什么会这样?是因为我的unixODBC驱动程序不支持异步执行。如果它为什么SQLSetStmtAttr返回成功呢?

非常感谢任何帮助。提前谢谢。

1 个答案:

答案 0 :(得分:1)

您使用的是freeTDS驱动吗?你提到过unixODBC,我认为它是一个驱动程序管理器而不是驱动程序本身。

我正在查看freeTDS ODBC驱动程序代码。

看起来即使SQLSetStmtAttr()完成设置SQL_ASYNC_ENABLE_ON的工作,实际使用此属性的函数也使用硬编码值SQL_ASYNC_ENABLE_OFF。

相关问题