SAK 図書館

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

VB oo4o + SQL 応用編7 oo4o レコード参照 - CreateDynaset

oo4o は、Oracle RDBMS でみ使用可能です。

■リクエリ概念

  リクエリと言うのは、キーを変更してのレコードセット参照など、オープンし
  たままのレコードセットのクエリ再実行のことです。
  oo4o の場合は、RDO や ADO の「?」の代わりにバインド変数で処理します。

■CreateDynaset 定数 (カーソル指定含む) OraDynaset

  Public Const ORADYN_DEFAULT       = &H0
  Public Const ORADYN_NO_AUTOBIND   = &H1
  Public Const ORADYN_NO_BLANKSTRIP = &H2
  Public Const ORADYN_READONLY      = &H4
  Public Const ORADYN_NOCACHE       = &H8
  Public Const ORADYN_ORAMODE       = &H10
  Public Const ORADYN_DBDEFAULT     = &H20
  Public Const ORADYN_NO_MOVEFIRST  = &H40
  Public Const ORADYN_DIRTY_WRITE   = &H80

■単純オープン

'** レコードセット変数宣言
  Dim rs

'** レコードセットオープン
  set rs = OraDatabase.CreateDynaset("select * from sak.テストm " _
    & " where 抽出条件 order by ソート順", ORADYN_DEFAULT)

'** レコード処理
  'ここに操作コードが入る

'** レコードセットクローズ
  set rs = Nothing

■クエリオープン

'** クエリ、レコードセット変数宣言
  Dim rs

'** パラメタ追加
  OraDatabase.Parameters.Add "キー", 0, ORAPARM_INPUT
  OraDatabase.Parameters("キー").ServerType = ORATYPE_CHAR

'** レコードセットオープン
  set rs = OraDatabase.CreateDynaset("select * from sak.テストm " _
    & " where キー = :キー", ORADYN_DEFAULT)

'** リクエリ
  OraDatabase.Parameters("キー").value = "a001"
  rs.Refresh

'** レコード処理
  'ここに操作コードが入る

'** レコードセットクローズ
  set rs = Nothing

'** パラメタ解消
  OraDatabase.Parameters.Remove "キー"

