template T fetch_result_long_internal_(MYSQL_STMT* stmt, const std::string& sql) { T result; my_bool is_null; MYSQL_BIND result_bind[1] = { make_bind(result, &is_null) }; if(mysql_stmt_bind_result(stmt, result_bind) != 0) throw sql_error(mysql_stmt_error(stmt), sql); BOOST_SCOPE_EXIT(&stmt) { mysql_stmt_free_result(stmt); } ; int res = mysql_stmt_fetch(stmt); if(res == MYSQL_NO_DATA) throw sql_error("no data returned", sql); if(is_null) throw sql_error("null value returned", sql); if(res != 0) throw sql_error(mysql_stmt_error(stmt), sql); return result; } template<> int fetch_result(MYSQL_STMT* stmt, const std::string& sql) { return fetch_result_long_internal_(stmt, sql); } template<> unsigned int fetch_result(MYSQL_STMT* stmt, const std::string& sql) { return fetch_result_long_internal_(stmt, sql); }