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代码块,可以理解为数据库端的“方法”. 存储过程的好处: ①提高性能:由于数 ...
随机推荐
- SpringMVC:自定义视图及其执行过程
一:自定义视图 1.自定义一个实现View接口的类,添加@Component注解,将其放入SpringIOC容器 package com.zzj.view; import java.io.PrintW ...
- linux之我的互联网面试经验
互联网面试想必是每个学计算机的学生必不可少的环节,无论你的项目经验再多,你不准备基础知识,也还是无济于事.首先来说说关于工作的事情. 三年前,那时候我还是刚刚快要大四毕业的小鲜肉,那时候有个超大的招聘 ...
- CXL联盟正式成立:成员均是行业巨头
导读 今天,阿里巴巴.思科.戴尔EMC.Facebook.Google.HPE.华为.Intel.微软(按英文首字母排序)联合宣布,CXL联盟(Compute Express Link Consort ...
- 第3节 storm高级应用:2、storm与hdfs的整合工程环境准备;3、整合代码开发
======================================== 3. storm与hdfs的整合使用 3.1.功能需求: 实现随机发送订单数据,从计算订单的总金额,然后将订单中的数 ...
- 第1节 kafka消息队列:7、kafka的消费模型
- Linux文件系统层次结构标准FHS
文件系统层次结构标准(英语:Filesystem Hierarchy Standard,FHS)定义了Linux操作系统中的主要目录及目录内容.FHS由Linux基金会维护. 当前版本为3.0版,于2 ...
- English_Rhymes_Phonics_resource
English_Rhymes_Phonics_resource 1. 英语启蒙早有用吗?_英语启蒙 2. 26个英文字母背后的故事_英语启蒙 3. Phonics Song 4. 学Phonics前先 ...
- android数据的四种存储方式之一——SharedPreference
除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...
- Android反编译与防止反编译
1.Android反编译 1)下载两个工具 dex2jar,jar2java,相关阅读下载见:http://www.linuxidc.com/Linux/2011-02/32775.htm ...
- Ajax--XMLHttpRequest的使用
1.创建XMLHttpRequest对象(实现方法不统一): --IE把XMLHttpRequest实现为一个ActiveX对象: --其他浏览器(Firefox.Chrome等)把它实现为一个本地的 ...