SAK 図書館
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 テクニック編資料