2011-02-07 15 views
0

データアクセス用にODBCを使用するレガシーC++アプリケーション用に開発しています。 C#の背景から来て、私は本当にデータアクセスのADOスタイルが欠けています。C++関数からフレキシブルなデータ型を返す

私は実際にはADOを使用することができないため、データアクセスの苦労を軽減するためにラッパーを作成しています。つまり、配列はcharであり、手動テキストBLOBストリーミングはありません。また、宣言的な列バインディングもありません。

私はデータ値を保存/返す方法に苦労しています。 C#では少なくとも、objectを宣言して、その型を(変換可能な限り)キャストしてください。

私の現在のC++の解決策は、を使用して、カスタムのDataColumnValueオブジェクトにデータ値を格納することです。このクラスには、アプリケーションで使用されているさまざまなタイプ(10以上)の変換と代入演算子があります。あなたがintboost::anyに保存し、boost::any_cast<long>を試してみると、boost::bad_any_castとなるため、ここでは少し複雑です。クライアントオブジェクトは、値が内部的にどのように格納されるかを知る必要はありません。

誰かが、その型が実行時にのみ知られている値を格納/返却しようとする経験がありますか?より良い/よりクリーンな方法がありますか?

+3

これは、SOで尋ねるとうまくいくようです。 –

+0

理由を説明していただけますか?関連する質問をプログラミングしていない場合、このサイトはどうですか? –

+0

@ Gavin:このサイトはプログラミングに関する主観的な質問です。 [FAQ](http://programmers.stackexchange.com/faq)の質問セクションを参照してください。 SOへの移行中に閉じる –

答えて

1

私は、C++といくつかのSQL Serverデータベースとのインタフェースのために、一部の一度限りのプロジェクトでOTL(http://otl.sourceforge.net/)を使用しました。ストリームベースなので、タイプ変換ができます。クエリの順序で値をunstreamする必要があったので、ストリームのパラダイムがちょっと混乱しているのを見つけました。名前付き値をレコードストリームから抜き出す方法は決して決してありませんでした。

しかし、それは完璧に動作しませんでした。


Boost.Anyに関しては、COMバリアントをC++ユニオンとしてコピーする前に、同様の構造を実装しました。 Boost.Variant/Anyでは、しようとしている特定のデータ型変換をサポートするために、追加のテンプレート特殊化を追加する必要があります(longはintではありません)。私は、型の数のスケーラビリティを除いて、あなたのアプローチに特別な欠点はありません。

+0

OTLは興味深いようですが、データベースAPIが公開されている限り、私は捕まえられています。私は、データを渡すC++のアプローチにもっと興味があります。 – GavinH

関連する問題