【问题标题】:Calling odbc_fetch_array after executing a stored procedure in PHP gives error [Microsoft][ODBC SQL Server Driver]Invalid Descriptor Index在 PHP 中执行存储过程后调用 odbc_fetch_array 会出现错误 [Microsoft][ODBC SQL Server Driver]Invalid Descriptor Index
【发布时间】:2011-12-22 03:06:30
【问题描述】:

所以,我正在尝试使用 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(?)} 这两种查询结构在PHP 中获取数据的不同方法,但这只会给我带来更多错误。

由于我不会深入讨论的原因,我不能在 PHP 中使用 mssql 函数,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

【问题讨论】:

    标签: php sql stored-procedures odbc


    【解决方案1】:

    我也遇到了这个问题。我解决它的方法是使用

    odbc_exec($connection, $sql)
    

    代替

    odbc_execute($connection, $sql)
    

    根据用户评论here

    评论是:

    顺便说一句。如果有人对“光标类型已更改”警告大发雷霆 在使用带有 ORDER BY 子句的执行时,只需使用 exec for 现在(记得为自己添加斜杠)。

    在 PHP 5.3 中出现错误 #43668 将被修复,它将允许您将光标类型更改为 SQL_CUR_USE_ODBC

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

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

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

    【讨论】:

    • 哇,迟到总比不到好。它就像一个魅力!比我必须重新排列列顺序的解决方案要好得多。谢谢:D
    • 没问题!我真的被愚蠢的光标错误撞到了墙上,所以我花了一天时间寻找。
    猜你喜欢
    • 2013-04-14
    • 2017-12-13
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多