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

时间:2015-04-20 06:44:37

标签: c++ 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返回空行集?

1 个答案:

答案 0 :(得分:1)

由于文档没有多少提供给我,所以我查看了行集Header:它没有默认的构造函数,也没有设置迭代器的公共方法,因此你不能得到一个空行集你自己。

尽管为什么不使用对这种情况来说非常完美的例外情况。只是没有捕获soci_error异常,然后调用者SelectAllFromTable可以捕获它。这将有许多优点:

  • 调用者会知道表中是否确实没有数据,或者没有表
  • 来电者可以知道为什么他不能使用该表(拼写错误或安全原因)
  • 来电者可以知道是否有其他问题并采取行动,如果没有,请重新抛出,这样他的来电者就可以。