2012-03-06 99 views
0

我想从一个应用程序锁定表,并插入一些数据。我的要求是,如果该表已被任何其它的过程,然后我需要尝试一个特定的时间量之后锁定锁定。异步执行失败

我使用unixODBC驱动程序在CentOS的机器和我的数据库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,为表“测试”已被其他进程锁定。 (杭在这个意义上,等待所有其他进程释放锁)

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

任何帮助是极大的赞赏。提前致谢。

回答

1

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

我看着freetds的ODBC驱动程序代码。

看起来即使对SQLSetStmtAttr()不设置SQL_ASYNC_ENABLE_ON的工作,实际上利用这个属性的功能是使用硬编码值SQL_ASYNC_ENABLE_OFF。