在PHP中执行存储过程后调用odbc_fetch_array会出现错误[Microsoft] [ODBC SQL Server驱动程序]无效的描述符索引

时间:2011-11-04 15:16:30

标签: php sql stored-procedures odbc

所以,我正在尝试使用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

这是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),而且我的存储过程没有。

我尝试了使用odbc_prepareodbc_execute使用{CALL usp_GetRelatedToID(?)}$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)); 两种查询结构在PHP中获取数据的不同方法,但这只是给了我更多错误。

由于我不会进入的原因,我不能在PHP中使用mssql函数,ODBC是我允许连接和查询的唯一方法。

哦,执行普通(原始)查询而不是存储过程不会产生任何错误。

修改

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

两者都返回此错误消息:

{{1}}

1 个答案:

答案 0 :(得分:7)

我也遇到了这个问题。我绕过它的方式是使用

odbc_exec($connection, $sql)

而不是

odbc_execute($connection, $sql)

根据用户评论here

评论是:

  

顺便说一句。如果有人正在敲打“游标类型改变”警告   使用带ORDER BY子句的execute时,只需使用exec即可   现在(记得给自己添加)。

     

在PHP 5.3中,一个Bug#43668   将被修复,它将允许您将光标类型更改为   SQL_CUR_USE_ODBC

     

请注意,您也可以尝试在odbc_connect中选择游标类型,但这对我不起作用(出现了更多问题然后解决了)。

显然这是PHP中的一个错误,将根据this

进行修补

如果您遇到此问题,请尝试使用odbc_exec()输入odbc_execute()。