FAQ - 技術的質問: .NET
- 一般的質問
- 技術的質問
それぞれの項目についてのお問い合わせは、各項目内の
をクリックしてください。
Question : 074
VB.NETでCacheObject.ResultSetを使う際に、カラム名でGetDataAsString()、IsDataNull()を使いたいのですが?
ResultSetクラスGetDataAsString()、IsDataNull()は引数としてカラム番号を必要とします。
カラム数が多い場合等に、カラム名で指定を行う別の方法があります。
以下に、System.Collections.SortedListを使用して実現する例を示します。
Dim rs As CacheObject.ResultSet
rs = factory.DynamicSQL("SELECT * from DateTest")
rs.Execute()
''' +++ カラム情報を取得し保存 +++
Dim i As Integer
Dim dt As Date
Dim columns As Integer
Dim counter As Integer
Dim sortedList As New System.Collections.SortedList
columns = rs.GetColumnCount()
For counter = 1 To columns
sortedList.Add(rs.GetColumnName(counter), counter)
Next
''' --- カラム情報を取得し保存 ---
''' +++ 使用例 +++
While rs.Next()
System.Console.WriteLine(rs.GetDataAsString(sortedList.GetByIndex(sortedList.IndexOfKey("aCurrency"))))
System.Console.WriteLine(rs.GetDataAsString(sortedList.GetByIndex(sortedList.IndexOfKey("aDate"))))
System.Console.WriteLine(rs.GetDataAsString(sortedList.GetByIndex(sortedList.IndexOfKey("aInteger"))))
System.Console.WriteLine(rs.GetDataAsString(sortedList.GetByIndex(sortedList.IndexOfKey("aString"))))
If rs.IsDataNull(sortedList.GetByIndex(sortedList.IndexOfKey("aCurrency"))) = True Then
System.Console.WriteLine("aCurrency is Null")
End If
If rs.IsDataNull(sortedList.GetByIndex(sortedList.IndexOfKey("aDate"))) = True Then
System.Console.WriteLine("aDate is Null")
End If
If rs.IsDataNull(sortedList.GetByIndex(sortedList.IndexOfKey("aInteger"))) = True Then
System.Console.WriteLine("aInteger is Null")
End If
If rs.IsDataNull(sortedList.GetByIndex(sortedList.IndexOfKey("aString"))) = True Then
System.Console.WriteLine("aString is Null")
End If
End While
rs.Close()
''' --- 使用例 ---
Question : 075
VB.NETでCacheObject.SetPicture()メソッドを使用して画像を保存する方法を教えてください。
VB.NETで使用されるImageクラスはCacheObject.SetPicture()の引数として使用できません。
これはCacheObject.SetPicture()がIPictureインターフェースを期待しているためで、これには2通りの解決方法があります。
1)CacheObject.FileRead()メソッドを使用する
2)明示的に形式の変換を行うコードを実行する
実例はサンプルをご覧下さい。
Question : 106
C++バインディングで、実行終了時に、以下のようなメッセージが表示されてExceptionが発生します。「Error: code = -8, msg = forcefully closed some objects」C++で記述した処理そのものは終了しているようです。
VC++で、Cachéへの物理的接続が完了した後は、その接続はDatabaseクラスによって管理されます。VC++で使用する「Cachéプロキシ・クラス」の作成は、このDatabaseクラスを作成した後である必要があります。
int nRetCode = 0;
Db_err conn_err;
// connection
d_connection conn=tcp_conn::connect("localhost[1972]:SAMPLES","_SYSTEM","SYS",&conn_err);
if (conn_err) nRetCode=-1;
try{
// d_ref<Sample_Person> test; // これはエラー
Database db(conn);
d_ref<Sample_Person> test; // これはOK
上記の間違いを行った場合、プログラムの最後で、AccessViolationが発生します。
これは、Databaseクラスは、各プロキシクラスのインスタンス(ここではSample_Personクラスのtest)情報を保持しなければならないため、Databaseクラスが先に作成されていなければならないためです。
Question : 107
VB.Netを使用してFactoryオブジェクトを使用したところ、参照をヌルに設定してもFactoryオブジェクトが開放されません。
FactoryオブジェクトはCOMオブジェクトですので、VB.Netでは明示的に開放処理を行わないと開放されません。COMオブジェクトを開放するには、
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
を使用してください。
開放処理を行わない状態で、アプリケーションを終了すると Send to Server Failed エラーダイアログが表示される場合があります。
Question : 157
VB.NETからCachéへ接続したいと思います。どのような方法がありますか?
以下の3つの技術を用いて、VB.NETからCachéへ接続し使用することができます。
(A) Caché Managed Provider(CMP)を使用する
:.NETシステムを使用されるのであれば、CMPは .NET マネージドコードのみを使用して実装されておりますので、より安全かつ容易に環境を構築することが可能です。
(B) ODBC経由で接続する
:VB.NETからも、他の技術からの接続と同様に、ODBC経由での接続が可能です。
(C) WebServiceを使用する
:Caché は、SOAP (Simple Object Access Protocol) に対する完全なサポートを提供しており、.NETからもご使用頂くことが可能です。
これらの詳細については、以下のドキュメントをご参照ください。
(1) Cachéファーストステップ・ガイド
http://www.intersystems.co.jp/support/guide.html
(2) Caché Managed Provider for .NET
http://www.intersystems.co.jp/cache/devcorner/tutorials.html
or
Caché Managed Provider for .Net チュートリアル
http://docs.intersystems.com/cache20082j/csp/docbook/DocBook.UI.Page.cls?KEY=TCMP_preface
(3) .NET からの Web サービスの使用法
http://docs.intersystems.com/cache20082j/csp/docbook/DocBook.UI.Page.cls?KEY=GSOP_WebService#GSOP_C60389
Question : 159
VisM.OCXは、.NETで使用できますか?
.NETは、下位互換性のため、ActiveXをサポートしていますので、VisM.OCXも動作可能です。
しかし、.NET環境のメリットであるManaged Codeとしては動作しませんので、あまりお勧めする利用方法ではありません。
VisM.OCXの機能のほとんどは、Caché Managed Providerを使用して、Cachéサーバ側にラッパクラスを用意することでエミュレーション可能です。
ラッパクラスのサンプルを添付します。
Question : 175
ASP.netからCachéに接続する簡単なサンプルコードを教えて下さい。
SAMPLEネームスペースに接続し、ID=22の名称(Sample.Person)を表示するサンプルです。
ASP.net の BODY部を、添付のように記述してください。
実行までの詳細な手順は、以下のドキュメントをご参照ください。
http://docs.intersystems.com/cache20082j/csp/docbook/DocBook.UI.Page.cls?KEY=GBMP_proxy
Question : 177
.Netを使用して開発をしていますが、<STORE>エラーが発生します。対処法を教えて下さい。
<STORE>エラーは、.NETクライアントが接続しているCachéサーバ上のプロセスが使用しているプロセス個別メモリ容量が上限に達した場合に発生します。
このメモリは、オブジェクトを開いたり、ローカル変数を使用することで消費されるものとなります。
このエラーは、Caché Managed Providerに限らずCachéサーバ上のプロセスでメモリを大量に使用した場合に発生します。
ターミナルでの例:
USER>for i=1:1 set a(i)="some string....."
FOR i=1:1 SET a(i)="some string....."
^
<STORE>
USER>
プロセスが使用可能なメモリの上限は、システム管理ポータルの [構成] > [メモリ詳細設定] の bbsiz で設定でき(※)、、既定値が16384KBで最大47630KBまで設定できます。
※2008.2.x 以前は、構成 > 詳細設定 の カテゴリ=Memory にある MaxMemPerProcess
プロセスのメモリ使用状況は、システム管理ポータル プロセス の一覧表示から各プロセスの詳細を表示すると、"使用中のメモリ" の項目で確認できます。
Caché Managed ProviderではクライアントがCachéサーバの接続を開始すると利用可能な接続プールから接続が取り出されます。
各接続はCachéサーバ上の1つのプロセスに対応します。クライアントの処理に応じてメモリが消費され、不要なオブジェクトが蓄積するなどで <STORE> エラーが発生する可能性があります。
サーバの設定でMaxMemPerProcessを増やしてエラーを回避できる場合もありますが、設定可能な最大まで増やしても引き続き問題が発生する場合は処理で不要になったオブジェクトを都度クローズしてメモリ消費を抑えるなどの対処を行う必要があります。
Question : 178
VB.Net(またはC#) で Caché Managed Provider for .NET(CMP) を使ってアクセスする方法を教えて下さい。
インストールディレクトリ\Dev下にサンプルがあるのでそちらを参照下さい。
また、 Caché Managed Privider for .NET(CMP) に関するドキュメントは、以下を参照してください。
C#のサンプルコードをVBで記述したものは次のようになります。
C#:
using InterSystems.Data.CacheClient;
using InterSystems.Data.CacheTypes;↓
VB:
Imports InterSystems.Data.CacheClient
Imports InterSystems.Data.CacheTypesC#:
CacheConnect = new CacheConnection();
CacheConnect.ConnectionString =
"Server = localhost;"
+ " Port = 1972;"
+ " Namespace = SAMPLES;"
+ " Password = SYS;"
+ " User ID = _SYSTEM;";
CacheConnect.Open();↓
VB:
Dim CacheConnect As New CacheConnection
CacheConnect.ConnectionString = _
"Server=localhost;" _
+ " Port = 1972;" _
+ "Namespace=SAMPLES;" _
+ "Password= SYS;" _
+ "User ID = _SYSTEM;"
CacheConnect.Open()また、http://docs.intersystems.com/cache20082j/csp/docbook/DocBook.UI.Page.cls?KEY=GBMP_proxyでプロキシオブジェクトにアクセスしている部分は、たとえば
C#:
Sample.Person person = Sample.Person.OpenId(CacheConnect, "1");↓
VB:
Dim person As Sample.Person = Sample.Person.OpenId(CacheConnect, "1")のような形になります。