クエリオープンでは、rs.Refresh で、レコードセットの内容が最新になる。
また、バインド変数『:バインド変数名』による文字埋め込みも可能である。
(パラメタには『'』を指定する必要なし。)
パラメタクエリをリクエリする場合は、
  OraDatabase.Parameters("キー").value = 'a001'
  rs.Refresh
の様にパラメタをセット後にリクエリをかける。

■補足

  ・リクエリを使用するレコードセットオープンは、VB のフォームロードなど
    起動時に一度実行される場所で行わないとレスポンスがガタガタになる。
    同様にレコードセットクローズはフォームアンロードで行う。
    リクエリを行わない単純オープンなら、適当でもかまわない。

  ・現実的なコードでは、必ずエラートラップ処理を行うこと!!

■レコード操作命令(レコード移動、カーソル移動)

  rs.MoveFirst        (先頭レコード)
  rs.MovePrevious     (前のレコード)
  rs.MoveNext         (次のレコード)
  rs.MoveLast         (最終レコード)

  rs.Refresh          (リクエリ)
  set rs = Nothing    (レコードセットクローズ)

  rs.CopyToClipboard  (クリップボードコピー)

■レコードチェック

  rs.EOF  (TRUE のとき、前方レコードなし。)
  rs.BOF  (TRUE のとき、後方レコードなし。)

■レコード数(照会件数、問い合わせ件数、検索件数、抽出件数、データ件数)

  rs.RecordCount

■ブックマーク

  rs.Bookmark      (現在行)
  rs.LastModified  (edit、addnew にり最後に変更された行)

■レコード項目参照

  rs("項目名")  ← rs!項目名は ASP では使用できない。

■レコード全件処理

  do until rs.EOF
    '1 レコード毎の処理
    rs.MoveNext
  loop

■フィールドプロパティ (フィールド関連情報取得) OraFields

  rs.Fields.Count         (フィールド数)

  rs(field).OralDataType  (Oracle データ型)
  rs(field).OraMaxDSize   (文字最大サイズ)
  rs(field).OraMaxSize    (最大サイズ)
  rs(field).OraNullOK     (NULL OK か)
  rs(field).OraPrecision  (数値精度)
  rs(field).OraScale      (数値位取り)
  rs(field).Name          (フィールド名)
  rs(field).Size          (サイズ)
  rs(field).Type          (VB データ型)
  rs(field).Value         (値) デフォルトプロパティ rs(field)

  ** rs("キー").Name、または、rs(0).Name のようにする。

■使いたくないメソッド

  rs.AddNew           (レコード追加開始)
  rs.Edit             (レコード編集開始)
  rs.Delete           (レコード削除)
  rs.Update           (レコード更新)
  rs.Clone            (レコード複製)
  rs.FindFirst        (先頭検索)
  rs.FindLast         (最終検索)
  rs.FindNext         (次検索)
  rs.FindPrevious     (前検索)
  rs.MoveNextn        (n 行次へ)
  rs.MovePrevionsn    (n 行前へ)
  rs.MoveRel          (n 行移動)
  rs.MoveTo           (n 行へ移動)

  ** レコードセット編集(rs.edit、rs.addnew) は、リモート RDB の場合、
     Execute の方が高速です。(レコード変更、レコード修正)

■使いたくないプロパティ

  rs.EditMode         (編集状態)
  rs.Updatable        (編集可能)
  rs.NoMatch          (find でノーマッチのとき TRUE)
  rs.Options          (オブションフラグ値)

■varray、object フィールドアクセス

  ・詳しくは、次の資料を参照して下さい。
    Oracle PL/SQL 編3 - コレクション、table、varray、宣言、コレクションメソッド

'** varray 型
  Dim item As OraCollection

  Do Until rs.EOF
    Print rs(0)
    Print rs(1)
    Set item = rs.Fields("adre").Value
    For i = 1 To item.Size
      Print i & " - " & item(i)
    Next
    rs.MoveNext
  Loop

'** object 型
  Dim item As OraObject

  Do Until rs.EOF
    Print rs(0)
    Print rs(1)
    Set item = rs.Fields("adre").Value
    For i = 1 To item.Count
    Print i & " - " & item(i)
    Next
    rs.MoveNext
  Loop

■現実的なコード例

Option Explicit

'** oo4o 変数宣言
  dim OraSession
  dim OraDatabase
  dim qurs

'=======================================================================
'  準備
'=======================================================================
Private Sub Form_Load()

  dim dbname as string
  dim cnuser as string

'** エラートラップ開始
  on local error resume next

'** アイキャッチ表示
  'Load FormLogo
  'FormLogo.Show
  'DoEvents
  '// 接続に 10 秒ほどかかるので、「データベース接続中...」などの
  '// モードレスダイアログを表示すると良い。

'** サービス、ユーザ設定
  dbname = ""
  cnuser = "SAK/SAK"
  '// Oracle サービス名(別名)、ユーザ・パスワード指定

'** oo4o 接続
  Set OraSession = CreateObject("OracleInProcServer.XOraSession")
  if err <> 0 then
    MsgBox "データベースに接続出来ません。" & chr(10) _
      & "CreateObject - Oracle oo4o エラー"
    end
  end if
  Set OraDatabase = OraSession.OpenDatabase(dbname, cnuser, ORADB_DEFAULT)
  if err <> 0 then
    MsgBox "データベースに接続出来ません。" & chr(10) _
      & err & ": " & error
    end
  end if

'** パラメタ追加
  OraDatabase.Parameters.Add "キー", 0, ORAPARM_INPUT
  OraDatabase.Parameters("キー").ServerType = ORATYPE_CHAR
  if err <> 0 or OraDatabase.LastServerErr <> 0 then
    MsgBox "パラメタ追加に失敗しました。" & chr(10) _
      & err & ": " & error & chr(10) _
      & "oo4o: " & OraDatabase.LastServerErrText
    end
  end if

'** リクエリレコードセットオープン
  set qurs = OraDatabase.CreateDynaset("select * from sak.テストm " _
    & " where キー = :キー", ORADYN_DEFAULT)
  if err <> 0 or OraDatabase.LastServerErr <> 0 then
    MsgBox "リクエリレコードセットオープンに失敗しました。" & chr(10) _
      & err & ": " & error & chr(10) _
      & "oo4o: " & OraDatabase.LastServerErrText
    end
  end if

'** アイキャッチ終了
  'Unload FormLogo
  '// 接続が完了すれば、「データベース接続中...」をクローズする。

'** エラートラップ終了
  on local error goto 0

End Sub

'=======================================================================
'  後始末
'=======================================================================
Private Sub Form_Unload(Cancel As Integer)

'** リクエリレコードセットクローズ
  Set qurs = Nothing

'** パラメタ解消
  OraDatabase.Parameters.Remove "キー"

'** oo4o 接続解除
  Set OraDatabase = Nothing
  Set OraSession = Nothing

End Sub

'=======================================================================
'  メイン
'=======================================================================
Private Sub Command1_Click()

'---- 単純オープンテスト ----
  print "-- 単純オープンテスト --"

'** レコードセット変数宣言
  Dim rs

'** レコードセットオープン
  set rs = OraDatabase.CreateDynaset("select * from sak.テストm " _
    & " where キー like 'a%' order by キー", ORADYN_DEFAULT)

'** レコード処理
  do until rs.EOF
    print rs("キー")
    rs.MoveNext
  loop

'** レコードセットクローズ
  set rs = Nothing

'---- クエリオープンテスト ----
  print "-- クエリオープンテスト --"

'** リクエリ
  OraDatabase.Parameters("キー").value = "a001"
  qurs.Refresh
  if qurs.EOF then
    print "a001 not found"
  else
    print qurs("キー")
  end if

'** リクエリ
  OraDatabase.Parameters("キー").value = "b002"
  qurs.Refresh
  if qurs.EOF then
    print "b002 not found"
  else
    print qurs("キー")
  end if

  print "-- 終了 --"

End Sub

■説明

  ・リクエリ用のレコードセット qurs のオープンは、Form_Load で、
    クローズは、Form_Unload で行っている。
  ・qurs を作る CreateDynaset は、パラメタを先に追加してから実行しないと、
    バインドエラーで qurs が作成できない。

■like でのバインド変数使用注意点

  ・like でバインド変数を使用する場合、「%」が構文エラーになる。
    「%」を含めたい場合は、次のように「|| '%'」と指定する。

  Set qurs = OraDatabase.CreateDynaset("select * from sak.テストm " _
    & " where キー like :キー || '%'", ORADYN_DEFAULT)

  ・この場合は、バインド変数へのデータセットでは「%」を既に指定している
    ので、次のように省く。

  OraDatabase.Parameters("キー").Value = "a"

  ・like でバインド変数を使用する場合、「%」を後で指定するなら、単純に
    次のようにする。

  Set qurs = OraDatabase.CreateDynaset("select * from sak.テストm " _
    & " where キー like :キー", ORADYN_DEFAULT)

  ・この場合は、バインド変数へのデータセット時に「%」も含めて、次のよう
    に指定する。

  OraDatabase.Parameters("キー").Value = "a%"

■VB oo4o + SQL 応用編資料
■VB ADO + SQL 応用編資料
■VB RDO + SQL 応用編資料
■SQL 基礎編資料
■SQL 基礎実地編資料
■SQL チューニング編資料
■Oracle PL/SQL 編資料
■PostgreSQL 編、JAVA Servlet、JSP 編資料
■MySQL 編資料
■VB 入門編資料
■VB 基礎編資料
■VB ビジュアル編資料
■VB テクニック編資料
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索



Copyright (C) 1999-2017 Y.SAK