Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

Caché オブジェクト / Visual Basic アプリケーションの構成部分

ここでは、Caché オブジェクトを操作する Visual Basic の基本的な機能について説明します。以下の内容を取り上げます。

サーバへの接続

通常、クライアント・アプリケーションはまず CacheActiveX.Factory オブジェクトを作成し、Caché サーバへの接続を確立します。Visual Basic 内では、以下のコードがこれを実行します。

'Visual Basic Code
option Explicit
Dim factory As CacheActiveX.Factory

Private Sub Form_Load()

' Create instance of factory object
' You must use "Set" to assign an object value
Set factory = CreateObject("CacheActiveX.Factory")

' Establish connection to server if one doesn't exist
If Not factory.IsConnected() Then
     Dim connectstring As String
     ' You can explicitly specify the connection string:
     connectstring = "cn_iptcp:127.0.0.1[1972]:USER"

     ' Alternately, you can pop up a connection dialog
     ' This method returns the connection string.
     connectstring = factory.ConnectDlg()

     Dim success As Boolean
     success = factory.Connect(connectstring)
End If
End Sub

まず、Visual Basic の CreateObject 関数を呼び出して、CacheActiveX.Factory オブジェクトのインスタンスを作成します。

Set factory = CreateObject("CacheActiveX.Factory")

CreateObject が DLL (CacheActiveX.Factory オブジェクトの実装を含む) を見つけることができない場合や、ロードできない場合は失敗します。詳細は、“Visual Basic プロジェクトの構成” の章を参照してください。

上記のコードにもあるとおり、factory.IsConnected メソッドを使用して、接続が確立されているかどうかを調べるために、オプションで CacheActiveX.Factory オブジェクトをテストすることができます。このメソッドは接続が存在する場合、True を返します。

次に、CacheActiveX.Factory オブジェクトの Connect メソッドを使用して、サーバへの接続を確立します。

success = factory.Connect(connectstring)

Connect に、接続プロトコル、IP アドレスか完全修飾されたドメイン名 (FQDN) とポート番号、およびコロン (:) で区切られたネームスペースから成る接続文字列を渡します。接続プロトコルは常に “cn_iptcp” で、TCP/IP プロトコルを示します。IP アドレスとポートは共に特定の Caché サーバを一意に指定します。ポート番号は IP アドレスか FQDN の直後に続く角括弧 (“[” と “]”) で囲んで指定します。ネームスペースは、Caché オブジェクトを含むネームスペースを指定します。ネームスペースを省略すると、アプリケーションは既定のネームスペースに接続します。

ユーザは、直接 Connect メソッドに接続文字列を渡すことができます。また、エンド・ユーザが接続情報を接続ダイアログ・ボックスで指定できるようにすることも可能です。このダイアログは、CacheActiveX.Factory オブジェクトの ConnectDlg メソッドが実行されているときはいつでも表示されます。エンド・ユーザが接続情報を指定し、[OK] をクリックすると、ConnectDlg メソッドは生じた接続文字列を返します。その文字列は、接続を作成するために Connect に渡されます。

Connect は、サーバに正常に接続した場合は True を、失敗した場合は False を返します。

接続文字列の定義

connectstring の基本形式は以下のようになります。

cn_iptcp:ipaddress[port]:namespace

connectstring は以下の部分で構成されています。

  • cn_iptcp — 接続のタイプを表すリテラル。ActiveX で、接続メカニズムとしてサポートされているのは TCP/IP だけです。

  • ipaddress — IP アドレス、または完全修飾されたドメイン名 (FQDN)。

  • port — この接続のポート番号。角括弧 ([ ]) で囲み、IP アドレスの直後に指定します。IP アドレス、または FQDN とポートの組み合わせにより、一意の Caché サーバが指定されます。

  • namespace — 使用する Caché オブジェクトを含むネームスペース。このネームスペースでは、Caché システム・クラスをコンパイルしておく必要があります。また、ActiveX からの操作の対象となるオブジェクトはこのネームスペースに含まれている必要があります。

例えば、Connect メソッドは次のように使用できます。

' Establish connection to server
Dim connectstring As String
connectstring = "cn_iptcp:127.0.0.1[1972]:USER"

Dim success As Boolean
success = factory.Connect(connectstring)

安全な接続の定義

安全な connectstring は接続タイプ scn_iptcp: を使用します (cn_iptcp: は使用しません)。また、基本形式は以下のようになります。

scn_iptcp:ipaddress[port]:namespace:srv_principal_name:security_level:username:password

Caché サーバでセキュリティが有効でない場合、namespace 以降のコンテンツはすべて無視されます。セキュリティが有効な場合、connectstringsrv_principal_name および security_level を含める必要があります。username および password は SSL で使用するオプションの引数です。

