1

Poco :: Database :: ODBCを使用して、データベース用のラッパーを作成しています

通常のコードは次のようになっています:

Poco::Data::ODBC::Connector::registerConnector();
Session ses("ODBC", "DSN=mytest;Uid=mytest;Pwd=mytest");
bool bConnected = ses.isConnected();
Statement select(ses);
select << "SELECT firstname FROM Patients", range(0, 10);
RecordSet rs(select);
while (!select.done())
{
    select.execute();
    bool more = rs.moveFirst();
    while (more)
    {
        for (std::size_t col = 0; col < rs.columnCount(); ++col)
        {
            std::cout << rs[col].convert<std::string>() << " ";
        }
        std::cout << std::endl;
        more = rs.moveNext();
    }
}

Poco::Data::ODBC::Connector::unregisterConnector();

これは問題なく機能します。

今私のクラスのために

class database{
     Session ses; //Since this is needed all for all the queries.
   public:
     database():ses("ODBC", "DSN=name;uid=user;pwd=pass"){
     }
};//end class

Poco::Data::ODBC::Connector::registerConnector()の初期化呼び出しの前に呼び出す方法ses

私は試した

database():Poco::Data::ODBC::Connector::registerConnector(),ses("ODBC", "DSN=name;uid=user;pwd=pass"){
}

しかし、これは機能しません。エラーが発生します

'registerConnector' : is not a member of 'Poco::Data::ODBC::Connector'

どうすればいいですか?

4

3 に答える 3

3

の外側database::database()で行うか、メンバーの代わりにポインターを使用してSession、コンストラクター内のヒープに割り当てます。何かのようなもの:

database::database()
{
    Poco::Data::ODBC::Connector::registerConnector();
    ses = new Session("ODBC", "DSN=name;uid=user;pwd=pass");
}

database::~database()
{
    delete ses;
}
于 2011-11-03T18:49:32.253 に答える
1

この種の機能を直接有効にするには、registerConnector関数の周りに RAII スタイルのラッパー オブジェクトを記述します。

class wrapper {
public:
    wrapper() {
        Poco::Data::ODBC::Connector::registerConnector();
    }
    ~wrapper() {
        Poco::Data::ODBC::Connector::unregisterConnector();
    }
}

したがって、次のことができます。

class database{
     Wrapper wrap;
     Session ses; //Since this is needed all for all the queries.
   public:
     database() : wrap(), ses("ODBC", "DSN=name;uid=user;pwd=pass"){
     }
};

ただし、これは良い設計ではないと思います。それは未回答の質問を残します:

  1. ラッパーでデータベースサブシステムを初期化するのはなぜですか? databaseプログラムの初期化ルーチンの一部として行うべきでしょうか?
  2. 複数のdatabaseオブジェクトが同時に使用されるとどうなりますか? 登録/登録解除は問題を引き起こします。上記のように初期化を行うと、そうはなりません。
于 2011-11-03T18:50:35.863 に答える
0

registerConnector無料の機能のようです。初期化リスト内の他の関数を呼び出すには、コンマ演算子を使用できます。

 database()
    : ses(
        ( Poco::Data::ODBC::Connector::registerConnector(), "ODBC" )
        , "DSN=name;uid=user;pwd=pass"
      )
 {...}

組み込みのコンマ演算子は 2 つの式を評価し、2 番目の式の結果を返します。

または、クラスを処理するカスタム クラスを作成し、registerConnector()それをクラスの前にses配置して、その構築が の構築よりも前に行われるようにすることもできますses

于 2011-11-03T18:50:14.677 に答える