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

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了在PHP中执行存储过程后调用odbc_fetch_array会出现错误[Microsoft] [ODBC SQL Server驱动程序]无效的描述符索引脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
所以,我正在尝试使用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,REASON
    From AMENDMENTS
    WHERE AMENDMENT_ID = $id
END

任何人都可以解释我在哪里做错了,为什么会这样?我有其他存储过程可以提供相同的错误(有些也分享列VER),而且我的存储过程没有.

我尝试了使用odbc_prepare和odbc_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

解决方法

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

odbc_exec($connection,$sql)

代替

odbc_execute($connection,$sql)

根据用户评论here

评论是:

显然这是PHP中的一个错误,并将按照@L_502_1@进行修补

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

脚本宝典总结

以上是脚本宝典为你收集整理的在PHP中执行存储过程后调用odbc_fetch_array会出现错误[Microsoft] [ODBC SQL Server驱动程序]无效的描述符索引全部内容,希望文章能够帮你解决在PHP中执行存储过程后调用odbc_fetch_array会出现错误[Microsoft] [ODBC SQL Server驱动程序]无效的描述符索引所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。