0

perl cgi を呼び出してグリッドを設定する jqgrid があります。cgi は DBD::Oracle を使用してデータを取得します。グリッドにデータが表示されていません。

スクリプトをデバッグすると、ステートメントの準備時に競合が発生することがわかりました。準備をスキップしてデータを送信するだけで問題なく動作します。Oracle から PostgreSQL に変更すると、問題なく動作します。

誰もこれを経験したことがありますか?CGI を対話的に実行すると実行され、画面に出力されるため、CGI が Oracle 接続で動作していることはわかっています。CGI がグリッドから呼び出された場合、そうではありません。Pg接続と準備でCGIが呼び出されると、データがグリッドにロードされます-完璧です

CG:

 #!/usr/bin/perl
    use CGI;
    use DBI;
    use Connect::Oracle;
    use Connect::PG;

    $stat = new CGI("");
    print $stat->header;
    $count = $stat->url_param('count');

    #connecting to either db works fine
    my $ORdbh = DBI->connect(Oracle->User, {PrintError=>1,RaiseError=>1}); 
    # my $ORdbh = DBI->connect(PG->User, {PrintError=>1,RaiseError=>0});

    $select = qq/select * from db.table/;  

    # preparing with Oracle connection works fine, but nothing returned to grid. 
    # Not even the hardcoded $rows below! 
    # Preparing with PG connection works also but $rows returns to grid

    my $select_batch_status = $ORdbh->prepare($select);
    #$select_batch_status->execute();
    #$select_batch_status->bind_columns(\$COLLECTID, \$SYSTEM);

    ....removed fetch()....irrelevant

    #The JSON is fine

    $rows = qq/["COLLECTID","SYSTEM"]/;

    $data = qq/{"page":"1","total": 1, "records": "$row_count", "rows": [/;
    $data .= $rows;
    $data .= qq/]}/;

    print "$data";
    exit;

jqgrid と DBD::Oracle の間に競合があると結論付けていますが、それ以下をデバッグする方法はありません。グリッドは Pg でうまく機能しますが、私は Oracle を使用したいと考えています。Chrome 開発者ツールでは、警告やエラーは表示されず、cgi はデータを送信していません

グリッド:

<script type="text/javascript">
    var counter=0;
    jQuery(function () {
        jQuery("#list3").jqGrid({
            url:'./collect.cgi?count=' + counter,
            datatype: "json",
            ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
            colNames: ['COLLECT ID', 'SYSTEM'],
            colModel: [
                {name: 'collectid', index: 'collectid', width: 100},
                {name: 'system', index: 'system', width: 50},
            ],
            rowNum: 20,
            rowList: [15, 30, 45],
            pager: '#pager3',
            sortname: 'system',
            sortable: true,
            loadonce: true,
            viewrecords: true,
            sortorder: "asc",
            rowTotal: 500,
            jsonReader: {
                cell: "",
                id: "0"
            },
            gridview: true,
            loadComplete: function() {
            $(document).ready(function() {
                    setTimeout (function() {
                            counter++;
                            $("#list3").jqGrid().setGridParam({
                                    url: './collect.cgi?count=' + counter,
                                    datatype: 'json',
                                    loadonce: true
                            }).trigger("reloadGrid",[{current:true}]);
                    }, 10000);
            });
            },
            loadError: function(xhr,st,err) {
                    $("#jsonmapMessage").html("Type: " + st + "; Response: " + xhr.status + " " + xhr.statusText);
            },
            loadtext: "updating...",
            caption: "COLLECTION MONITOR CONTROL",
            width: 'auto',
            height: '500'
        });

    $("#list3").jqGrid('navGrid','#pager3',{edit:true,add:true,del:true,refresh:true});

    });

</script>
4

1 に答える 1

0

私は最近これを再訪することができました.いくつかの掘り下げとウェブログのレビューの後、cgiプログラムはDBD::Oracleに必要なすべてのライブラリをロードできなかったことがわかりました. これらのライブラリを利用できるようにするには、適切なライブラリを指すように LD_LIBRARY_PATH 環境変数を更新する必要がありました。この変更は、cgi プログラムが環境を取得する Web サーバー レベルで必要です。スクリプトに LD_LIBRARY_PATH を追加しても影響はありませんでした。私の Web サーバー: Oracle iPlanet では、server.xml 構成ファイルの cgi セクションを更新し、Web サーバーを再起動する必要がありました (管理コンソールからの変更は反映されませんでした)。

于 2013-07-01T15:22:15.410 に答える