如何使用 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;
}
我上面写的解决方案有效,但我的问题是:是否有更好的方法来 return 带有 SOCI 的空行集?
由于文档对此提供的内容不多,我查看了行集 Header:它没有默认构造函数,也没有 public 方法来设置迭代器,因此您可以'自己弄一个空的rowset。
尽管您为什么不使用非常适合这种情况的异常。只要不捕获 soci_error 异常,调用者 SelectAllFromTable
就可以捕获它。这会有很多好处:
- 调用者会知道table中是真的没有数据还是没有table
- 来电者可以知道为什么他不能使用table(拼写错误或安全原因)
- 调用者可以知道是否还有其他问题并采取措施,如果没有,则重新抛出,因此他的调用者可能可以。
假设我有以下功能。在无效参数或异常的情况下,该函数必须以空 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;
}
我上面写的解决方案有效,但我的问题是:是否有更好的方法来 return 带有 SOCI 的空行集?
由于文档对此提供的内容不多,我查看了行集 Header:它没有默认构造函数,也没有 public 方法来设置迭代器,因此您可以'自己弄一个空的rowset。
尽管您为什么不使用非常适合这种情况的异常。只要不捕获 soci_error 异常,调用者 SelectAllFromTable
就可以捕获它。这会有很多好处:
- 调用者会知道table中是真的没有数据还是没有table
- 来电者可以知道为什么他不能使用table(拼写错误或安全原因)
- 调用者可以知道是否还有其他问题并采取措施,如果没有,则重新抛出,因此他的调用者可能可以。