セキュリティ引数は以下のように定義されます。

  • scn_iptcp: — 接続のタイプを表すリテラル。

  • ipaddress — IP アドレス、または完全修飾されたドメイン名 (FQDN)。

  • port — この接続のポート番号。角括弧 ([ ]) で囲み、IP アドレスの直後に指定します。IP アドレス、または FQDN とポートの組み合わせにより、一意の Caché サーバが指定されます。

  • namespace — 使用する Caché オブジェクトを含むネームスペース。このネームスペースでは、Caché システム・クラスをコンパイルしておく必要があります。また、ActiveX からの操作の対象となるオブジェクトはこのネームスペースに含まれている必要があります。

  • srv_principal_name — Caché サーバを表すプリンシパルの名前であるサービス・プリンシパル名。これには、cache/machine.domain という形式で、標準の Kerberos プリンシパル名を指定することが普通です。cache は Caché のサービスであることを示す固定文字列、machine はマシン名、domainintersystems.com のようなドメイン名です。

  • security_level — 接続セキュリティ・レベルを表す整数です。有効なレベルは以下のとおりです。

    • 0 — Caché ログイン (パスワード)

    • 1 — Kerberos (認証のみ)

    • 2 — Kerberos パケット整合性

    • 3 — Kerberos 暗号化

    • 10 — SSL/TLS

  • username — (オプション) 接続を行うユーザの名前。

  • Password — (オプション) 指定したユーザ名に関連付けられたパスワード。

詳細は、"Caché セキュリティ管理ガイド" の “認証” の章を参照してください。

古い DLL で使用する接続文字列

古い CacheObject.dll (“CacheObject.dll からのアップグレード” を参照) を使用している場合、Connect メソッドでは、暗号化されたパスワードを含む接続文字列を受け入れることができます(新しい CacheActiveX.dll では、この情報が ODBC ドライバでエンコードされているため必要ありません)。つまり、接続文字列の形式は以下のようになります。

cn_iptcp:ipaddress[port]:namespace:username:password

Caché サーバの Caché Direct セキュリティがオンになっている場合、パスワードが必要です。また、このパスワードは EncryptPswd 関数を使用して暗号化する必要があります。プロジェクト・モジュールで、パスワード暗号化関数が含まれるライブラリを使用可能にします。

Declare Function 
        EncryptPswd Lib "CMVISM32" (ByVal pswd$, ByVal encrypt$) as Integer
Note:

Visual Basic では、宣言は 1 行に表示する必要があります。

次に、サーバへの接続を行う呼び出しを作成します。

' preallocate the buffer, 8 nulls
ret$ = String$(8,Chr(0))

' encrypt the password for the connection string
pwlen = EncryptPswd(PlainTextPassword,ret$)

' reset the length of the password string 
' to match that of the encrypted password
ret$ = Left$(ret$,pwlen)

' Establish connection to server
Dim connectstring As String
connectstring = "cn_iptcp:127.0.0.1[1972]:USER:" & username & ":" & ret$

Dim success As Boolean
success = factory.Connect(connectstring)

If success <> True Then
    Dim MyMsg As String
    MyMsg = "Connection failed."
    MsgBox MyMsg
    End
End If
Note:

Cache インスタンスが通常のセキュリティでインストールされていて、%SERVICE_CACHEDIRECT が非認証 (CacheObject.dll の使用で必須) の場合、UnknownUser に追加ロールのアクセス (%DEVELOPER または %MANAGER) も提供する必要があります。このようにしないと、接続を試行しても PROTECT エラーが発生して失敗します。詳細は、"Caché セキュリティ管理ガイド" の “サービス” の章で、“%Service_CacheDirect” を参照してください。

新規オブジェクト・インスタンスの作成

CacheActiveX.Factory オブジェクトの New メソッドを使用して、Caché オブジェクトの新規インスタンスを作成することが可能です。

Dim Patient As Object
Set Patient = factory.New("Patient")

New の引数は、インスタンス作成のための Caché のクラス名です。New は以下の処理を実行します。

  • 指定されたオブジェクトの新規インスタンスを、サーバ上に作成します。この場合、サーバ側で以下を呼び出すのと同じです。

     Set object = ##class(Patient).%New()

    サーバActiveX 用 Caché オブジェクト・サーバに、このサーバ側オブジェクトの OREF 値を返します。

  • サーバ側オブジェクトに接続しているクライアントにある ActiveX オブジェクトの新規インスタンスを作成します。この ActiveX オブジェクトに、ハンドル (LPDISPATCH) を返します。

  • 指定されたオブジェクトを New で作成できない場合は、エラーが発生します (“Visual Basic でのエラー・トラップ” を参照してください)。

オブジェクトの保存

