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é ダイナミック・バインディングの使用法

Caché ダイナミック・バインディングにより、アプリケーションは最初にプロキシ・クラスを生成せずにサーバ上の Caché オブジェクトにアクセスできます (“.NET 用 Caché オブジェクト・バインディングの使用法” を参照)。代わりに、実行時にダイナミック・プロキシ・クラス CacheObject が作成され、プロパティのアクセスや名前によるメソッドの呼び出しに使用できます。引数値および返り値の型は、CacheMethodSignature クラスのインスタンスを作成することにより指定されます。

ダイナミック・バインディングは、汎用ツールの記述に役立ちます。また、サーバ上で Caché クラスが変更されるたびにプロキシ・クラスを再生成する代わりとして使用できます。

この章では、以下の項目について説明します。

ダイナミック・オブジェクトの使用法

この章の例は、データベースへの接続が conn という名前の CacheConnection オブジェクトにより既に確立していることを前提としています (CacheConnection の詳細は、“Caché データベースへの接続” を参照してください)。ダイナミック・オブジェクトを使用するには、まず接続オブジェクトの DynamicMode プロパティを true に設定する必要があります。

   conn.DynamicMode = true;

新しい InterSystems.Data.CacheTypes.CacheObject が以下のような文で作成されます。

   CacheObject dynamicObj = new CacheObject(conn, className);

conn は開いている CacheConnection オブジェクト、className はアクセスするクラスの完全な名前を含む文字列です。

メソッド・シグニチャ・オブジェクトの使用法

CacheObject インスタンスを使用してメソッドを呼び出すには、まず CacheMethodSignature オブジェクトを作成する必要があります。メソッド・シグニチャ・オブジェクトは、このメソッドに渡される引数の値、およびメソッドの返り値のデータ型の指定に使用されます。

接続オブジェクトの GetMtdSignature() メソッドを使用して、CacheMethodSignature オブジェクトを作成します。

   CacheMethodSignature mtdSignature = conn.GetMtdSignature()

シグニチャの定義には、CacheMethodSignature オブジェクトの Add() メソッドおよび SetReturnType() メソッドが使用されます。

  • Add() メソッドを使用して、引数としてメソッドに渡される値を指定します。渡される引数ごとに Add() を呼び出します。このメソッドは、以下のように呼び出されます。

       mtdSignature.Add(value, isByRef);
    

    value は該当する型の値、isByRef は引数が参照渡しされるかどうかを指定するブーリアンです。

  • メソッドが値を返す場合、SetReturnType() メソッドを使用して返り値の型を指定します。

       SetReturnType(conn, typeId)
    

    typeIdClientTypeId 列挙の定数の 1 つです。

CacheMethodSignature オブジェクトを使用してメソッドを呼び出すと、ReturnValue プロパティおよび Arguments プロパティを使用して結果を取得できます。

  • ReturnValue プロパティは、SetReturnType() で指定された型の値を含みます。

  • Arguments プロパティは、Add() で指定された引数ごとに 1 つの要素を持つ配列を含みます。各要素には、引数 (参照渡しされる引数を含む) の現在の値が含まれます。

メソッド・シグニチャ・オブジェクトは、複数の呼び出しに使用することもできます。再度 Add() および SetReturnType() を使用して新しいシグニチャを定義する前に、Clear() メソッドを使用してオブジェクトを再初期化してください。

メソッドの呼び出し

メソッドの呼び出しには、CacheObjectRunMethod() メソッドおよび RunClassMethod() メソッドが使用されます。

  • インスタンス・メソッドの場合、呼び出しは以下のとおりです。

       dynamicObj.RunMethod(methodName, mtdSignature);
    
  • クラス・メソッドの場合、呼び出しは以下のとおりです。

       CacheObject.RunClassMethod(conn, className, methodName, mtdSignature);
    

メソッドが呼び出されると、CacheMethodSignature オブジェクトの Arguments プロパティおよび ReturnValue プロパティから返り値を取得できます (“メソッド・シグニチャ・オブジェクトの使用法” を参照)。返り値は、コンテナ・オブジェクトに適した型にキャストする必要があります。例えば、次の行は整数の返り値を取得し、これをクラス CacheIntReturnValue にキャストします。

   long? mtdRes = ((CacheIntReturnValue)(mtdSignature.ReturnValue)).Value;

次の行は、Arguments 配列にアクセスして参照渡しされる文字列の引数の現在の値を取得し、これをクラス CacheStringArgument にキャストします。

   response = ((CacheStringArgument)(mtdSignature.Arguments[1])).Value;

使用可能な Cache(type)Argument クラスおよび Cache(type)ReturnValue クラスの詳細な説明は、"Caché .NET ヘルプ・ファイル" の InterSystems.Data.CacheTypes ネームスペースの節に記載されています。

プロパティへのアクセス

