我正在使用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'
我应该怎么做?
答案 0 :(得分: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;
}
答案 1 :(得分: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"){
}
};
然而,我不认为这是一个好的设计;它留下了悬而未决的问题:
database
包装器中初始化数据库子系统?也许它应该作为程序的init例程的一部分来完成?database
个对象会怎样?注册/取消注册会导致问题;按上述方式执行init不会。答案 2 :(得分:0)
看起来registerConnector
是一个免费功能。要调用初始化列表中的其他函数,可以使用逗号运算符:
database()
: ses(
( Poco::Data::ODBC::Connector::registerConnector(), "ODBC" )
, "DSN=name;uid=user;pwd=pass"
)
{...}
内置逗号运算符计算两个表达式并返回第二个表达式的结果。
或者,您可以创建一个处理registerConnector()
类的自定义类,并将其放在ses
之前的类中,以便它的构造将在ses
之前发生。