永続オブジェクトのインスタンスを、その %Save メソッド (Visual Basic では sys_Save と呼ばれます) を使用して保存できます。sys_Save は Caché オブジェクトのメソッドであり、CacheActiveX.Factory オブジェクトのメソッドではないことに注意してください。

Dim status As String
patient.sys_Save
patient.sys_Close
Set patient = Nothing

また、使用の際にオブジェクト上の sys_Close を呼び出す必要があることに注意してください。これは、サーバ上のオブジェクトを閉じます。また、Patient を Nothing に設定して、Visual Basic のオブジェクトを閉じます。

sys_Savesys_Close への呼び出しの後に、括弧がないことにも注意してください。これは、Visual Basic では、呼び出しの後に空の括弧が続く場合、その結果を使用する必要があるためです。呼び出しの返り値を無視するには (または返り値がない場合には)、上記の呼び出しのように、括弧を省略します。

既存のオブジェクトのオープン

CacheActiveX.Factory オブジェクトの OpenId メソッドを使用して、データベースから既存の Caché オブジェクトをロードできます。

Dim Patient As Object
Set Patient = factory.OpenId("MyApp.Patient", id)

OpenId は 2 つの引数を取ります。開く Caché クラスの名前、およびオブジェクトがデータベースに格納される ID 値です。ID 値は文字列として処理されます。OpenId では以下を実行します。

  • サーバのメモリに、指定されたオブジェクトをロードします。この場合、サーバ側で以下を呼び出すのと同じです。

     Set object = ##class(MyApp.Patient).%OpenId(id) 

    ActiveX クライアントのメモリ内サーバ側オブジェクトに対する OREF 値を返します。

  • サーバ側オブジェクトに接続しているクライアントにある ActiveX オブジェクトの新規インスタンスを作成します。ハンドルをこの ActiveX オブジェクトへ返します。

指定されたオブジェクトを OpenId メソッドで開くことができない場合は、エラーが発生します (“Visual Basic でのエラー・トラップ” を参照してください)。

Note:

クライアント側の Open メソッドもあり、完全な OID 値 (%PersistentOpens in a new tab クラスの %Open メソッドに類似) を使用してオブジェクトを開きます。

Visual Basic での Caché オブジェクトの使用法

CacheActiveX.Factory オブジェクトの New または OpenId メソッドを呼び出して Caché オブジェクトのインスタンスを生成すると、別の Visual Basic オブジェクトを使用するのと同様に、そのオブジェクトを使用することができます。例えば、プロパティの値を取得して設定します。

Dim name As String

name = patient.Name
patient.Name = name

オブジェクト上でメソッドを呼び出すことができます (メソッドがサーバ上で実行されることに注意してください)。

patient.Admit()

Visual Basic と ObjectScript では、オブジェクトの使用法が少し異なります。Caché で “%” で始まるメソッドは、Visual Basic では “sys_” で始まります。したがって、ObjectScript の %Save メソッドは、Visual Basic では sys_Save メソッドです。

また、Visual Basic オブジェクトの既定のプロパティに依存しないようにします。例えば、以下を

patient.Name = txtName.Text

以下の代わりに使用します。

patient.Name = txtName ' Don't use default property syntax

Visual Basic でのコールバック機能の使用法

ActiveX 用 Caché オブジェクト・サーバは、ファクトリ・クラスの SetOutput メソッド経由で、コールバック機能をサポートします。このメソッドにより、システム出力をユーザのクライアント・アプリケーションに向けることができます。以下はその例です。

Set factory = CreateObject("CacheActiveX.Factory")
factory.SetOutput(Text1)
' System output now goes to textbox Text1

出力機能を無効にするには、空の文字列で SetOutput を呼び出します。

factory.SetOutput("")

Visual Basic でのクエリの実行

Caché はクエリを実行する強力なインタフェースを提供します。このインタフェースは、ResultSet オブジェクトを使用して、ActiveX からアクセスできます。ResultSet オブジェクトは ActiveX にのみ存在し、Caché 内で他に関連するオブジェクトはありません。各 ResultSet オブジェクトは特定の Caché クラスで定義された特定のクエリに結びついています。

例えば、Person クラスではクエリ ByName を実行します。

Dim rset As CacheActiveX.ResultSet
Dim columns As Integer
Dim counter As Integer
Set rset = factory.ResultSet("Person","ByName")

'Find out how many columns will be in the data
columns = rset.GetColumnCount()

'Now run the ByName query.
'This query will return all people
'whose names begin with the letter specified
rset.Execute("A")

'Cycle through the returned rows and access the data
While rset.Next()
     For counter = 1 To columns
         Print rset.GetData(counter)
     Next counter
Wend

'Close the result set
rset.Close()

