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(),要么使用指向 aSession而不是成员的指针,然后在构造函数内部的堆上分配它。就像是:

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同时使用多个对象会发生什么?注册/注销会导致问题;像上面那样做 init 不会。
于 2011-11-03T18:50:35.863 回答
0

它看起来像registerConnector一个免费的功能。要调用初始化列表中的其他函数,可以使用逗号运算符:

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

内置逗号运算符计算两个表达式并返回第二个表达式的结果。

或者,您可以创建一个处理该类的自定义类registerConnector(),并将其放置在之前的类中,ses以便它的构造将在ses.

于 2011-11-03T18:50:14.677 回答