【问题标题】:One of the SELECT fails using unixOdbc - SQLSTATE[24000]: Invalid cursor state使用 unixOdbc 的 SELECT 之一失败 - SQLSTATE[24000]: Invalid cursor state
【发布时间】:2014-01-02 21:16:08
【问题描述】:

我正在运行安装了 FreeTDS 和 ODBC(包:php5-odbc)的 Ubuntu 13.10。 我用tds version = 8.0,也试过tds version = 7.2。

我正在使用 PDO,这是我的 DSN:

$dsn = sprintf('odbc:Driver=FreeTDS;Server=%s;Port=1433;Database=%s', DB_SQL_SERVERNAME, DB_DB_NAME);

我连接到 MSSQL 实例并使用事务执行一些 INSERT/SELECT 查询,但是我不知道为什么这个查询失败:

SELECT id 
FROM tblColumns 
WHERE siteID = 10063 AND 
    typeID = 1000 AND 
    extendedTypeID = 18 AND 
    label = 'RwThiFc85A'

给出错误:

SQLSTATE[24000]:游标状态无效:0 [FreeTDS][SQL Server]无效 游标状态(SQLExecute[0] at /build/buildd/php5-5.5.3+dfsg/ext/pdo_odbc/odbc_stmt.c:254)

我之前运行过一堆类似的查询并且它们执行得很好,例如:

SELECT id 
FROM tblColumns 
WHERE siteID = 10063 AND 
    typeID = 1000 AND 
    extendedTypeID = 3 AND 
    label = 'VwThiFc91B'

你知道为什么会这样吗?

我在使用 dblib 和 sqlsrv 时没有遇到这样的问题,但是现在我在 Unix 上无法使用 sqlsrv,并且由于 dblib UTF-8 编码的问题,我正在尝试使用 ODBC。

【问题讨论】:

    标签: php sql-server odbc freetds unixodbc


    【解决方案1】:

    看起来您同时打开了两个不同的结果集。您必须完成第一个 ResultSet 的处理并关闭它,这样您才能重新使用 Statement 来创建第二个 ResultSet。

    【讨论】:

    • 我只使用 query() 而不是 prepare() 和 execute()。有什么区别吗?
    • 另外,我不明白您所说的:“同时打开两个不同的请求”是什么意思。我运行其中一个查询,运行后有下一个查询,没有办法一次运行 2 或类似的东西。对吗?
    • @NeverEndingQueue:我怀疑第一个 rs 没有关闭,所以 rs1.Close() 应该修复它。
    • 我不完全确定它为什么起作用,但现在很好。其他驱动程序不需要这样做,在该循环内执行的查询也很少,但它仅在该特定 SELECT 上失败。感谢您的帮助。
    • @NeverEndingQueue 一些驱动程序自己执行 FetchAll 和 Close。其他确实逐行获取,您必须自己关闭()结果集。哪种行为更好 - 很难说,取决于结果数据集的大小,但它们都存在。我遇到了同样的情况,这个帖子帮我解决了我的问题,谢谢!
    【解决方案2】:

    这里是@mihai-bejenariu answer的实际实现。

    如果你使用 PHP 和 PDO,你可以这样做:

    $query = "<your sql query>";
    $sth = $connection->prepare($query);
    $sth->execute();
    $result = $sth->fetchAll();
    $sth->closeCursor();   //Write this after you have fetched the result
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多