时间:2019-07-12 11:27:49

标签: c++ ocilib

我上课:

#include "ocilib.hpp"
#include <string>

using namespace ocilib;

class Dao
{
public:

    Dao(std::string sqlQuery);

private:

    ocilib::Resultset rs;

};

和构造函数的实现:

Dao::Dao(std::string sql_query)
{
    Environment::Initialize();
    Connection con("tra", "la", "la");
    Statement st(con);
    st.Execute(sql_query);

    rs = st.GetResultset();
}

但是VS2019说: 对于“ ocilib :: Resultset”类,没有默认的构造函数。

我想将结果集对象存储为我的DAO类的变量,并在构造函数中感觉到它。但是看起来这样做不是一种选择。

使用ocilib创建DAO类的正确架构是什么?

2 个答案:

答案 0 :(得分:0)

在程序的其他位置,您尝试调用Doa的默认构造函数,但是当您实现自己的构造函数时,Doa类中将没有默认构造函数。

第一个解决方案是使用以下方法实现默认构造函数:

var string = 'https://example.com/here-comes-a-path/#!/notification-14';

console.log(string.match(/(?<notification_ID>\d+)/g))

drawableStart

如果您必须在Doa()=default; 中做一些特别的事情。

第二种解决方案是找到您试图调用默认构造函数的位置。一个地方可能看起来像这样:

Doa() {}

或更隐蔽的是:

{}

答案 1 :(得分:0)

  

使用ocilib创建DAO类的正确架构是什么?

好的架构是一个比较广泛的话题,但是我将尝试为初学者提供三个建议。

Connection似乎对后续的多个访问请求很有用,因此,这可能就是您要作为成员构造并存储在DAO类中的东西。想一想如何将用户名和密码传递到您的数据访问对象。如果根本不需要安全性,那么它们不能只是字符串文字“ la”。

只有执行的“选择” Statement会与Resultset一起产生,因此在每次访问时都假设它,因此在构造函数中使用它会感到错误。将Resultset作为执行这种选择语句的DAO类的访问方法的返回值。

然后还要考虑您的try块在哪里,因为OCILIB C ++ API中的所有内容都可能(并且最终会)抛出。所有examples似乎都有这些。

try { 
    // ... ocilib calling code here
}  catch(const ocilib::Exception& e) {
    // ... handling the failures
}