| ホーム | 掲示板 | 特集 | サンプル | Tips | リンク | その他 | blog 

Tips
[VS2003]
 日付時刻の演算
 ListBoxにファイル一覧
 ファンクションF10
 WMIでサービス一覧
 YAHOO検索エンジン
[VS2005]
 Administrator権限チェック
 非同期ExecuteReader
 非同期ExecuteReader(CallBack)
 パスの結合
 ファイルを圧縮して保存
 コントロール配列の実装
 DataGridViewのCellイベント
 CSVファイルをDataGridViewに表示
 DataGridViewのリンクセルを見やすく
 DataGridViewマウス右ボタンで選択
 DataGridViewスクロール制御
 DataGridViewのCell移動をEnterで
 DataRepeaterコントロール
 GZ圧縮ファイルを解凍
 ファイルの削除
 ディレクトリ有無チェック
 ファイルのダウンロード
 非同期ファイルダウンロード
 ドライブの一覧
 ファイルのコピー
 ファイル有無チェック
 テキストファイルを読み込む
 特定の文字列を含むファイル検索
 フォームを表示(Show)する
 フォルダ一覧取得
 ドライブ詳細情報取得
 ファイル一覧取得
 テンポラリファイルパス取得
 継承コントロールの作り方
 フォルダの移動
 ファイルの移動
 My.Settingの利用
 MySQLCommandで抽出
 MySQLDeleteCommandで削除
 MySQLInsertCommandで挿入
 MySQLSelectCommandで抽出
 MySQLUpdateCommandで更新
 ネットワークに繋がってる?
 ネットワーク接続イベント取得
 固定長テキストファイルを読む
 Oracleストアドファンクション呼出1
 Oracleストアドファンクション呼出2
 OracleのLong Row型の画像を表示
 OracleのLong Row型をファイル保存
 Oracleパラメータクエリ実行
 ORACLE接続文字列生成
 VS2005でPing
 非同期でPing
 VB6のPrinterオブジェクトを.NETで
 Reportでテーブル形式表示
 ReportViewerでパラメータ設定
 メール送信
 非同期でメール送信
 メール送信(MailMessage利用)
 シリアル通信プログラム
 シリアル通信(文字列送信)
 二重起動の禁止
 特殊フォルダ取得
 スプラッシュウインドウ表示
 テーブルへ複数行の挿入
 CSVファイルをテーブルへ挿入
 テーブルへ複数行の挿入(マッピング)
 SqlBulkCopyで郵便番号データ処理
 SQL Server接続文字列生成
 Stopwatchで時間の計測
 システムサウンド再生
 CSVファイル読み込み
 固定長テキストファイルを読む2
 TableAdapterでTransaction
[VS2005] Oracleストアドファンクション呼出2 2006/10/02
Oracleのストアドファンクションを呼び出す方法です。
System.Data.OracleClientを利用するので、参照設定を行ってください。
Oracleストアドファンクション呼出1と違うところは、引数にカーソルを返すところです。
説明に利用するストアドファンクションは、あるテーブルのデータをページング処理して、指定されたページのデータを引数に返すものです。
CREATE OR REPLACE FUNCTION TEST_PAGING(
  in_PAGE        IN  NUMBER,
  in_SQL         IN  VARCHAR2,
  in_PAGE_SIZE   IN  NUMBER, 
  out_CURSOR     OUT SYS_REFCURSOR
) RETURN NUMBER AS

/*
||////////////////////////////////////////////////////////////
||//
||// ファンクション名 :TEST_PAGING
||// ファンクション説明:指定ページのデータのみ取得する
||//
||////////////////////////////////////////////////////////////
||  in_PAGE      :表示するページ
||  in_SQL       :実行するSQL文
||  in_PAGE_SIZE :1ページのレコード件数
||  out_CURSOR   :取得したカーソル
||  戻り値       :-1以外=総ページ数、-1=異常
*/

--==================================================
--変数宣言
--==================================================
  varSQL        VARCHAR2(2000);
  numCOUNT      NUMBER;
  numPAGE_COUNT NUMBER;
  numSTR_ROW    NUMBER;
  numEND_ROW    NUMBER;

