Php 带有MSSQL的PDO返回无效游标
我正在运行与本地MSSQL数据库的PDO连接。通过连接运行任何存储过程都不会给我任何错误 这一个存储过程给了我以下错误:Php 带有MSSQL的PDO返回无效游标,php,sql-server,pdo,Php,Sql Server,Pdo,我正在运行与本地MSSQL数据库的PDO连接。通过连接运行任何存储过程都不会给我任何错误 这一个存储过程给了我以下错误: Error in SQL: [Microsoft][SQL Server Native Client 10.0]Invalid cursor state - Query: exec sp_Get_SaldosWeb @Tipo=1, @IdDato=15368 这是我当前的PDO字符串,用于在此函数内连接并返回数组: $query = $this->d
Error in SQL: [Microsoft][SQL Server Native Client 10.0]Invalid cursor state - Query: exec sp_Get_SaldosWeb @Tipo=1, @IdDato=15368
这是我当前的PDO字符串,用于在此函数内连接并返回数组:
$query = $this->db->prepare($qry, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$final = $query->execute();
$this->setRows($query);
if(!$final) {
$this->error($qry, $query, $ret);
} else {
return $query->fetchAll();
}
我尝试在执行之前和获取之后关闭光标,如下所示:
$rows = $query->fetchAll();
$query->closeCursor();
return $rows;
但这也不起作用。仅供参考,在此调用此存储过程之前,在我的代码中任何地方都没有执行任何查询
不确定此存储过程为什么会出现这么多错误。如果我从MSSQL管理控制台运行完全相同的SP,它将正常运行并返回3行
编辑:
以下是存储过程:
USE [DBNAME]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[sp_Get_SaldosWeb]
@Tipo int , --1 = Alumno 2 = Familia
@IdDato int
as
if @Tipo = 1
begin
select SC_Alumno.Codigo ,
SC_Alumno.Nombres + ' ' + SC_Alumno.Apellidos as [Nombre],
SC_Moneda.Nombre as Moneda, upper(replace(replace(replace(replace(replace( replace(lower(SC_TipoCargo.Nombre),char(237),'i'), char(243),'o'), char(233),'e') , char(225),'a') ,char(250),'u'),char(241),'ñ')) as [Tipo de Cargo]
, cast(round(Sum(SC_CargoxAlumno.Debe),2) as decimal(18,2)) as Monto ,
SC_Alumno.Codigo as Codigo2
from SC_CargoxAlumno
inner join SC_Moneda on SC_CargoxAlumno.IdSC_Moneda = SC_Moneda.IdSC_Moneda
inner join SC_TipoCargo on SC_CargoxAlumno.IdSC_TipoCargo = SC_TipoCargo.IdSC_TipoCargo
inner join SC_Alumno on SC_Alumno.IdSC_Alumno = SC_CargoxAlumno.IdSC_Alumno
inner join SC_Familia on SC_Alumno.IdSC_Familia = SC_Familia.IdSC_Familia
where
SC_Alumno.IdSC_Alumno = @IdDato
and SC_CargoxAlumno.Debe <> 0
group by
SC_Alumno.Codigo ,
SC_Alumno.Nombres + ' ' + SC_Alumno.Apellidos ,
SC_Moneda.Nombre , SC_TipoCargo.Nombre
end
else
begin
select SC_Alumno.Codigo ,
SC_Alumno.Nombres + ' ' + SC_Alumno.Apellidos as [Nombre],
SC_Moneda.Nombre as Moneda, upper(replace(replace(replace(replace(replace( replace(lower(SC_TipoCargo.Nombre),char(237),'i'), char(243),'o'), char(233),'e') , char(225),'a') ,char(250),'u'),char(241),'ñ')) as [Tipo de Cargo] ,
cast(round(Sum(SC_CargoxAlumno.Debe),2) as decimal(18,2)) as Monto ,
SC_Alumno.Codigo as Codigo2
from SC_CargoxAlumno
inner join SC_Moneda on SC_CargoxAlumno.IdSC_Moneda = SC_Moneda.IdSC_Moneda
inner join SC_TipoCargo on SC_CargoxAlumno.IdSC_TipoCargo = SC_TipoCargo.IdSC_TipoCargo
inner join SC_Alumno on SC_Alumno.IdSC_Alumno = SC_CargoxAlumno.IdSC_Alumno
inner join SC_Familia on SC_Alumno.IdSC_Familia = SC_Familia.IdSC_Familia
where
SC_Familia.IdSC_Familia = @IdDato
and SC_CargoxAlumno.Debe <> 0
group by
SC_Alumno.Codigo ,
SC_Alumno.Nombres + ' ' + SC_Alumno.Apellidos ,
SC_Moneda.Nombre , SC_TipoCargo.Nombre
end
使用[DBNAME]
去
将ANSI_空值设置为ON
去
在上设置带引号的\u标识符
去
ALTER proc[dbo].[sp\U Get\U SaldosWeb]
@Tipo int,--1=校友2=家庭
@IdDato int
作为
如果@Tipo=1
开始
选择SC_Alumno.Codigo,
SC_校友姓名+“”+SC_校友姓名为[Nombre],
替换(替换(替换)(替换(替换)(替换(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换
,将(四舍五入(总和,2)转换为十进制(18,2))转换为蒙托,
SC_校友Codigo作为Codigo2
来自SC_CargoxAlumno
SC_CargoxAlumno.IdSC_Moneda=SC_Moneda.IdSC_Moneda上的内部联接SC_Moneda
SC_CargoxAlumno.IdSC_TipoCargo=SC_TipoCargo.IdSC_TipoCargo上的内部联接SC_TipoCargo
在SC_Alumno.IdSC_Alumno=SC_CargoxAlumno.IdSC_Alumno上内部加入SC_Alumno
内部连接SC_Familia on SC_校友o.IdSC_Familia=SC_Familia.IdSC_Familia
哪里
SC_Alumno.IdSC_Alumno=@IdDato
和SC_CargoxAlumno.Debe 0
分组
理大校友科迪戈,
理工大学校友名称+“”+理工大学校友名称,
S_Moneda.Nombre,S_TipoCargo.Nombre
结束
其他的
开始
选择SC_Alumno.Codigo,
SC_校友姓名+“”+SC_校友姓名为[Nombre],
替换(替换(替换)(替换(替换)(替换(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换)(,
铸造(四舍五入(总和,2)为十进制(18,2))为蒙托,
SC_校友Codigo作为Codigo2
来自SC_CargoxAlumno
SC_CargoxAlumno.IdSC_Moneda=SC_Moneda.IdSC_Moneda上的内部联接SC_Moneda
SC_CargoxAlumno.IdSC_TipoCargo=SC_TipoCargo.IdSC_TipoCargo上的内部联接SC_TipoCargo
在SC_Alumno.IdSC_Alumno=SC_CargoxAlumno.IdSC_Alumno上内部加入SC_Alumno
内部连接SC_Familia on SC_校友o.IdSC_Familia=SC_Familia.IdSC_Familia
哪里
SC_Familia.IdSC_Familia=@IdDato
和SC_CargoxAlumno.Debe 0
分组
理大校友科迪戈,
理工大学校友名称+“”+理工大学校友名称,
S_Moneda.Nombre,S_TipoCargo.Nombre
结束
在程序的开头添加“设置无计数”
您可以在此处找到参考资料:
查看该过程可能会有用一些
将NoCount设置为ON
到哪里去了?我不明白你的意思,看到这个过程了吗?sp_Get_SaldosWeb
来自Microsoft SQL Server管理研究我不熟悉PDO你可以尝试在你的过程开始时添加SET NOCOUNT ON
。这会影响任何以任何方式使用此过程的.Net应用程序吗?