如何使用 SOCI 正确声明空行集

How to declare an empty rowset properly with SOCI?

本文关键字:声明 何使用 SOCI      更新时间:2023-10-16

>想象一下我有以下函数。如果参数无效或异常,函数必须以空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可以捕获它。这将具有许多优点:

  • 调用方将知道表中是否真的没有数据或没有表
  • 呼叫者可以知道为什么他不能使用该表(拼写错误或安全原因)
  • 呼叫者
  • 可以知道是否有其他问题并采取行动,如果没有,则重新抛出它,以便他的呼叫者可以。