- PR -

VC++.NetでVB.NetのDLLを使用してOracle接続

1
投稿者投稿内容
mony
会議室デビュー日: 2003/06/11
投稿数: 2
投稿日時: 2006-01-19 10:49
VB.Netで作成したDLLファイルをVC++.Netで使用しており、
DLLファイル内でODPを使用してOracleに接続しています。

初期化関数でDBオープンとそのデータ取得クラスのインスタンス生成をおこない、
別関数でデータを取得したいのですが、それらのオブジェクトをグローバル化しよ
うとすると、
「グローバルな、または静的なマネージ型オブジェクト、または __gc ポインタを宣言できません。」
というエラーが発生するため、現在同じ関数内でオープン、データ取得、クローズまで
行っています。そのデータ取得関数の呼び出し頻度が高いため、DBのオープン・クローズ
は別処理にしたいんですが、よい方法はないでしょうか。

よろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-19 11:06
引用:

monyさんの書き込み (2006-01-19 10:49) より:

そのデータ取得関数の呼び出し頻度が高いため、DBのオープン・クローズは別処理にしたいんですが、よい方法はないでしょうか。


「別処理にする」のは良いんですが、イコール「グローバルにしなければならない」にはならないと思います。

「開きっぱなし」になっているのは、正直怖いです。
そこで使うものは、そこでだけ使える状態にするのは鉄則でしょう。

コネクションを確立したインスタンスを返すメソッドで十分でしょう。
コネクション ブーリングなどを検索してみてください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2006-01-19 12:58
こんにちは。

引用:

monyさんの書き込み (2006-01-19 10:49) より:

それらのオブジェクトをグローバル化しようとすると、
「グローバルな、または静的なマネージ型オブジェクト、または __gc ポインタを宣言できません。」
というエラーが発生するため


たしかに、そのような制限があるようですね。
マネージ型の制限事項
引用:

GC 型では、次のことができません。
・グローバルまたはローカルでのインスタンス化。new 演算子を使用してマネージ ヒープに作成する必要があります。




グローバル化に近いやり方としては…
・VB.NET側でデータ取得クラスに「Singletonパターン」を適用してもらうとか。。。
・staticなプロパティを持つGC型を作成するとか。。。例えば以下のような感じで↓

コード:
#using <mscorlib.dll>
using namespace System;

__gc class StaticObjects {
private:
	StaticObjects() {}

	static String* m_StringData;

public:
	
	__property static String* get_StringData() {

		// 初回のみインスタンスが生成される
		if (!m_StringData) {
			m_StringData = new String("abc");
		}

		return m_StringData;
	}
};

void main()
{
	String* s1 = StaticObjects::StringData;
	String* s2 = StaticObjects::StringData;

	// s1とs2は同一インスタンス(s1 == s2)
}



まあ、どういう方法が良いか分かりませんが、やり方はいろいろあると思います。
#クラスのメンバー変数なんて、半分グローバル変数のようなものですし…

引用:

じゃんぬねっとさんの書き込み (2006-01-19 11:06) より:
コネクション ブーリングなどを検索してみてください。



「コネクション ブーリング」ですか…
「コネクション プーリング」じゃなくて??
mony
会議室デビュー日: 2003/06/11
投稿数: 2
投稿日時: 2006-01-19 14:04
できました!!
マネージ型の制限事項はやっかいですね・・・覚えておきます。
ありがとうございました!
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-19 14:50
引用:

Tdnr_Symさんの書き込み (2006-01-19 12:58) より:

「コネクション ブーリング」ですか…
「コネクション プーリング」じゃなくて??


すいません、そうです、Bool してどうする... orz
プールするんだろ... orz

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

スキルアップ/キャリアアップ(JOB@IT)