thinkphp が sqlserver ストアド プロシージャを呼び出して複数の結果セットを返す方法

藏色散人
リリース: 2020-01-25 12:16:46
転載
1958 人が閲覧しました

thinkphp が sqlserver ストアド プロシージャを呼び出して複数の結果セットを返す方法

#まず拡張機能をインストールします

windows

2 つに分割します手順

1. PHP バージョンに対応する pdo 拡張機能を見つけて、ダウンロードして解凍し、php.ini で拡張機能を有効にします。注意する必要がある問題は、PHP バージョンと、それが PHP バージョンであるかどうかです。安全なバージョン

2 .ODBCドライバーのダウンロード 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 で、複数のデータベースを操作しています。お役に立てれば幸いです

構成設定ファイル

 // 账号数据库
    '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を変更します

Append

 /**
     * @param $DbconnName
     */
    protected function Dbconn($DbconnName){
        try{
            $conn = Db::connect($DbconnName);
        }catch (\InvalidArgumentException $e){
            echo '连接异常';
            die;
        }
        return $conn;
    }
ログイン後にコピー

model

Agent.php#を追加します## クエリと追加、削除、変更の両方に対してクエリを呼び出すことができますが、取得したい結果セットがない場合は、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 の関連知識の詳細については、

ThinkPHP チュートリアル

を参照してください。

以上がthinkphp が sqlserver ストアド プロシージャを呼び出して複数の結果セットを返す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:cnblogs.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート