【发布时间】: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_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
【问题讨论】:
标签: php sql stored-procedures odbc