因此,我正在尝试使用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);
}
这是html" target="_blank">存储过程,非常小而容易
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
谁能解释我在哪里做错了以及为什么这种情况持续发生?我还有其他的存储过程会给出相同的错误(有些也共享column VER
),而我的存储过程却没有。
我尝试了使用odbc_prepare
和odbc_execute
使用两种查询结构在PHP中获取数据的不同方法{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中选择一个游标类型,但这对我不起作用(出现了更多的问题,然后它解决了)。
显然,这是在PHP中的错误,并且将每个修补这个
因此,如果遇到此问题,请尝试使用由odbc_execute()插入的odbc_exec()。
问题内容: 我正在使用代码点火器框架。我一直在尝试执行我在PHP上的Microsoft SQL Server 2008上编写的存储过程(无参数),但是出现错误。此存储过程在Microsoft SQL Server上运行良好,没有错误。我正在使用sqlsrv作为驱动程序,如果有帮助,我具有PHP 5.2版。 这是我得到的错误 以下是我拥有的部分代码 我用实际查询替换了实际查询,它确实可以工作,但不能
问题内容: 我试图在postgres 9.3上使用sql调用函数内的函数。 这个问题与我的另一篇文章有关。 我写了下面的函数。到目前为止,我还没有合并任何类型的save-output(COPY)语句,因此我试图通过创建嵌套函数print-out函数来解决此问题。 以上功能有效。 尝试创建嵌套函数。 调用嵌套函数。 输出 上面给出了这个。但是,当在print_out()中将arg1,arg2替换为’
问题内容: 我在任何地方都找不到此答案,但是可以从MySQL中的另一个存储过程调用存储过程吗?我想找回标识值,并在父存储过程中使用它。我们不能再使用FUNCTIONS! 问题答案: 参数应该可以帮助您将值返回给调用过程。基于此,解决方案必须是这样的。
为了使用Oracle存储过程学习Hibernate4.1,我尝试使用一个尽可能简单的示例:1。%2中没有传递参数。SYS_REFCURSOR作为一个返回参数 我得到的是一个异常:“org.hibernate.exception.GenericJDBcException:无效列索引”。在网上搜索几个小时来解决这个问题并没有什么帮助。 ================================异
我正在为db2创建一个存储过程。但是它给出了一个错误 SQL错误[42601]:在“SS_token_BAK”之后发现意外的标记“END-OF-STATEMENT”。预期的标记可能包括:“END IF”。.SQLCODE=-104,SQLSTATE=42601,DRIVER=4.23.42。 以下是我的存储过程。 是否有人面临此类问题。任何这方面的帮助将不胜感激。
问题内容: 我应该做的是创建一个Java存储过程,然后再从Java程序中调用它。 我在执行JAVA程序时遇到问题-带有1个参数的JDBCPiemers(如下)(我需要弄清楚String Nosaukums)。错误:“无效的列名”。 调用ORACLE中的过程可以正常工作。 这是我已存储在数据库中的存储过程。 我用oracle创建了以下程序包。 这是我在其中调用该过程的Java程序。但是我无法使它工作