この例を使用すると、クラス Person で定義したクエリを実行できます。このクエリは、指定した文字 (“A”) で始まる名前を持つすべての people オブジェクトを返します。クエリを実行した後、rset ResultSet オブジェクトの Next メソッドを呼び出すことで、1 つの行から次の行へ移動できます。ResultSet GetColumnCount メソッドを使用して、データの各行にある列数を割り出し、上記の For ループを使用して、現在の行の各列に格納された値を出力します。While ループで、1 つの行から次の行へ移動します。それらをまとめて、クエリによって返されたすべてのデータを出力できます。すべてのデータが処理されると、CloseResultSet オブジェクトを閉じることができます。

Visual Basic でのストリームの使用法

CacheActiveX.CharStream および CacheActiveX.BinaryStream を使用して、ストリーム・プロパティを投影します。例えば、文字ストリーム・プロパティ Memo を含む Person オブジェクトがあるとします。標準ストリーム・メソッド Read および Write に加え、クライアント側メソッド Data を使用して、1 回の操作ですべてのストリームを取得できます。

  ' Visual Basic code
  Dim person As Object
  Dim memo As String1

  ' Open a Person object and copy its memo into a local variable
  Set person=Factory.OpenId("Sample.Person",id)
  memo=person.Memo.Data

GetPicture メソッドは、ピクチャ・コントロール内にビットマップ・イメージを含むバイナリ・データを効率的にコピーする、類似したメカニズムです。例えば、Person オブジェクトがビットマップ・イメージ (.jpg または .png など) を含むバイナリ・ストリーム・プロパティ Picture を持っている場合、このイメージを Visual Basic で以下のように表示できます。

  ' Visual Basic code
  Dim person As Object
  Dim memo As String

  ' Open a Person object and show its picture in an Image control
  Set person=Factory.OpenId("Sample.Person",id)
  Image1.Picture = person.Picture.GetPicture

SetPicture メソッドを使用して、イメージ・コントロールからバイナリ・ストリーム・プロパティに、イメージを逆方向にコピーすることもできます。

  ' Visual Basic code
  person.Picture.SetPicture Image1.Picture

Visual Basic でのリストの使用法

以下の例に示すように、CacheActiveX.SysList を使用して、VB と Caché の間でリスト (Caché $List 形式) の受け渡しを行うことができます。

Dim colorList As New CacheActiveX.syslist 
Dim ReturnData As Object 
Dim myRef as Object 

'populate the list with red,green,blue values 
colorList.Add "red" 
colorList.Add "green" 
colorList.Add "Blue" 

'create a new instance on the server 
Set myref = o_factory.New("Pack.ClassA") 
colorList2.Clear 'sets list to null 

'pass a listbuild string and return the com object to ReturnData, which 
'can then be used to get the items of the list. GetData()is an 
'instance method that takes a %List as argument and returns %List. 

set ReturnData = myref.GetData(colorList.Get) 
Text1.Text = ReturnData.Item(1) 'display return string 'red' 

colorList.sys_Close 'close object 
Set colorList = Nothing 'close vb object 

Visual Basic でのエラー・トラップ

CacheActiveX.Factory オブジェクトは、エラーの条件に遭遇すると、Visual Basic エラーを発生します。Visual Basic の err オブジェクトを使用して、エラーに関する情報を取得できます。以下はその例です。

Private Sub OpenObject(id As String)

' Set up error handler
On Error GoTo errortrap:

' try to open non-existent object
Dim Patient As Object
Set Patient = factory.OpenId("Patient", id)

'......
Exit Sub

errortrap:
' handle error (show error string in dialog box)
MsgBox (Err.Description)

End Sub

あるいは、CacheActiveX.Factory クラスの GetErrorText メソッドを使用できます。このメソッドには、以下の構文があります。

String GetErrorText(int ErrorNumber [, Param1, ..., Param10])

ErrorNumber には、サーバによって返された Caché エラーを指定します。個々の ParamN 引数には、エラー・メッセージのテキストに提供される置換値を指定します。返り値は、クライアントのロケールの言語で表示されます。以下はその例です。

' Caché was unable to save the class.
' The returned error is encapsulated by the error object, 
'    #5659: "Property '%1' required"
msg = factory.GetErrorText(5659,"Name")
' msg now contains the string "Property 'Name' required"

Caché ActiveX バインディングは、以下のエラー・コードのうちのいずれかを返す場合があります。

ActiveX エラー・コード
エラー・コード 意味
9990 オブジェクト作成の試行中に、エラーが発生しました。指定したネームスペースとサーバに、クラスが存在することを確認します。
9991 Caché システム上でエラーが発生しました。
9992 返りタイプ %Status を持つメソッドでエラーが発生したため、状態コードが False を返します。"Caché エラー・リファレンス" で内部メッセージのリストを参照してください。
FeedbackOpens in a new tab