--==================================================
--メイン処理開始
--==================================================
BEGIN

  -- 総件数・総ページ数を取得する
  varSQL := 'SELECT COUNT(*) FROM ('||in_SQL||')';
  EXECUTE IMMEDIATE varSQL INTO numCOUNT;
  numPAGE_COUNT := CEIL(numCOUNT / in_PAGE_SIZE);
  
  -- 開始・終了位置を特定
  numEND_ROW := in_PAGE * in_PAGE_SIZE;
  numSTR_ROW := numEND_ROW - in_PAGE_SIZE + 1;

  -- 抽出用SQL生成
  varSQL := 'SELECT * FROM ( SELECT ROWNUM RN, A.* FROM ('
            ||in_SQL||') A ) WHERE RN BETWEEN '||numSTR_ROW||' AND '||numEND_ROW ;

  -- カーソルオープン
  OPEN out_CURSOR FOR varSQL;
  
  RETURN numPAGE_COUNT;
  
EXCEPTION
  WHEN OTHERS THEN
    RETURN -1;

END TEST_PAGING;
上記のストアドファンクションを呼び出し、指定ページのデータをDataGridViewに表示します。

DataGridView、VScrollBarをフォームに配置します。配置されたスクロールバーがページと連動しています。

Imports System.Data.OracleClient

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgs) _
                                                                        Handles MyBase.Load
        ''DataGridViewの設定
        With Me.DataGridView1
            .AllowUserToAddRows = False
            .AllowUserToDeleteRows = False
            .ReadOnly = True
            .ScrollBars = ScrollBars.Both
        End With

        ''初期処理
        With Me.VScrollBar1
            .Minimum = 1
            .Value = 1
            .Maximum = Me.GetPageData(.Value)
        End With
    End Sub

    Private Sub VScrollBar1_ValueChanged(ByVal sender As ObjectByVal e As System.EventArgs) _
                                                                Handles VScrollBar1.ValueChanged
        Me.VScrollBar1.Maximum = Me.GetPageData(Me.VScrollBar1.Value)
    End Sub

    ''' <summary>
    ''' 指定ページのデータをグリッドビューにセットする
    ''' </summary>
    ''' <param name="page">セットしたいページ番号</param>
    ''' <returns>-1以外:最大ページ番号、-1:エラー</returns>
    ''' <remarks></remarks>
    Private Function GetPageData(ByVal page As IntegerAs Integer
        Dim oraBuilder As New OracleConnectionStringBuilder
        ''ORACLE接続文字列
        With oraBuilder
            .DataSource = "hogehoge"
            .UserID = "user"
            .Password = "password"
        End With
        Try
            Using oraConn As OracleConnection = New OracleConnection(oraBuilder.ConnectionString)
                Using oraCmd As New OracleCommand
                    oraConn.Open()
                    With oraCmd
                        .Connection = oraConn
                        .CommandType = CommandType.StoredProcedure
                        .CommandText = "TEST_PAGING"
                        .Parameters.Add(New OracleParameter("in_PAGE", _
                                        OracleType.Number)).Value = page
                        .Parameters.Add(New OracleParameter("in_SQL", _
                                        OracleType.VarChar)).Value = "SELECT * FROM TEST_DATA"
                        .Parameters.Add(New OracleParameter("in_PAGE_SIZE", _
                                        OracleType.Number)).Value = 10
                        .Parameters.Add(New OracleParameter("out_CURSOR", _
                                        OracleType.Cursor)).Direction = ParameterDirection.Output
                        .Parameters.Add(New OracleParameter("retValue", _
                                        OracleType.Number)).Direction = ParameterDirection.ReturnValue
                    End With
                    Using oraDr As System.Data.OracleClient.OracleDataReader = oraCmd.ExecuteReader
                        Dim oraDt As New System.Data.DataTable
                        oraDt.Load(oraDr, Data.LoadOption.OverwriteChanges)
                        DataGridView1.DataSource = oraDt
                    End Using
                    Return CInt(oraCmd.Parameters("retValue").Value)
                End Using
            End Using
        Catch ex As OracleException
            MessageBox.Show(ex.Message, "ORACLE例外", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Catch ex As Exception
            MessageBox.Show(ex.Message, "一般例外", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
        Return -1
    End Function

End Class

Copyright © 2005 tadahiro higuchi. All Rights Reserved.