首先安装扩展

windows

分为两个步骤

  1. 找到对应自己PHP版本的pdo扩展,下载解压出来,并且在php.ini里面启用扩展,需要注意的问题是php版本以及是否为安全版本
  2. 下载 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文件

  1. // 账号数据库
  2. 'UserDBConn' => [
  3. 'type' => 'sqlsrv',
  4. // 服务器地址
  5. 'hostname' => '139.129.1.1',
  6. // 数据库名
  7. 'database' => 'DB3',
  8. // 用户名
  9. 'username' => 'xxxx',
  10. // 密码
  11. 'password' => 'tt123!@#',
  12. // 端口
  13. 'hostport' => '5188'
  14. ],
  15. // 金币数据库
  16. 'ScoreDBConn' => [
  17. 'type' => 'sqlsrv',
  18. // 服务器地址
  19. 'hostname' => '139.129.1.1',
  20. // 数据库名
  21. 'database' => 'DB2',
  22. // 用户名
  23. 'username' => 'xxxx',
  24. // 密码
  25. 'password' => 'tt123!@#',
  26. // 端口
  27. 'hostport' => '5188'
  28. ],
  29. // 记录数据库
  30. 'RecordDBConn' => [
  31. 'type' => 'sqlsrv',
  32. // 服务器地址
  33. 'hostname' => '139.129.1.1',
  34. // 数据库名
  35. 'database' => 'DB1',
  36. // 用户名
  37. 'username' => 'xxxx',
  38. // 密码
  39. 'password' => 'tt123!@#',
  40. // 端口
  41. 'hostport' => '5188'
  42. ],

修改thinkphp/library/think/Model.php

在末尾追加

  1. /**
  2. * @param $DbconnName
  3. */
  4. protected function Dbconn($DbconnName){
  5. try{
  6. $conn = Db::connect($DbconnName);
  7. }catch (\InvalidArgumentException $e){
  8. echo '连接异常';
  9. die;
  10. }
  11. return $conn;
  12. }

添加模型

Agent.php

查询和增删改都可以调用query,如果你没有想要获取的结果集的话可以调用execute()

query()有一个弊端,如果你的绑定参数的形式(非参数绑定)是直接写进sql的话,他有可能会判断你这个不是一个储存过程;

具体实现请查看thinkphp/library/think/db/Connection.php:368行,当然也不会有结果集返回。

你也可以用调用procedure(),这个方法调用的话就一定会返回结果集。

起初我就是这个问题,并没有采用绑定参数的形式提交,直接写sql,就获取不到结果集,后来我在我的sql提行里面加入了SET NOCOUNT ON;,才能勉强拿到返回,在文章最后我给出了我最开始获取的结果集的方案例子,但是真的拉稀,你们可以看看,不要吐槽。

  1. class Agent extends Model
  2. {
  3. public $Dbname = 'UserDBConn';
  4. public function GetIndirectAgentList($agentId,$strAccount,$strSuperior,$iPageIndex,$pagesize)
  5. {
  6. $conn = $this->Dbconn($this->Dbname);
  7. try{
  8. $TotalCount = 0;
  9. $res = $conn::query('exec [dbo].[Agent_GetAgentList] :agentId,:strAccount,:strSuperior,:iPageIndex,:pagesize,:TotalCount', [
  10. 'agentId' => $agentId,
  11. 'strAccount' => [$strAccount, PDO::PARAM_STR],
  12. 'strSuperior' => [$strSuperior, PDO::PARAM_STR],
  13. 'iPageIndex' => [$iPageIndex, PDO::PARAM_INT],
  14. 'pagesize' => [$pagesize, PDO::PARAM_INT],
  15. 'TotalCount' => [$TotalCount, PDO::PARAM_INPUT_OUTPUT],
  16. ]);
  17. }catch (PDOException $e)
  18. {
  19. return false;
  20. }
  21. return $res;
  22. }
  23. }
最初的Agent.php

很显然 这里并不会获取到@AgentID 以及 @TotalCount;他只会返回Agent_GetAgentList的结果集

  1. public function GetIndirectAgentList($agentId,$strAccount,$strSuperior,$iPageIndex,$pagesize)
  2. {
  3. $conn = $this->Dbconn($this->Dbname);
  4. try{
  5. $res = $conn->query('
  6. SET NOCOUNT ON;
  7. declare @AgentID int;
  8. declare @TotalCount int;
  9. exec [dbo].[Agent_GetAgentList] '.$agentId.',\''.$strAccount.'\',\''.$strSuperior.'\','.$iPageIndex.','.$pagesize.',@TotalCount output;
  10. select @AgentID as AgentID,@TotalCount as TotalCount
  11. ');
  12. }catch (PDOException $e)
  13. {
  14. return false;
  15. }
  16. return $res;
  17. }

thinkphp调用sqlserver储存过程返回多个结果集的更多相关文章

  1. Mybatis下配置调用Oracle自定义函数返回的游标结果集

    在ibatis和Mybatis对存储过程和函数函数的调用的配置Xml是不一样的,以下是针对Mybatis 3.2的环境进行操作的. 第一步配置Mapper的xml内容 <mapper names ...

  2. ibatis.net调用oracle存储过返回游标SYS_REFCURSOR结果集

    最近在用ibatis.net框架和oracle 11g开发一套程序.其中有一个需求就是通过存储过程,查询指定条件的数据集. 但是在开发的过程中遇到了问题,问题如下: 1.如何通过ibatis.net执 ...

  3. 简简单单储存过程——循环一个select结果集

    原文地址:https://shitou521.iteye.com/blog/1069027 摘要:本文主要讲解了存储过程的创建.调用.以及游标的使用 ,相信掌握了游标      会对你有不错的帮助,有 ...

  4. Mysql 储存过程以及 python callproc调用

    一.存储过程(stored procedure) 存储过程将存入的一系列SQL语句进行预编译,执行并存放在数据库中,之后如果需要使用sql语句对这一组sql进行访问时可以直接提取(很好理解 存储过程就 ...

  5. Java储存过程

    存储过程:是指保存在数据库并在数据库端执行的程序. CallableStatement 对象为所有的 DBMS 提供了一种以标准形式调用已储存过程的方法.已储存过程储存在数据库中. 对已储存过程的调用 ...

  6. MySql 在cmd下的学习笔记 —— 有关储存过程的操作(procedure)

    我们把若干条sql封装取来,起个名字------把此过程存储在数据库中叫存储过程 调用procedure 储存过程是可以变成的,意味着可以使用变量,表达式,控制结构 来完成复杂的功能 声明变量 pro ...

  7. Atitit  jdbc 处理返回多个结果集

    Atitit  jdbc 处理返回多个结果集 Statement接口提供了三种执行SQL语句的方法: executeQuery.executeUpdate和execute.使用哪一个方法由SQL语句所 ...

  8. JDBC和JPA调用储存过程 接收存储过程有返回值

    ============jdbc==========================================--java代码:一个输出参数--String connURL = null;Con ...

  9. Sqlserver中的储存过程

    一.什么是存储过程(Stored Procedure) 存储过程是一段存储在数据库的“子程序”,本质是一个可重复使用的SQL代码块,可以理解为数据库端的“方法”. 存储过程的好处: ①提高性能:由于数 ...

随机推荐

  1. SpringMVC:自定义视图及其执行过程

    一:自定义视图 1.自定义一个实现View接口的类,添加@Component注解,将其放入SpringIOC容器 package com.zzj.view; import java.io.PrintW ...

  2. linux之我的互联网面试经验

    互联网面试想必是每个学计算机的学生必不可少的环节,无论你的项目经验再多,你不准备基础知识,也还是无济于事.首先来说说关于工作的事情. 三年前,那时候我还是刚刚快要大四毕业的小鲜肉,那时候有个超大的招聘 ...

  3. CXL联盟正式成立:成员均是行业巨头

    导读 今天,阿里巴巴.思科.戴尔EMC.Facebook.Google.HPE.华为.Intel.微软(按英文首字母排序)联合宣布,CXL联盟(Compute Express Link Consort ...

  4. 第3节 storm高级应用:2、storm与hdfs的整合工程环境准备;3、整合代码开发

    ======================================== 3.  storm与hdfs的整合使用 3.1.功能需求: 实现随机发送订单数据,从计算订单的总金额,然后将订单中的数 ...

  5. 第1节 kafka消息队列:7、kafka的消费模型

  6. Linux文件系统层次结构标准FHS

    文件系统层次结构标准(英语:Filesystem Hierarchy Standard,FHS)定义了Linux操作系统中的主要目录及目录内容.FHS由Linux基金会维护. 当前版本为3.0版,于2 ...

  7. English_Rhymes_Phonics_resource

    English_Rhymes_Phonics_resource 1. 英语启蒙早有用吗?_英语启蒙 2. 26个英文字母背后的故事_英语启蒙 3. Phonics Song 4. 学Phonics前先 ...

  8. android数据的四种存储方式之一——SharedPreference

    除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...

  9. Android反编译与防止反编译

    1.Android反编译      1)下载两个工具  dex2jar,jar2java,相关阅读下载见:http://www.linuxidc.com/Linux/2011-02/32775.htm ...

  10. Ajax--XMLHttpRequest的使用

    1.创建XMLHttpRequest对象(实现方法不统一): --IE把XMLHttpRequest实现为一个ActiveX对象: --其他浏览器(Firefox.Chrome等)把它实现为一个本地的 ...