CacheMethodSignature オブジェクトは、プロパティ・シグニチャの指定にも使用されます。シグニチャが指定されると、CacheObject オブジェクトの GetProperty() メソッドおよび SetProperty() メソッドを使用してプロパティ値にアクセスできます。例えば、以下のコードは、Sample.PersonOpens in a new tab オブジェクトの Name プロパティに使用されるシグニチャを指定し、そのプロパティを指定された値に設定します。

   CacheMethodSignature mtdSignature = conn.GetMtdSignature();
   string value = "Smith, Wilbur"
   mtdSignature.Add(value, false);

   string propertyName = "Name"
   person.SetProperty(propertyName, mtdSignature);

以下のコードはメソッド・シグニチャを再定義し、プロパティの値を取得します。

   mtdSignature.Clear();
   mtdSignature.SetReturnType(conn, ClientTypeId.tString);
   person.GetProperty(propertyName, mtdSignature);
   string newName = ((CacheStringReturnValue)(mtdSignature.ReturnValue)).Value;

例 : Sample.Person へのアクセス

このセクションでは、ダイナミック・インタフェースを使用して Sample.PersonOpens in a new tab オブジェクトにアクセスするサンプル・コードを示します。

GetMtdSignature()

以下のコードでは、これらの例で使用される CacheObject オブジェクトと CacheMethodSignature オブジェクトを作成します。

   CacheObject person = new CacheObject(conn, "Sample.Person");
   CacheMethodSignature mtdSignature = conn.GetMtdSignature();

Add(), SetProperty()

以下のコードでは、Person.Name プロパティを valueOfName の値に設定します。

   string valueOfName = "test";
   mtdSignature.Add(valueOfName, false);
   person.SetProperty("Name", mtdSignature);

Clear(), SetReturnType(), GetProperty()

これで、メソッド・シグニチャがクリアされ、返り値の型が設定され、Person.Name プロパティの新しい値が取得されます。

   mtdSignature.Clear();
   mtdSignature.SetReturnType(conn, ClientTypeId.tString);
   person.GetProperty("Name", mtdSignature);
   string returnedNameValue = ((CacheStringReturnValue)(mtdSignature.ReturnValue)).Value;

プロパティ値を元の変数の値と比較するには、.NET TestTools.UnitTesting.Assert クラスを使用します。

   Assert.AreEqual(valueOfName, returnedNameValue);

オブジェクト・プロパティへのアクセス

以下のコードでは、Person.Home オブジェクト・プロパティを取得し、そのオブジェクトをテストして接続されているかどうかを確認し、さらに Person オブジェクトを閉じて Person.Home オブジェクトが切断されているかどうかをテストします。

   mtdSignature.Clear();
   mtdSignature.SetReturnType(conn, ClientTypeId.tObject);
   person.GetProperty("Home", mtdSignature);
   ICacheObject home = ((CacheObjReturnValue)(mtdSignature.ReturnValue)).Value;

   Assert.IsTrue(home.IsConnected);
   person.Close();
   Assert.IsFalse(home.IsConnected);
RunClassMethod()

この例では、StoredProcTest() クラス・メソッドを呼び出します。これは Sample.PersonOpens in a new tab サーバ・クラスで以下のように宣言されます。

   classmethod StoredProcTest(name As %String, ByRef response As %String) as %Integer

StoredProcTest() は、2 つの name のコピーを結合し、結合した文字列を response で返します。このメソッドの返り値は常に 29 に設定されます。

以下のコードでは、メソッドのシグニチャの値と返り値の型を設定します。

   string nameValue = "test";
   string responseValue = "";

   mtdSignature.Clear();
   mtdSignature.Add(nameValue, false);
   mtdSignature.Add(responseValue, true);
   mtdSignature.SetReturnType(conn, ClientTypeId.tInt);

これでメソッドが呼び出され、結果が取得およびテストされます。

   CacheObject.RunClassMethod(conn, "Sample.Person", "StoredProcTest", mtdSignature)

   responseValue = ((CacheStringArgument)(mtdSignature.Arguments[1])).Value;
   string expectedValue = nameValue + "||" + nameValue;
   Assert.AreEqual(responseValue, expectedValue);

   long? returnValue = ((CacheIntReturnValue)(mtdSignature.ReturnValue)).Value;
   Assert.AreEqual(returnValue, 29);

CacheMethodSignature メソッドとプロパティ

このセクションでは、CacheMethodSignature クラスの概要を説明します。これはクラスの主要リファレンスではないため、この章で使用されていない項目 (System.Object から継承されたメソッドなど) は省略しています。

Note:

このクラスおよび関連する列挙に関する詳細情報および最新情報は、"Caché .NET ヘルプ・ファイル" 内のエントリを参照してください。

CacheMethodSignature クラスには、以下のメソッドおよびプロパティが用意されています。

  • Add() — メソッド・シグニチャに追加する引数値を指定します。

  • Arguments — メソッドの引数値の配列を含むフィールド。

  • Clear() — 以前指定された引数値およびメソッドの返り値設定を削除することにより、このインスタンスを初期化します。

  • Get() — 指定されたインデックスの引数の値を取得します。

  • ReturnValue — メソッドの返り値を含むフィールド。

  • SetColnReturnType() — コレクションが返される場合、メソッドの返り値の型を設定します。

  • SetReturnType() — メソッドの返り値の型を設定します。

