Minux2007 发表于 2012-6-19 21:53:29

sqlsrv驱动 取得存储过程返回数据


$connection = array(
            'UID' => 'username',
            'PWD' => 'password',
            'Database' => 'db_name',
            'ConnectionPooling' => 1,
            "CharacterSet" => 'utf-8',
            'ReturnDatesAsStrings' => 1
      );


      $conn = sqlsrv_connect("127.0.0.1", $connection);

      $stmt = sqlsrv_query($conn, "exec 存储过程名称 @canshu=100");
      if ($stmt === false) {
            echo "Error in executing statement 3.\n";
            die(print_r(sqlsrv_errors(), true));
      }


       //存储过程中每一个select都会产生一个结果集,取某个结果集就需要从第一个移动到需要的那个结果集
       //如果结果集为空就移到下一个
      while (sqlsrv_has_rows($stmt) !== TRUE) {
            sqlsrv_next_result($stmt);
      }

      $result_object = array();
      while ($row = sqlsrv_fetch_object($stmt)) {
            $result_object[] = $row;
      }


      sqlsrv_free_stmt($stmt);
      sqlsrv_close($conn);
      return $result_object;
使用CI的sqlsrv是无法运行有使用了游标的存储过程的,在sqlsrv的驱动中参数已经默认


return sqlsrv_query($this->conn_id, $sql, null, array(
                        'Scrollable'                                => SQLSRV_CURSOR_STATIC,//这个参数已经被写死了,具体含义可以参考sqlsrv的手册
                        'SendStreamParamsAtExec'        => true
                ));

小Q 发表于 2013-10-24 12:10:57


        while (sqlsrv_has_rows($stmt) !== TRUE) {
            sqlsrv_next_result($stmt);
            if (!is_integer(sqlsrv_rows_affected($stmt))) {
                    break;
            }
      }


在调用的存储过程返回数据为空时,会造成while无限循环,经调试发现,sqlsrv_rows_affected显示的应该是存储过程中的多次sql语句影响的行数(出现有0行)。所以我判断当行数不再有时,停止循环。

请各位大大指出错误之处。。。
页: [1]
查看完整版本: sqlsrv驱动 取得存储过程返回数据