当前位置:首页 > CMS教程 > Thinkphp > 列表

thinkphp调用sqlserver储存过程返回多个结果集

发布:smiling 来源: PHP粉丝网  添加日期:2022-02-04 13:56:21 浏览: 评论:0 

这篇文章主要介绍了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文件

  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.  
  6.    try{ 
  7.      $conn = Db::connect($DbconnName); 
  8.    }catch (\InvalidArgumentException $e){ 
  9.      echo '连接异常'
  10.      die
  11.    } 
  12.    return $conn
  13.  } 

添加模型

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.   public $Dbname = 'UserDBConn'
  3.   public function GetIndirectAgentList($agentId,$strAccount,$strSuperior,$iPageIndex,$pagesize
  4.   { 
  5.     $conn = $this->Dbconn($this->Dbname); 
  6.     try{ 
  7.       $TotalCount = 0; 
  8.       $res = $conn::query('exec [dbo].[Agent_GetAgentList] :agentId,:strAccount,:strSuperior,:iPageIndex,:pagesize,:TotalCount', [ 
  9.         'agentId' => $agentId
  10.         'strAccount' => [$strAccount, PDO::PARAM_STR], 
  11.         'strSuperior' => [$strSuperior, PDO::PARAM_STR], 
  12.         'iPageIndex' => [$iPageIndex, PDO::PARAM_INT], 
  13.         'pagesize' => [$pagesize, PDO::PARAM_INT], 
  14.         'TotalCount' => [$TotalCount, PDO::PARAM_INPUT_OUTPUT], 
  15.       ]); 
  16.     }catch (PDOException $e
  17.     { 
  18.       return false; 
  19.     } 
  20.     return $res
  21.   } 

最初的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.  
  6.       $res = $conn->query(' 
  7.         SET NOCOUNT ON; 
  8.         declare @AgentID int; 
  9.         declare @TotalCount int; 
  10.         exec [dbo].[Agent_GetAgentList] '.$agentId.',\''.$strAccount.'\',\''.$strSuperior.'\','.$iPageIndex.','.$pagesize.',@TotalCount output; 
  11.         select @AgentID as AgentID,@TotalCount as TotalCount 
  12.         '); 
  13.     }catch (PDOException $e
  14.     { 
  15.       return false; 
  16.     } 
  17.     return $res
  18. }

Tags: thinkphp储存过程 sqlserver

分享到: