如何使用 SOCI 正确声明空行集
How to declare an empty rowset properly with SOCI?
>想象一下我有以下函数。如果参数无效或异常,函数必须以空rowset
退出。
rowset<row> SelectAllFromTable(string tableName)
{
session sql(odbc, "...");
// if parameters are not valid -> return empty rowset<row>
if (tableName == "")
{
// query that returns 0 result
rowset<row> res = (sql.prepare << "SELECT ID FROM T1 WHERE ID = -9999");
return res;
}
string query = "SELECT * FROM " + tableName;
try
{
rowset<row> rs = sql.prepare << query;
return rs;
}
catch (exception const &e)
{
cerr << "Error: " << e.what() << endl;
// query that returns 0 result
rowset<row> res = (sql.prepare << "SELECT ID FROM T1 WHERE ID = -9999");
return res;
}
// query that returns 0 result
rowset<row> res = (sql.prepare << "SELECT ID FROM T1 WHERE ID = -9999");
return res;
}
我上面写的解决方案有效,但我的问题是:有没有更好的方法可以使用 SOCI 返回空行集?
由于文档对此没有太多贡献,我研究了行集标头: 它没有默认的构造函数,也没有设置迭代器的公共方法,因此您无法自己获取空行集。
尽管您为什么不使用非常适合这种情况的例外。只是不要捕获soci_error异常,那么调用方SelectAllFromTable
可以捕获它。这将具有许多优点:
- 调用方将知道表中是否真的没有数据或没有表
- 呼叫者可以知道为什么他不能使用该表(拼写错误或安全原因) 呼叫者
- 可以知道是否有其他问题并采取行动,如果没有,则重新抛出它,以便他的呼叫者可以。
相关文章:
- 标准::向量声明中使用的模板参数
- 在变量声明中使用 for 循环
- 在"template"和函数声明之间使用:template<typename trait> using tr = base_trait<trait> void fn(tr::t
- 在以下声明中使用指针有什么区别?
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- 'this'指针是否可以在 c++ 标头声明中使用?
- 在 extern 中声明一个使用向量的函数 "C" {}
- 为什么我们在这个函数声明中使用 const 和 & ?
- 如何在 for 循环中声明和使用结构数组?
- C++ 11 通过在类声明中使用指针来节省内存
- 书籍示例在类声明中使用"explicit"关键字。无效吗?
- 为什么我不能在类中另一个函数的声明中使用静态 constexpr 的结果?
- 我的Qt程序可以编译,但是当我在声明中使用ifstream时崩溃
- 是否可以避免在前向声明中使用嵌套命名空间?
- 为什么我们不能在声明之前使用预处理器 #define 常量
- 是否可以将“自动”关键字用作函数指针声明中使用初始化的返回类型
- MSVC:无法识别的模板声明/定义(使用 Clang/GCC 编译)
- 新声明在使用delete时包含垃圾值和堆损坏
- 如何处理"警告:在参数声明中使用'auto'仅适用于 -fconcepts"
- 声明并使用静态列表来打印对象(在c++中)