|
|
テクニカルノート10: ADOCEJuly 17, 2003© NSB Corporation. All rights reserved. |
マイクロソフト社のドキュメントも参考にして下さい。
|
ADOCEはMicrodoftの"Active Data Object for Windows CE"です。SQLのようなデータベースActiveXオブジェクトであり、デスクトップ上でMicrosoft Accessデータベースとのやりとりを可能にします。 これの使用は比較的単純ですが、ここでは全ての内容をカバーすることは出来ません。ドキュメントはMicrosoft(または他)から入手可能です。 全てのHPC 2000、Pocket PC、Pocket PC 2002デバイスはADOCEが予めインストールされています。他のデバイスには、当社のダウンロードページからインストーラを入手して下さい。HPCデバイスはこれらのファイルをダウンロードする必要がありますが、HPC/Proデバイスは基本的に必要ありません。 MicrosoftからADOCE for Windows CE 2.11 Palm-size PCが現在入手可能です。本ドキュメントの最後に、Greg Kelly による、Palm-size デバイス上でのADOCEの使用に関する記述を追加してあります。 ドキュメント
注記およびプログラムの癖
|
Set RS = CreateObject("adoce.recordset")
Pocket PCおよびPocket PC 2002には、次の使用して下さい。
Set RS = CreateObject("adoce.recordset.3.0")
メソッド
|
|
引数は無。フィールド追加のシークエンスを開始。新しいレコードを開始。 |
|
現在のデータベースを閉じる。 |
|
現レコードを削除。他へと移動することを注意。 |
|
|
|
|
|
最初のレコードへ移動。 |
|
最後のレコードへ移動。 |
|
次のレコードへ移動。 |
|
前のレコードへ移動。 |
|
Source, active connection, cursor type, lock type, options データベースを開くか、SQLコマンドをデータベースへ送る。 Source: 必須、文字列型 オプションのフラグにより、名前またはSQLコマンド。SQLの詳細は以下を参照。 active connection: オプション、常に""、またはデータベースの名前でも可。 cursor type: オプション、整数型
Lock type: オプション、整数型
Options: オプション、整数型
(例)データベースを開き選択をする |
|
引数無し。現レコードを表に書く。 |
プロパティ
|
|
ファイルの始り。 True/False |
|
ファイルの終り。 True/False |
|
現レコード内のフィールドの値を返す。 |
SQLコマンド
SQL (Standard Query Language) コマンドを処理する能力が、ADOをパワフルにしています。SQLに関する本やリソースはたくさん出ています。ADOCEはそれらの全てをサポートしていませんが、以下のアイテムに関しては問題なく動作するはずです。
|
|
|
|
myTableName (FieldList)新しい表を作成。FieldListの名前をどう選ぶかは注意が必要:DESC等はキーワード。FieldListはフィールド名とタイプのリスト。例えば (company int, name varchar(9))。有効なタイプは INT, FLOAT, BIT, VARCHAR, DATETIME, TEXT等。 |
|
|
|
|
|
|
|
|
ADO and Pocket Access
ADOとPocket Accessの使用を試みている人の為に、どのように行うかの簡単な例を示します。 彼等のヘルプに感謝してMicrosoftの Matt Woodward氏、及び John Riekena氏に脱帽。 このサンプルはEmployeesの表から、"My Documents"内にあるNorthwindへ名前を読み込みます。
Private Sub cmbTest_Click()
Dim EmployeeRS
' Setup an error handler.
On Error Then Resume Next
' Retrieve data from the Employee table.
Set EmployeeRS = CreateObject("adoce.recordset")
EmployeeRS.Open "SELECT * FROM Employees", "\My Documents\Northwind.cdb",
adOpenDynamic, adLockOptimistic
' Loop through the recordset loading names into a combo box.
Do While Not EmployeeRS.EOF
cmbEmployees.AddItem EmployeeRS.Fields("LastName") & ", " &
EmployeeRS.Fields("FirstName")
cmbEmployees.MoveNext
Loop
' Select the first employee in the list.
cmbEmployees.ListIndex = 0
End Sub
ADO and External Databases
H/PC ProのADOCEは外部データベースをサポートします。それらを利用する為には、外部データベースのファイル名を文字列として、接続パラメータに入れて渡します。Larry 氏がこれに関する事を掲示してくれましたが、再現では問題はありません。
ADOCEはcreate databaseシンタックス、"create database '\database.cdb'"と"drop database '\database.cdb'"、もサポートサポートしています。以下は、t1の名前の表を持つデータベースを常に再生する、サンプルコードです。
' include constants from Appendix A below as needed
On Error Resume Next
rs.Open "drop database '\ado.cdb'"
On Error GoTo 0
rs.Open "create database '\ado.cdb'"
rs.Open "create table t1 (c1 integer, c2 varchar(200))", "\ado.cdb"
rs.Open "select c1, c2 from t1", "\ado.cdb", adOpenDynamic, adLockOptimistic
rs.AddNew
rs.Fields("c1") = 1
rs.Fields(1) = "t1 -- One"
rs.Update
rs.AddNew
rs.Fields("c1") = 2
rs.Fields(1) = "Xt1 -- Two"
rs.Update
rs.AddNew
rs.Fields("c1") = 3
rs.Fields(1) = "t1 -- Three"
rs.Update
rs.AddNew
rs.Fields("c1") = 4
rs.Fields(1) = "Xt1 -- Four"
rs.Update
rs.AddNew
rs.Fields("c1") = 5
rs.Fields(1) = "t1 -- Five"
rs.Update
rs.AddNew
rs.Fields("c1") = 6
rs.Fields(1) = "t1 -- Six"
rs.Update
rs.Close
サンプルコード
このプログラムはSQLコマンド(Create table、Select等)の入力を許容します。
'In the case of a command that produces a recordset (ie select) then the first three fields
'of the recordset are displayed. The user may Add new records, modify existing data or
'delete existing records.
Option Explicit
'-----------------------------------------------------------
' ADO Cursor Types
'-----------------------------------------------------------
Const adOpenForwardOnly = 0
Const adOpenKeyset = 1
'-----------------------------------------------------------
' ADO Lock Types
'-----------------------------------------------------------
Const adLockReadOnly = 1
Const adLockOptimistic = 3
dim cmdAddNew_enabled, cmdDelete_enabled, sqlCommand, rs_opened, num_fields, RS
rs_opened = 0
sqlCommand=""
form_load
on error resume next
set RS=createObject("adoce.recordset")
if err then
err.clear
set RS=createObject("adoce.recordset.3.0") 'for Pocket PC
end if
if err then
msgBox "Active Data Objects (ADOCE) must be installed for this sample to work. Please check the Tech Notes for more information."
err.clear
bye
end if
on error goto 0
Sub Execute_Click()
On Error Resume Next
Dim fcol
cmdaddnew_Enabled = False
cmdDelete_Enabled = False
If rs_opened = 1 Then ' previous command has used the Recordset object. Close the old one
RS.Close
If Err Then ChkErr
rs_opened = 0
End If
'
'Open the ADOCE Recordset using the SQL statement that the user has typed in.
'Using adOpenKeyset to allow backward scrolling and adLockOptimistic to allow
'entry of data into the database
'
RS.Open txtsql.text, , adOpenKeyset, adLockOptimistic
txtResult.cls
txtResult.drawText Hex(Err) & " -" & Err.Description
if err then exit sub
Set fcol = RS.fields
Num_fields = fcol.Count
If Num_fields Then
'
'If the Recordset returned has fields then assume that the sql statement was a Select
'and has returned a recordset to browse. If Num_fields has no value then the SQL will
'still have been executed eg a create table command.
'Disable / Enable the Addnew button if the Addnew method is supported for this recordset
cmdaddnew_Enabled = RS.supports(adAddNew)
'Disable / Enable the Delete button if the delete method is supported for this recordset
cmdDelete_Enabled = RS.supports(adDelete)
rs_opened = 1
RefreshForm
End If
End Sub
Sub RefreshForm() 'This routine transfers the data to the form
dim s
'On Error Resume Next
Dim NumFieldstoDisplay
Dim fcol ' FIELDS COLLECTION
Dim fld ' FIELD
Dim lp ' Loop value
'Display Status bar information
txtcrecs.cls
txtcrecs.drawtext "Record #" & RS.absoluteposition & " of " & RS.recordcount & " records."
'Create field object for fastest access
Set fcol = RS.fields
'
'loop thru the field collection and display each field
NumFieldstoDisplay = min(12, Num_fields)
s=""
For lp = 1 To NumFieldstoDisplay
'create field object from the fields collection
Set fld = fcol(lp - 1)
If Err Then ChkErr
s=s & fld.name
s=s & ":" & fld.value
s=s & vbCrLf
Next
txtField1.cls
txtField1.fontname="arial"
txtField1.fontsize=8
txtField1.drawtext s
End Sub
Sub addnew_Click()
if cmdAddNew_enabled=false then exit sub
On Error Resume Next
Dim NumFieldstoDisplay, lp, f(3)
NumFieldstoDisplay = min(2, Num_fields)
If NumFieldstoDisplay 0 Then
'swap the data from the form into an Array
f(1) = txtField1
If NumFieldstoDisplay = 1 Then f(2) = txtField2
If NumFieldstoDisplay = 2 Then f(3) = txtField3
'Transfer the data to the field value property prior to the update.
'Remember that the Fields collection is Zero based.
RS.addnew
For lp = 1 To NumFieldstoDisplay
RS.fields(lp - 1).Value = f(lp)
If Err.Number Then ChkErr
Next
RS.Update
If Err.Number Then ChkErr
End If
End Sub
Sub Delete_Click()
if cmdDelete_enabled=false then exit sub
On Error Resume Next
RS.Delete
If Err <> 0 Then ChkErr
cmdDelete_Enabled = False
RefreshForm
End Sub
Sub ChkErr()
On Error Resume Next
If Err.Number <> 0 Then
MsgBox "Error: " & Hex(Err) & " -" & Err.Description
End If
End Sub
Sub cmdMoveFirst_Click()
if rs_opened=0 then exit sub
On Error Resume Next
RS.MoveFirst
If Err <> 0 Then ChkErr
RefreshForm
End Sub
Sub cmdMoveLast_Click()
if rs_opened=0 then exit sub
On Error Resume Next
RS.MoveLast
If Err <> 0 Then ChkErr
RefreshForm
End Sub
Sub cmdMoveNext_Click()
if rs.absolutePosition=rs.recordCount then exit sub
On Error Resume Next
RS.MoveNext
If RS.EOF Then RS.MoveLast
If Err <> 0 Then ChkErr
RefreshForm
End Sub
Sub cmdMovePrev_Click()
if rs.absolutePosition<=1 then exit sub
On Error Resume Next
RS.moveprevious
If RS.BOF Then RS.MoveFirst
If Err <> 0 Then ChkErr
RefreshForm
End Sub
Sub Form_Load() 'set up screen objects
addObject "textbox","txtsql",10,10,300,18
txtsql.text= ""
addObject "picturebox","txtField1",10,30,300,98
txtField1.borderstyle=1
addObject "commandButton","Execute",320,10,60,18
addObject "commandButton","AddNew",320,30,60,18
addObject "commandButton","Delete",320,50,60,18
addObject "picturebox","txtResult",10,132,300,18
txtResult.borderStyle=1
addObject "commandButton","cmdMoveFirst",320,112,30,18
cmdMoveFirst.text= "<<"
addObject "commandButton","cmdMovePrev",350,112,15,18
cmdMovePrev.text="<"
addObject "picturebox","txtcrecs",320,132,120,18
txtcrecs.borderstyle=1
addObject "commandButton","cmdMoveNext",395,112,15,18
cmdMoveNext.text= ""
addObject "commandButton","cmdMoveLast",410,112,30,18
cmdMoveLast.text= ""
End Sub
Function min(a, b)
min = a
If b < a then min=b
End function
これは外部変数にのみ基づいて"browse file"を実行するプロシージャです。これはGilbert Vuilleumier氏, gilbert.vuilleumier© span.chに寄稿して頂きました。
パラメータ:
| Filename | Database File name |
| F_ID | Array that will receive the recordset |
| Filter | Database filter |
| Gridx | Grid object name |
| Lines | Number of apparent lines of the grid |
| Cols | Columns descriptor bi-dimensionnal array, one line for each column of the grid, Each line contains 3 elements: title (not used), width,column number |
| PS | is a 4-element array that contains X-pos, y-pos, width, height of the grid object |
Sub BrowsePanel(FileName, F_Id, R_Set, Filter, Gridx, Lines, Cols, PS )
'**********************************************************************
VBCEutil.WaitCursor True
dim Ix,Jx,SQLC,S,X,Y,L,H '
Create a drop list from a structured data file
Set R_Set = CreateObject("adoce.recordset")
if Filter ="" then
SQLC = "SELECT * from " & FileName
else
SQLC = "SELECT * from " & FileName & " WHERE " & Filter
end if
R_Set.open SQLC ,vbNullString,1, 1
If R_Set.RecordCount>0 Then
R_Set.MoveFirst
F_Id = R_Set.GetRows()
Else
F_Id = array("")
End If
Execute "NewGrid = not IsObject(" & Gridx & ")"
if NewGrid then
AddObject "GridCtrl.GridCtrl.1",Gridx,PS(0),PS(1),PS(2),PS(3)
Else
X = PS(0) * 15
Y = PS(1) * 15
L = PS(2) * 15
H = PS(3) * 15
Execute Gridx & ".Move " & X & "," & Y & "," & L & "," & H
' GR_ID.Move 0,30
Execute Gridx & ".CellBackColor = vbWhite"
end if
Execute Gridx & ".Rows = " & R_Set.RecordCount
Execute Gridx & ".Cols = " & 1+ Ubound(Cols(0))
For Ix=0 to Ubound(Cols)
Jx = Cols(Ix)(1) * 13.5
Execute Gridx & ".ColWidth(" & Ix & ") = " & Jx ' twips->pixels conversion
Next 'Ix
For Jx=0 To R_Set.RecordCount-1
For Ix=0 to Ubound(Cols(0))
S = F_Id(Ix,Jx)
Execute Gridx & ".TextMatrix(" & Jx & "," & Ix & ") = " & chr(34) & S & chr(34)
Next 'Ix
Next 'Jx
R_Set.close
set R_Set = nothing
Dim code
code = "sub " & Gridx & "_EnterCell" & vbCrLf & Gridx & ".CellBackColor =vbRed" &_
vbCrLf & "N_Categ.Text = GR_ID.TextMatrix(GR_ID.RowSel,1)" & vbCrLf & "End Sub" & vbCrLf
' Execute code
code = "sub " & Gridx & "_LeaveCell" & vbCrLf & Gridx & ".CellBackColor = vbWhite" &_
vbCrLf & "End Sub" & vbCrLf
Execute code
VBCEutil.WaitCursor False
End Sub
'----------------------------------------------------------- ' Declarations For VBA Errors '----------------------------------------------------------- Const vbErrInvalidArg = 5 Const vbErrOverflow = 6 Const vbErrOutOfMemory = 7 Const vbErrOutOfRange = 9 Const vbErrTypeMismatch = 13 Const vbErrOutOfStringSpace = 14 Const vbErrObjectNotSet = 91 Const vbErrUnInitForLoop = 92 Const vbErrBadUseOfNull = 94 Const vbErrObjectRequired = 424 Const vbErrCantCreate = 429 Const vbErrNotSupported = 438 Const vbErrInvalidAssignment = 450 Const vbErrNotCollection = 451 '----------------------------------------------------------- ' Declarations For ADO Errors '----------------------------------------------------------- Const adErrInvalidArgument = &HBB9 Const adErrNoCurrentRecord = &HBCD Const adErrIllegalOperation = &HC93 Const adErrFeatureNotAvailable = &HCB3 Const adErrItemNotFound = &HCC1 Const adErrObjectNotSet = &HD5C Const adErrDataConversion = &HD5D Const adErrObjectClosed = &HE78 Const adErrObjectOpen = &HE79 Const adErrProviderNotFound = &HE7A Const adErrInvalidParamInfo = &HE7C Const adErrInvalidConnection = &HE7D '----------------------------------------------------------- ' ADO Cursor Types '----------------------------------------------------------- Const adOpenUnspecified = -1 Const adOpenForwardOnly = 0 Const adOpenKeyset = 1 Const adOpenDynamic = 2 Const adOpenStatic = 3 Const DEFCursor = 0 '----------------------------------------------------------- ' ADO Lock Types '----------------------------------------------------------- Const adLockUnspecified = -1 Const adLockReadOnly = 1 Const adLockPessimistic = 2 Const adLockOptimistic = 3 Const adLockBatchOptimistic = 4 Const DEFLock = 1 ' check what should be the default lock type Const DEFOption = " " '----------------------------------------------------------- ' ADO Field Attributes '----------------------------------------------------------- Const adFldMayDefer = 2 Const adFldUpdatable = 4 Const adFldUnknownUpdatable = 8 Const adFldFixed = 16 Const adFldIsNullable = 32 Const adFldMayBeNull = 64 Const adFldLong = 128 Const adFldRodID = 256 '----------------------------------------------------------- ' ADO Field Types '----------------------------------------------------------- Const adWChar = 130 Const adBinary = 128 Const adInteger = 3 Const adSmallInt = 2 Const adDouble = 5 Const adDate = 7 Const adUnsignedSmallInt = 18 Const adUnsignedInt = 19 Const adUnknown = -1 '----------------------------------------------------------- ' ADO Supports() Types '----------------------------------------------------------- Const adAddNew = 16778240 Const adApproxPosition = 16384 Const adBookMark = 8192 Const adDelete = 16779264 Const adHoldRecords = 256 Const adMovePrevious = 512 Const adResync = 131072 Const adUpdate = 16809984 Const adUpdateBatch = 65536 '----------------------------------------------------------- ' ADO Absolute Page/Absolute Position Special Constants '----------------------------------------------------------- Const adPosUnknown = -1 Const adPosBOF = -2 Const adPosEOF = -3 '----------------------------------------------------------- ' ADO Edit Modes '----------------------------------------------------------- Const adEditNone = 0 Const adEditInProgress = 1 Const adEditAdd = 2
PPC用のADOに関するレポート:
昨日MSからPalm-PC SDK v1.2をダウンロードして、ADOCEファイルだけをカスタムインストールしま した。\Program Files\WINCE SDK\wce211\ms palm size pc\adoce\の中にMSCEADODT.DLL ファイルが、mips41フォルダの中にさらに5つのファイルがあります:
adoce.dll
adocedb.dll
adocereg.dll
adoceres.dll
adosync.dll
これら6つの全てのファイルをPPCにコピーして、adoce.dllを登録しました。
NS Basicの"View Controls.vb" アプリケーションは、実行すると、リストの上部にADOを見せるようになりました。
developerone.comからのFlashBackDBと呼ばれる、データベース マネージャー アプリケーションを使うと、 それはさらに4つのファイルを見せます(adoce.dllを登録した時に作られたのでしょうか?):
MSysFields
MSysIndexes
MSysProcs
MSysTables
NS Basicのサンプルコードを(SQL文字列を入力して、表を処理する為に)変更して、PPC用にそれを再フォー マットしました。これで、MSysTablesで選択出来るようになり、その中に4つのレコードが見えるようになりました。
ADO Controlを使っていくつかの小さいNS Basicアプリケーションを作成してみました:
表の作成(表のFlashBackdbリストの中に現れる)
表の削除(データベースリストから取除く)
表の中のレコードの入力、アップデート、削除
外部データベースファイル(Pocket Access format .cdb)の作成および処理も可能になりました。
INTERACTION OF WIN-CE SERVICES 2.2:
ファイル転送の4つの可能なシナリオから3つが出来ます。
.mdbファイルをCE Data Storeの表にInport/Export/Copyする方法は見つけられませんでした。ですから、あ なたがデータの表を使用したアプリKションを作成する時、 外部の.cdbファイルを使用するか、 CE Data Store 内にそれが必要な場合は、ソースコードから表を作成しなければなりません。
外部データベースとData Stroe Tablesの賛否をもう少し調べて見ます。 Accessでデータベースの表を先に作 成して、あなたのアプリケーションの配付を用いて送る用に、.cdbファイルを作成する方のが簡単ですが、 FlashBackDBのようなアプリケーションでは、個々の表を選びながらbackup/restore/exportが出来ます。