mysql cppconn读写blob类型数据

这里是通过c++在MySQL中读写blob类型数据的一个例子,这里blob用std::string展示,实际可能是其他类型。

//DBPool是一个单例的MySQL连接池
#define SmartConn(conn) std::unique_ptr<sql::Connection, std::function<void(sql::Connection*)>> conn(DBPool::GetInstance().GetConnection(), std::bind(&DBPool::ReleaseConnection, &DBPool::GetInstance(), std::placeholders::_1))

void setvalue(int id, const std::string &blob)
{
	try
	{
		SmartConn(conn);
		conn->setSchema("test");
		sql::PreparedStatement *pstmt = conn->prepareStatement("insert into post(id,data) values(?,?);");
		pstmt->setInt(1, id);
		//注意这里一定不要加大括号, 在executeUpdate之前, stream与buf必须有效!!!
		//{
			std::stringbuf buf(blob, std::ios_base::in);
			std::istream stream(&buf);
			pstmt->setBlob(2, &stream);
		//}
		pstmt->executeUpdate();
		delete pstmt;
	}
	catch(sql::SQLException &e)
	{
		cout << "# ERR: SQLException in " << __FILE__ << ":" << __LINE__ << endl;
		cout << "# ERR: " << e.what() << " (MySQL error code: " << e.getErrorCode();
		cout << ", SQLState: " << e.getSQLState() << ")" << endl;
	}
}

void getvalue(int id, std::string &blob)
{
	try
	{
		SmartConn(conn);
		conn->setSchema("test");
		sql::PreparedStatement *pstmt = conn->prepareStatement("select data from post where id=?;");
		pstmt->setInt(1, id);
		std::unique_ptr<sql::ResultSet> res(pstmt->executeQuery());
		while(res->next())
		{
			std::unique_ptr<std::istream> is(res->getBlob("data"));
			is->seekg(0, is->end);
			int len = is->tellg();
			is->seekg(0, is->beg);
			if(len > 0)
			{
				blob.resize(len);
				is->read(&blob[0], len);
			}
			else
			{
				blob.clear();
			}
		}
	}
	catch(sql::SQLException &e)
	{
		cout << "# ERR: SQLException in " << __FILE__ << ":" << __LINE__ << endl;
		cout << "# ERR: " << e.what() << " (MySQL error code: " << e.getErrorCode();
		cout << ", SQLState: " << e.getSQLState() << ")" << endl;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值