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 テクニック編資料