2013-12-15 8 views
6

FreeTDS 및 ODBC (패키지 : php5-odbc)가 설치된 Ubuntu 13.10을 실행 중입니다. 나는 tds version = 8.0을 사용했지만 tds version = 7.2도 시도했다.unixOdbc - SQLSTATE [24000]을 사용하여 SELECT 중 하나가 실패합니다. 유효하지 않은 커서 상태

내가 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]: Invalid cursor state: 0 [FreeTDS][SQL Server]Invalid cursor state (SQLExecute[0] at /build/buildd/php5-5.5.3+dfsg/ext/pdo_odbc/odbc_stmt.c:254)

나는 befor를 비슷한 쿼리의 송이를 실행하고 예를 들면 다음과 같습니다.

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

왜 이런 일이 발생 했습니까?

나는 dblib 및 sqlsrv와 같은 문제가 없었지만 지금은 유닉스에서 sqlsrv를 사용할 수 없으며 dblib UTF-8 인코딩 문제로 인해 ODBC를 사용하려고합니다.

답변

7

동시에 두 개의 다른 결과 세트가 열려있는 것처럼 보입니다. 첫 번째 ResultSet을 처리하고 닫아서 Statement를 다시 사용하여 두 번째 ResultSet을 작성할 수 있어야한다.

+0

prepare() 및 execute() 대신 query()를 사용하고 있습니다. 어떤 차이가 있습니까? – NeverEndingQueue

+0

또한 나는 당신이 말하는 의미가 무엇인지 이해하지 못한다 : "동시에 두 가지 다른 요청". 쿼리 중 하나를 실행하고 실행 한 후 다음 쿼리가 실행되면 즉시 2를 실행하는 방법이 없습니다. 권리? – NeverEndingQueue

+2

@ NeverEndingQueue : 첫 번째 rs가 닫히지 않았다고 생각합니다. 따라서 rs1.Close()가이를 수정해야합니다. –