以下の関連する列挙についても示します。

Add()

指定された引数値をメソッド・シグニチャに追加します。このメソッドには、以下のオーバーロードがあります。

public void Add(Object arg, CacheConnection conn, Type argType, ClientTypeId typeId, bool byRef)

public void Add(ICacheObject arg, CacheConnection conn, Type argType, bool byRef)

public void Add(CacheStatus arg, CacheConnection conn, bool byRef)
public void Add(CacheSysList arg, CacheConnection conn, bool byRef)

public void Add(CacheDate arg, int typeId, bool byRef)

public void Add(Nullable<(long> arg, bool byRef)
public void Add(Nullable<double> arg, bool byRef)
public void Add(Nullable<DateTime> arg, bool byRef)
public void Add(Nullable<bool> arg, bool byRef)
public void Add(Nullable<decimal> arg, bool byRef)
public void Add(byte[] arg, bool byRef)
public void Add(string arg, bool byRef)
public void Add(CacheTime arg, bool byRef)

  • arg (various data types) — 引数値。

  • conn (CacheConnection) — 接続オブジェクト。

  • argType (Type) — 引数タイプ。

  • typeId (ClientTypeId) — arg がオブジェクトの場合、オブジェクト・タイプを ClientTypeId 列挙の定数として指定します。

  • byRef (Boolean) — True に設定されている場合、引数は参照渡しされます。

引数

現在定義されているメソッドの引数の配列を含むフィールド。

public ArrayList Arguments
Clear()

以前指定された引数値およびメソッドの返り値設定を削除することにより、このインスタンスを初期化します。

public void Clear()
Get()

指定されたインデックスの引数を取得します。このメソッドには、以下のオーバーロードがあります。

public void Get(int idx, out ICacheObject arg)
public void Get(int idx, out Nullable<long> arg)
public void Get(int idx, out Nullable<double> arg)
public void Get(int idx, out Byte[] arg)
public void Get(int idx, out String arg)
public void Get(int idx, out CacheStatus arg)
public void Get(int idx, out CacheTime arg)
public void Get(int idx, out CacheDate arg)
public void Get(int idx, out Nullable<DateTime> arg)
public void Get(int idx, out Nullable<bool> arg)
public void Get(int idx, out Nullable<decimal> arg)
public void Get(int idx, out CacheSysList arg)
  • idx (Int32) — 返す引数を指定するインデックス。

  • arg (various data types) — 返される引数。

ReturnValue

サーバ・メソッドの返り値を含むフィールド。

public CacheReturnValue ReturnValue
SetColnReturnType()

コレクションが返される場合、メソッドの返り値の型を設定します。

public void SetColnReturnType(CacheConnection conn, ClientObjTypeId objTypeId, ClientTypeId colnTypeId)

  • conn (CacheConnection) — 接続オブジェクト。

  • objTypeId (ClientObjTypeId) — (ClientObjTypeId 列挙からの) コレクション要素のデータ型 ID。

  • colnTypeId (ClientTypeId) — (ClientTypeId 列挙からの) コレクション・タイプ ID。

SetReturnType()

メソッドの返り値の型を設定します。このメソッドには、以下のオーバーロードがあります。

public void SetReturnType(CacheConnection conn, int typeId)
public void SetReturnType(CacheConnection conn, ClientTypeId typeId)
public void SetReturnType(CacheConnection conn, Type clientType)
public void SetReturnType(CacheConnection conn, int objTypeId , int colnTypeId )

  • conn (CacheConnection) — 接続オブジェクト。

  • typeId (Int32 または ClientTypeId) — 整数または ClientTypeId 列挙の定数として指定される返り値の型。

  • clientType (System.Type) — 型の定義として指定される返り値の型。

  • objTypeId (Int32) — 返り値がコレクションの場合、コレクション要素のデータ型 ID を指定します ("ClientTypeId" 列挙を参照)。

  • colnTypeId (Int32) — 返り値がコレクションの場合、コレクション・タイプを指定します ("ClientObjTypeId" 列挙を参照)。

ClientTypeId 列挙

InterSystems.Data.CacheTypes.ClientTypeId 列挙には、以下の値があります。

   tVoid = -1
   tObject = 0
   tInt = 1
   tDouble = 2
   tBinary = 3
   tString = 4
   tStatus = 5
   tTime = 6
   tDate = 7
   tTimeStamp = 8
   tBool = 9
   tCurrency = 10
   tList = 11
   tLongString = 12
   tLongBinary = 13
   tDecimal = 14
   tMVDate = 15
ClientObjTypeId 列挙

InterSystems.Data.CacheTypes.ClientObjTypeId 列挙には、以下の値があります。

   tUnknown = 0
   tListOfDT = 1
   tArrayOfDT = 2
   tListOfObj = 3
   tArrayOfObj = 4
   tRelationship = 5
   tBinStream = 6
   tCharStream = 7
FeedbackOpens in a new tab