使用SOCI从PostgreSQL数据库获取数据时发生错误转换
Bad cast while getting data from PostgreSQL database using SOCI
我在PostgreSQL中有一个数据库。我有sql查询(btw在PostgreSQL中工作得很好,所以sql代码没有错):
SELECT COUNT(*) as size, creation_date FROM item INNER JOIN raf_item USING (id) INNER JOIN item_detail USING (id) GROUP BY creation_date;
其中创建日期在PostgreSQL中定义为creation_date Date;
。查询返回,例如(取决于我的数据库中有什么):
size | creation_date
21 | 12-31-2012
18 | 04-03-2002
我正在使用SOCI+C++从这个查询中获取数据。我的整个C++代码:
#include <iostream>
#include <cstdlib>
#include <soci.h>
#include <string>
#include <postgresql/soci-postgresql.h>
using namespace std;
bool connectToDatabase(soci::session &sql, string databaseName, string user, string password)
{
try
{
sql.open(soci::postgresql, "dbname=" +databaseName + " user="+user + " password="+password);
}
catch (soci::postgresql_soci_error const & e)
{
cerr << "PostgreSQL error: " << e.sqlstate() << " " << e.what() << std::endl;
return false;
}
catch (std::exception const & e)
{
cerr << "Some other error: " << e.what() << std::endl;
return false;
}
return true;
}
void getDataFromDatabase(soci::session &sql)
{
soci::row r;
sql << "select count(*) as size, creation_date from item inner join raf_item using (id) inner join item_detail using (id) group by creation_date;", soci::into(r);
for(std::size_t i = 0; i != r.size(); ++i)
{
cout << r.get<int>(i);
tm when = r.get<tm>(i);
cout << asctime(&when);
}
}
int main(int argc, char **argv)
{
soci::session sql;
bool success = connectToDatabase(sql, "testdb", "testuser", "pass");
if (success)
{
cout << "Connected.n";
getDataFromDatabase(sql);
}
else
cout << "Not connected.n";
return 0;
}
但我在尝试运行应用程序时遇到了这个错误(编译很好):
在抛出"std::bad_cast"的实例后调用terminate
what():std::bad_cast中断(核心转储)
请帮忙,当编译好的时候,我真的不知道如何解决这个问题。
也许问题是creation_date是date,tm也保持时间?如果是,如何解决
虽然您确实解决了问题,但您发布的代码与其说是问题的真正解决方案,不如说是一种变通方法。
您的问题是,COUNT(*)返回bigint(或int8)类型的值,如这里所述,soci将bigint转换为long long int
类型。如果类型不完全匹配,则将引发bad_cast异常。
因此,问题中的代码应该是cout << r.get<long long>(i);
,以避免bad_cast异常。
好吧,我自己解决了!:)
以下是实际运行良好的代码(我在下面只用这个代码补充了getDataFromDatabase
):
void getDataFromDatabase(soci::session &sql)
{
long size;
string date;
soci::row r;
sql << "select count(*) as size, creation from item inner join raf_item using (id) inner join item_detail using (id) group by creation;", soci::into(r);
for(std::size_t i = 0; i != r.size(); ++i)
{
const soci::column_properties & props = r.get_properties(i);
cout << '<' << props.get_name() << '>';
switch(props.get_data_type())
{
case soci::dt_string:
cout << r.get<std::string>(i);
break;
case soci::dt_double:
cout << r.get<double>(i);
break;
case soci::dt_integer:
cout << r.get<int>(i);
break;
case soci::dt_unsigned_long:
cout << r.get<unsigned long>(i);
break;
case soci::dt_long_long:
cout << r.get<long long>(i);
size = r.get<long long>(i);
break;
case soci::dt_date:
std::tm when = r.get<std::tm>(i);
cout << asctime(&when);
date = asctime(&when);
break;
}
cout << "n" << size << "n";
cout << "n" << date << "n";
}
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- C++使用params创建线程函数会导致转换错误
- 在混合代码库中将C转换为C++时出现许多包含错误
- 为什么g++在未执行的代码处标记强制转换错误
- 错误:从"int"到枚举c++的转换无效
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- 从标准::未来<void>到非标量标准::未来<bool>引发的错误转换
- 使用宏的错误转换
- 在 opencv 中使用 Color_YUV2BGR 从 YUV 到 BGR 的错误转换
- 无法通过此操作,因为类型的错误转换
- PyQt5:使用自定义信号时 int 对象的错误转换
- 从长途错误转换
- C 错误:转换为非量表类型
- C 错误:转换为执行字符集
- 使用SOCI从PostgreSQL数据库获取数据时发生错误转换
- 分段错误C++转换问题
- 在ARM上的Qt中从双精度到QString的错误转换
- C++浮点转换为Python浮点错误转换
- 错误:转换为非标量类型