Php 无效的游标状态,SQLExecDirect中的SQL状态为24000
我需要在PHP中通过ODBC顺序调用两个存储过程:Php 无效的游标状态,SQLExecDirect中的SQL状态为24000,php,sql-server,stored-procedures,odbc,cursor,Php,Sql Server,Stored Procedures,Odbc,Cursor,我需要在PHP中通过ODBC顺序调用两个存储过程: #run stored procedure 1 $query = "Shipped_Not_Shipped_Rep ".$_GET['rep_id']; $result = odbc_exec($dbh, $query); odbc_result_all($result); #run stored procedure 2 $query = "Shipped_Not_Shipped_Account ".$_GET['account_id'];
#run stored procedure 1
$query = "Shipped_Not_Shipped_Rep ".$_GET['rep_id'];
$result = odbc_exec($dbh, $query);
odbc_result_all($result);
#run stored procedure 2
$query = "Shipped_Not_Shipped_Account ".$_GET['account_id'];
$result = odbc_exec($dbh, $query);
odbc_result_all($result);
在第二次存储过程调用之后,我在PHP中遇到了以下错误:
警告:odbc_exec()[function.odbc exec]:SQL错误:
[unixODBC][FreeTDS][SQL Server]无效
游标状态,中的SQL状态24000
SQLExecDirect
如果我重新安排调用存储过程的顺序,那么出错的总是第二个。有没有办法,idk,在调用之间重置光标位置?这里有点脱离我的元素。尝试使用不同的游标、$result1和$result2访问结果。打开数据库的两个句柄。ODBC可能将光标保留在句柄中。我也发现了确切的问题。显然,这在免费的ODBC驱动程序中很常见。尝试将项目从MySQL迁移到ODBC SQL Server,这一直是我早上头疼的问题。我终于找到了摆脱这一切的办法 显示此错误是因为上一个结果集中仍存在活动光标。我能够在不使用断开/重新连接方法的情况下消除此错误,方法是确保在发布新记录集之前读取整个第一个记录集(即使只使用其中的一部分)。注意:我使用的是PHP 给我一个错误:
$sql="SELECT COUNT(whatever) as whatever FROM whatever";<br />
$countResult = odbc_exec($db, $sql);<br />
$countMenuHeader = odbc_fetch_array($countResult);<br />
extract ($countMenuHeader);<br />
$countRecords = $NumMenuHeader;<br />
$sql="SELECT whatever as whatever FROM whatever";<br />
$result = odbc_exec($db, $sql);<br />
$MenuHeader = odbc_fetch_array($result);<br />
$sql="SELECT COUNT(whatever) as whatever FROM whatever";<br />
$countResult = odbc_exec($db, $sql);<br />
while($countMenuHeader = odbc_fetch_array($countResult))<br />
{<br />
extract ($countMenuHeader);<br />
$countRecords = $NumMenuHeader;<br />}
$sql="SELECT whatever as whatever FROM whatever";<br />
$result = odbc_exec($db, $sql);<br />
$MenuHeader = odbc_fetch_array($result);<br />
$sql=“选择COUNT(whatever)as whatever FROM whatever”
$countResult=odbc_exec($db,$sql)
$countMenuHeader=odbc\u fetch\u数组($countResult)
摘录($countMenuHeader)
$countRecords=$NumMenuHeader
$sql=“选择任意项作为任意项中的任意项”
$result=odbc_exec($db,$sql)
$MenuHeader=odbc\U fetch\U数组($result)
已清除错误:
$sql="SELECT COUNT(whatever) as whatever FROM whatever";<br />
$countResult = odbc_exec($db, $sql);<br />
$countMenuHeader = odbc_fetch_array($countResult);<br />
extract ($countMenuHeader);<br />
$countRecords = $NumMenuHeader;<br />
$sql="SELECT whatever as whatever FROM whatever";<br />
$result = odbc_exec($db, $sql);<br />
$MenuHeader = odbc_fetch_array($result);<br />
$sql="SELECT COUNT(whatever) as whatever FROM whatever";<br />
$countResult = odbc_exec($db, $sql);<br />
while($countMenuHeader = odbc_fetch_array($countResult))<br />
{<br />
extract ($countMenuHeader);<br />
$countRecords = $NumMenuHeader;<br />}
$sql="SELECT whatever as whatever FROM whatever";<br />
$result = odbc_exec($db, $sql);<br />
$MenuHeader = odbc_fetch_array($result);<br />
$sql=“选择COUNT(whatever)as whatever FROM whatever”
$countResult=odbc_exec($db,$sql)
而($countMenuHeader=odbc\u fetch\u array($countResult))
{
摘录($countMenuHeader);
$countRecords=$NumMenuHeader;
$sql=“选择任意项作为任意项中的任意项”
$result=odbc_exec($db,$sql)
$MenuHeader=odbc\U fetch\U数组($result)
简而言之,在移动到服务器之前,请确保已完全读取或获取数据集
下一个语句。我遇到了同样的问题,但是两个查询之间的
odbc\u free\u result($result)
为我解决了问题
:
bool-odbc\u-free\u-result(资源$result\u-id)
与结果关联的可用资源
odbc\u free\u result()
仅当您担心
脚本运行时使用太多内存。所有结果存储器
将在脚本完成时自动释放
注:
如果禁用了自动提交(请参见odbc\u autocommit()
),并且您在之前调用了odbc\u free\u result()
)
提交时,将回滚所有挂起的事务
只是想澄清一下,调用finish()意味着您只需要完成当前查询及其结果,现在可以安全地再次调用execute()。无需首先再次调用prepare() 我在AIX上使用DB2SQL数据库的ODBC驱动程序发现了这个问题。我认为AIX有一个旧的ODBC驱动程序,可能是因为在Linux上一切正常 无论如何,我做了一个SQL查询,返回一行,在for循环中反复出现,如下所示,得到了24000个错误
my $sth = $dbh->prepare( $query ) or die "dying";
foreach my $i (@blah)
{
$sth->execute($fred, $i) or die "dying";
my $hash_ref = $sth->fetchrow_hashref("NAME_uc"); # only a single row exists
...
$sth->finish(); # MUST do this
}
我的结论是,我必须调用$sth->finish(),这样我才能安全地再次调用$sth->execute(),否则我可能会得到“无效的游标状态。SQLSTATE=24000”错误消息
这是因为我们必须确保在移动到下一个语句之前完全读取或获取所有数据集。$sth->finish()向DBI指示您已经完成了
语句句柄。然后可以将其重新用于调用execute()
我还发现,我可以将fetch放在while循环中,即使只返回一行,但查询没有返回。似乎试图获取下一个不存在的行也会使sth对于execute是可恢复的
my $sth = $dbh->prepare( $query ) or die "dying";
for
{
$sth->execute($fred, $i) or die "dying";
while (my $hash_ref = $sth->fetchrow_hashref("NAME_uc"))
{
...
}
}
这两种解决方案对我都有效。:) 在PHP中使用unixODBC和freeTDS打开嵌套查询的解决方案 如果可以修改为odbc.ini,请使用相同的连接信息创建另一个配置节,但使用另一个节名:
[数据源1]
Description=“数据连接1”
驾驶员=自由驾驶
服务器=
端口=1433
数据库=
[数据源1a]
Description=“数据连接2”
驾驶员=自由驾驶
服务器=
端口=1433
Database=
为使用SQL server获取无效光标状态的用户尝试的内容:
SET NOCOUNT ON;
在存储过程或SQL脚本的顶部。
可在此处找到:
我遇到了这个问题,只是在SQL Server 2017中运行了一些非常普通的SQL,并没有产生任何影响。不过还是要谢谢你。同时打开两个,每个都用一个是行不通的。但是关闭连接并在查询之间创建一个新的连接确实起到了作用。这不是一个理想的答案,我还在四处闲逛。我的本地安装使用了不同的ODBC驱动程序,可以按顺序运行这两个驱动程序。所以也许有什么…好吧,进一步的研究没有让我有任何进展。因此,我关闭并重新打开每个连接的数据库。这似乎是一个昂贵的操作,但至少我所做的不需要最高性能。请提供一些更合适的细节。