因此,我正在尝试使用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从过程中删除该列,它不会返回错误
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
谁能解释我在哪里做错了以及为什么这种情况持续发生?我还有其他的存储过程会给出相同的错误(有些也共享column VER),而我的存储过程却没有。
我尝试了使用odbc_prepare和odbc_execute使用两种查询结构在PHP中获取数据的不同方法{CALL usp_GetRelatedToID(?)},但这给了我更多的错误。
odbc_prepare
odbc_execute
{CALL usp_GetRelatedToID(?)}
而且由于我不愿讨论的原因,我无法在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)
每个用户评论在这里
评论是:
顺便提一句。如果在使用带有ORDER BY子句的execute时有人对“光标类型已更改”警告感到震惊,那么现在就使用exec(记住自己要加上斜线)。 在PHP 5.3中,错误#43668将得到修复,它将使您可以将游标类型更改为SQL_CUR_USE_ODBC。 请注意,您也可以尝试在odbc_connect中选择一个游标类型,但这对我不起作用(出现了更多的问题,然后它解决了)。
顺便提一句。如果在使用带有ORDER BY子句的execute时有人对“光标类型已更改”警告感到震惊,那么现在就使用exec(记住自己要加上斜线)。
在PHP 5.3中,错误#43668将得到修复,它将使您可以将游标类型更改为SQL_CUR_USE_ODBC。
请注意,您也可以尝试在odbc_connect中选择一个游标类型,但这对我不起作用(出现了更多的问题,然后它解决了)。
显然,这是在PHP中的错误,并且将每个修补这个
因此,如果遇到此问题,请尝试使用由odbc_execute()插入的odbc_exec()。