Один из вариантов выбора не выполняется с помощью unixOdbc-SQLSTATE[24000]: недопустимое состояние курсора

я запускаю Ubuntu 13.10 с установленными FreeTDS и ODBC (пакет: php5-odbc). Я использую 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 и выполняю некоторые запросы вставки / выбора, используя транзакции, однако я не могу понять, почему этот запрос терпит неудачу:

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

дает ошибку:

SQLSTATE[24000]: недопустимое состояние курсора: 0 [FreeTDS][SQL Сервер] Недопустимый состояние курсора (SQLExecute[0] at /строительства/утилита buildd/рнр5-5.5.3+для dfsg/ВН/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.

2 ответов


похоже, у вас одновременно открыты два разных результирующих набора. Необходимо завершить обработку первого набора результатов и закрыть его, чтобы можно было повторно использовать оператор для создания второго набора результатов.


вот практическая реализация @mihai-bejenariu ответ.

Если вы используете 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