Вызов odbc_fetch_array после выполнения хранимой процедуры в PHP приводит к ошибке [Microsoft] [Драйвер ODBC SQL Server] Недопустимый индекс дескриптора - PullRequest
3 голосов
/ 04 ноября 2011

Итак, я пытаюсь использовать ODBC для выполнения хранимой процедуры в базе данных SQL, но она возвращает ошибку

odbc_fetch_array() [function.odbc-fetch-array]: 
    SQL error: [Microsoft][ODBC SQL Server Driver]Invalid Descriptor Index, 
    SQL state S1002 in SQLGetData

Вот часть PHP, довольно стандартная

...
$id = 240

$user = "user";
$password = "password";
$server = "server";
$database = "database";

$con = odbc_connect("SERVER=$server; 
                     DRIVER=SQL Server;
                     DATABASE=$database", 
                     $user, 
                     $password);    

$res = odbc_exec($con, "exec usp_GetRelatedToID '$id'");

while($row = odbc_fetch_array($res)){
    print_r($row);
}

Вот хранимая процедура, очень маленькая и простая

CREATE PROCEDURE [dbo].[usp_GetRelatedToID]
    @id int
AS
BEGIN
    SET NOCOUNT ON;

    SELECT AMENDMENT_ID, WDATE, ALTERATION, VER, REASON
    FROM AMENDMENTS
    WHERE AMENDMENT_ID = $id
END

Вот схема Table для AMENDMENTS

(Column_name)      (Type)        (Nullable)
AMENDMENT_ID        int             no
RAD_MAIN_ID         int             yes
WDATE               datetime        yes
USR_ID              int             yes
ALTERATION          varchar         yes
REASON              varchar         yes
VER                 int             yes

Identity        Seed   Increment   Not For Replication
AMENDMENT_ID      1        1               0

constraint_type               constraint_name      constraint_keys
PRIMARY KEY (non-clustered) aaaaaAMENDMENTS1_PK      AMENDMENT_ID

Интересно то, что она не возвращает ошибку, еслиЯ удаляю столбец VER из процедуры

Примерно так:

CREATE PROCEDURE [dbo].[usp_GetRelatedToID]
    @id int
AS
BEGIN
    SET NOCOUNT ON;

    SELECT AMENDMENT_ID, WDATE, ALTERATION, REASON
    FROM AMENDMENTS
    WHERE AMENDMENT_ID = $id
END

Может кто-нибудь объяснить, где я делаю неправильно и почему это происходит?У меня есть другие хранимые процедуры, которые выдают те же ошибки (некоторые также разделяют столбец VER), и у меня есть хранимые процедуры, которые этого не делают.

Я пробовал разные способы полученияданные в PHP, использующие odbc_prepare и odbc_execute с обеими структурами запросов, {CALL usp_GetRelatedToID(?)}, но это только дало мне больше ошибок.

И по причинам, в которые я не буду вдаваться, я не могу использовать mssqlфункции в PHP, ODBC - единственный способ, которым мне разрешено подключаться и запрашивать.

О, и выполнение простого (оригинального) запроса вместо хранимой процедуры не дает ошибок.

РЕДАКТИРОВАТЬ

$stmt = odbc_prepare($con, "{CALL usp_GetRelatedToID($id)}");
$res = odbc_execute($stmt, array());

//or

$stmt = odbc_prepare($con, "{CALL usp_GetRelatedToID(?)}");
$res = odbc_execute($stmt, array($id));

Оба возвращают это сообщение об ошибке:

Warning: odbc_execute() [function.odbc-execute]: 
    SQL error: [Microsoft][ODBC SQL Server Driver]Cursor type changed, 
    SQL state 01S02 in SQLExecute

1 Ответ

7 голосов
/ 25 июня 2012

Я тоже столкнулся с этой проблемой.Я нашел способ использовать

odbc_exec($connection, $sql)

вместо

odbc_execute($connection, $sql)

За комментарий пользователя здесь

Комментарий был:

Кстати.Если кто-то стучит головой об предупреждении «тип курсора изменен» при использовании команды execute с предложением ORDER BY, просто воспользуйтесь сейчас exec (не забывайте добавлять косые черты для себя).

В PHP 5.3 будет исправлена ​​ошибка # 43668, которая позволит вам изменить тип курсора на SQL_CUR_USE_ODBC

Обратите внимание, что вы также можете попробовать выбрать тип курсора в odbc_connect, но этоу меня не получилось (появилось гораздо больше проблем, чем решилось).

Очевидно, это ошибка в PHP, и она будет исправлена ​​за это

Поэтому попробуйте использовать odbc_exec () вместо odbc_execute (), если у вас возникла эта проблема.

...