|
テクニカルノート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が出来ます。