这里是通过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;
}
}