thinkphp调用sqlserver储存过程返回多个结果集
首先安装扩展
windows
分为两个步骤
- 找到对应自己PHP版本的pdo扩展,下载解压出来,并且在
php.ini
里面启用扩展,需要注意的问题是php版本以及是否为安全版本 - 下载
ODBC Driver
https://docs.microsoft.com/zh-cn/sql/connect/odbc/download-odbc-driver-for-sql-server?view=sql-server-2017,这个没啥注意的,你是啥系统就下载啥安装包就行
linux 和 windows差不多,安装扩展的话直接可以用pecl
当你成功加载了可以在phpinfo()
里面看到,当然了,如果你安装扩展这些都有诸多问题都话,~你可真拉稀。
thinkphp操作sqlsrv储存过程
我使用的tp版本是5.0和操作多个数据库,希望能对你有所帮助
配置config文件
// 账号数据库
'UserDBConn' => [
'type' => 'sqlsrv',
// 服务器地址
'hostname' => '139.129.1.1',
// 数据库名
'database' => 'DB3',
// 用户名
'username' => 'xxxx',
// 密码
'password' => 'tt123!@#',
// 端口
'hostport' => '5188'
],
// 金币数据库
'ScoreDBConn' => [
'type' => 'sqlsrv',
// 服务器地址
'hostname' => '139.129.1.1',
// 数据库名
'database' => 'DB2',
// 用户名
'username' => 'xxxx',
// 密码
'password' => 'tt123!@#',
// 端口
'hostport' => '5188'
],
// 记录数据库
'RecordDBConn' => [
'type' => 'sqlsrv',
// 服务器地址
'hostname' => '139.129.1.1',
// 数据库名
'database' => 'DB1',
// 用户名
'username' => 'xxxx',
// 密码
'password' => 'tt123!@#',
// 端口
'hostport' => '5188'
],
修改thinkphp/library/think/Model.php
在末尾追加
/**
* @param $DbconnName
*/
protected function Dbconn($DbconnName){
try{
$conn = Db::connect($DbconnName);
}catch (\InvalidArgumentException $e){
echo '连接异常';
die;
}
return $conn;
}
添加模型
Agent.php
查询和增删改都可以调用query,如果你没有想要获取的结果集的话可以调用execute()
。
query()
有一个弊端,如果你的绑定参数的形式(非参数绑定)是直接写进sql的话,他有可能会判断你这个不是一个储存过程;
具体实现请查看thinkphp/library/think/db/Connection.php:368行,当然也不会有结果集返回。
你也可以用调用procedure()
,这个方法调用的话就一定会返回结果集。
起初我就是这个问题,并没有采用绑定参数的形式提交,直接写sql,就获取不到结果集,后来我在我的sql提行里面加入了SET NOCOUNT ON;
,才能勉强拿到返回,在文章最后我给出了我最开始获取的结果集的方案例子,但是真的拉稀,你们可以看看,不要吐槽。
class Agent extends Model
{
public $Dbname = 'UserDBConn';
public function GetIndirectAgentList($agentId,$strAccount,$strSuperior,$iPageIndex,$pagesize)
{
$conn = $this->Dbconn($this->Dbname);
try{
$TotalCount = 0;
$res = $conn::query('exec [dbo].[Agent_GetAgentList] :agentId,:strAccount,:strSuperior,:iPageIndex,:pagesize,:TotalCount', [
'agentId' => $agentId,
'strAccount' => [$strAccount, PDO::PARAM_STR],
'strSuperior' => [$strSuperior, PDO::PARAM_STR],
'iPageIndex' => [$iPageIndex, PDO::PARAM_INT],
'pagesize' => [$pagesize, PDO::PARAM_INT],
'TotalCount' => [$TotalCount, PDO::PARAM_INPUT_OUTPUT],
]);
}catch (PDOException $e)
{
return false;
}
return $res;
}
}
最初的Agent.php
很显然 这里并不会获取到@AgentID 以及 @TotalCount;他只会返回Agent_GetAgentList的结果集
public function GetIndirectAgentList($agentId,$strAccount,$strSuperior,$iPageIndex,$pagesize)
{
$conn = $this->Dbconn($this->Dbname);
try{
$res = $conn->query('
SET NOCOUNT ON;
declare @AgentID int;
declare @TotalCount int;
exec [dbo].[Agent_GetAgentList] '.$agentId.',\''.$strAccount.'\',\''.$strSuperior.'\','.$iPageIndex.','.$pagesize.',@TotalCount output;
select @AgentID as AgentID,@TotalCount as TotalCount
');
}catch (PDOException $e)
{
return false;
}
return $res;
}
thinkphp调用sqlserver储存过程返回多个结果集的更多相关文章
- Mybatis下配置调用Oracle自定义函数返回的游标结果集
在ibatis和Mybatis对存储过程和函数函数的调用的配置Xml是不一样的,以下是针对Mybatis 3.2的环境进行操作的. 第一步配置Mapper的xml内容 <mapper names ...
- ibatis.net调用oracle存储过返回游标SYS_REFCURSOR结果集
最近在用ibatis.net框架和oracle 11g开发一套程序.其中有一个需求就是通过存储过程,查询指定条件的数据集. 但是在开发的过程中遇到了问题,问题如下: 1.如何通过ibatis.net执 ...
- 简简单单储存过程——循环一个select结果集
原文地址:https://shitou521.iteye.com/blog/1069027 摘要:本文主要讲解了存储过程的创建.调用.以及游标的使用 ,相信掌握了游标 会对你有不错的帮助,有 ...
- Mysql 储存过程以及 python callproc调用
一.存储过程(stored procedure) 存储过程将存入的一系列SQL语句进行预编译,执行并存放在数据库中,之后如果需要使用sql语句对这一组sql进行访问时可以直接提取(很好理解 存储过程就 ...
- Java储存过程
存储过程:是指保存在数据库并在数据库端执行的程序. CallableStatement 对象为所有的 DBMS 提供了一种以标准形式调用已储存过程的方法.已储存过程储存在数据库中. 对已储存过程的调用 ...
- MySql 在cmd下的学习笔记 —— 有关储存过程的操作(procedure)
我们把若干条sql封装取来,起个名字------把此过程存储在数据库中叫存储过程 调用procedure 储存过程是可以变成的,意味着可以使用变量,表达式,控制结构 来完成复杂的功能 声明变量 pro ...
- Atitit jdbc 处理返回多个结果集
Atitit jdbc 处理返回多个结果集 Statement接口提供了三种执行SQL语句的方法: executeQuery.executeUpdate和execute.使用哪一个方法由SQL语句所 ...
- JDBC和JPA调用储存过程 接收存储过程有返回值
============jdbc==========================================--java代码:一个输出参数--String connURL = null;Con ...
- Sqlserver中的储存过程
一.什么是存储过程(Stored Procedure) 存储过程是一段存储在数据库的“子程序”,本质是一个可重复使用的SQL代码块,可以理解为数据库端的“方法”. 存储过程的好处: ①提高性能:由于数 ...
随机推荐
- 傅盛读书笔记:下一个Moonshot是什么?
猎豹移动CEO 傅盛 九月底,我有幸在硅谷拜访了苹果前CEO斯卡利.老人如今已经75岁高龄,但看起来仍充满活力.他花了一上午的时间跟我们沟通,非常谦和.平等.坦诚,给我留下了很深的印象.末了,给我们介 ...
- SCP 上传
https://www.runoob.com/linux/linux-comm-scp.html scp 当前路径(绝对路径) root@xx.xx.xx :/xx/xx/xx/
- 提高 Java 代码性能的各种技巧
Java 6,7,8 中的 String.intern – 字符串池 这篇文章将要讨论 Java 6 中是如何实现 String.intern 方法的,以及这个方法在 Java 7 以及 Java 8 ...
- mysql数据库的索引类型
MySQL索引类型: 1.普通索引 最基本的索引,它没有任何限制,用于加速查询. 创建方法: a. 建表的时候一起创建 CREATE TABLE mytable ( name VARCHAR(32 ...
- [Tommas] ERP系统测试用例设计1(转)
问题: 1.如何进行ERP系统测试用例设计? 2.ERP系统测试用例设计过程? 3.ERP系统测试用例设计的方法? ERP系统本身是一种业务流程很复杂,单据报表众多,逻辑性很强的系统,质量保证方面很难 ...
- tomcat安装apr报错解决
参考http://www.cnblogs.com/nuccch/p/7598361.html 1.no c complie 安装gcc解决 2.rm: cannot remove `libtoolT' ...
- 引用类型--Date类型
要创建一个日期对象,使用new操作符和Date构造函数即可. var now = new Date() 在调用Date构造函数而不传递参数的情况下,新创建的对象自动获得当前日期和时间.如果想根据特定的 ...
- 腾讯云直播生成推流链接node.js版
/** * 获取推流地址 * 如果不传key和过期时间,将返回不含防盗链的url * @param domain 您用来推流的域名 * streamName 您用来区别不同推流地址的唯一流名称 * k ...
- Verilog的非阻塞语句放到顺序块中,综合出来怎样的逻辑电路?
情境: FPGA里面计数器需要复位(计数值置零),与计数器状态有关的行为是状态机控制的,即状态机为CLEAR_TIMER状态时,计数器才完成清零动作. 清零有两个条件:(1)计数器值溢出(达到OVF门 ...
- Wincc V7.3SE安装截图
打开某个工程出错,能力所限,找不到问题,没能解决