我上课:
#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类的正确架构是什么?
答案 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
}