postgresql错误

tzg_dzq 2010-01-24 02:11:54
我是用boost C++访问postgresql数据库的,
执行:select "posNo" from freeterminal where "id"='101'
出现错误如下:
Error executing query . Attempt to activate transaction<READ COMMITTED> 'newTransaction' which is already closed

这是为什么?

请各位指点。

...全文
441 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tzg_dzq 2010-02-24
  • 打赏
  • 举报
回复
以上问题我已用其他方法解决,方法如下:
DataAccessObj::DataAccessObj() {
std::cout<<"DataAccessObj::DataAccessObj()..."<<std::endl;
this->init();
}

DataAccessObj::~DataAccessObj() {
std::cout<<"DataAccessObj::~DataAccessObj()...begin"<<std::endl;
if(this->m_WorkObj != 0) {
std::cout<<"if(this->m_WorkObj != 0)..."<<std::endl;
std::cout<<"before delete pointer \"m_WorkObj\" address:"<<m_WorkObj<<std::endl;
delete this->m_WorkObj;
this->m_WorkObj = 0;
std::cout<<"after delete pointer \"m_WorkObj\" address:"<< m_WorkObj <<std::endl;
}
if(this->m_ConnObj->is_open()) {
std::cout<<"if(this->m_ConnObj->is_open())..."<<std::endl;
std::cout<<"closing connection --- begin!"<<std::endl;
try{
std::cout<<"before delete pointer \"m_ConnObj\" address:"<< m_ConnObj <<std::endl;
this->m_ConnObj->disconnect();
delete this->m_ConnObj;
this->m_ConnObj = 0;
std::cout<<"after delete pointer \"m_ConnObj\" address:"<< m_ConnObj <<std::endl;
}catch(std::exception &e){
std::cout<<"Exception for close connection!"<<e.what()<<std::endl;
throw;
}
std::cout<<"closing connection --- end!"<<std::endl;
}
if(this->m_ConnObj != 0) {
std::cout<<"if(this->m_ConnObj != 0)"<<std::endl;
std::cout<<"before delete pointer \"m_ConnObj\" address:"<< m_ConnObj <<std::endl;
delete this->m_ConnObj;
this->m_ConnObj=0;
std::cout<<"after delete pointer \"m_ConnObj\" address:"<< m_ConnObj <<std::endl;
}

std::cout<<"DataAccessObj::~DataAccessObj()...end"<<std::endl;
}

void DataAccessObj::init() {
std::cout<<"DataAccessObj::init()..."<<std::endl;
this->m_ConnObj = 0;
this->m_WorkObj = 0;
std::cout<<"init pointer \"m_ConnObj\" address:"<< m_ConnObj <<std::endl;
std::cout<<"init pointer \"m_WorkObj\" address:"<< m_WorkObj <<std::endl;
}

void DataAccessObj::connDb(void) {
std::cout<<"DataAccessObj::connDb()...!"<<std::endl;
std::string connStr="hostaddr=127.0.0.1 dbname=logistics user=postgres password=postgres port=5432";
if(this->m_ConnObj == 0) {
std::cout<<"database connection is closed!"<<std::endl;
try{
this->m_ConnObj = new pqxx::connection(connStr);
}catch(std::exception &e){
std::cout<<"Exception for connection database!"<<e.what()<<std::endl;
throw;
}
}else { //end if(!this->m_ConnObj->is_open())
std::cout<<"database connection is opened!"<<std::endl;
}
std::cout<<"connDb pointer \"m_ConnObj\" address:"<< m_ConnObj <<std::endl;
}

void DataAccessObj::activeWork(void) {
std::cout<<"DataAccessObj::getWork()..."<<std::endl;
if(this->m_WorkObj == 0)
try{
this->m_WorkObj = new pqxx::work(*this->m_ConnObj,"NewWork");
}catch(std::exception &e){
std::cout<<"Exception for work!"<<e.what()<<std::endl;
throw;
}
std::cout<<"activeWork pointer \"m_WorkObj\" address:"<< m_WorkObj <<std::endl;
}

pqxx::result const DataAccessObj::doWork(std::string const &sqlStr) {
std::cout<<"DataAccessObj::doWork()..."<<std::endl;
try{
this->m_resultSql = this->m_WorkObj->exec(sqlStr);
}catch(std::exception &e){
//this->activeWork();
std::cout<<"Exception for doWork!"<<e.what()<<std::endl;
throw;
}
return this->m_resultSql;
}

pqxx::work * DataAccessObj::getWork() const {
std::cout<<"DataAccessObj::getWork()..."<<std::endl;
return this->m_WorkObj;
}

pqxx::result const DataAccessObj::getResult() const {
std::cout<<"DataAccessObj::getResult()..."<<std::endl;
return this->m_resultSql;
}

void DataAccessObj::closeConn(void) {
std::cout<<"DataAccessObj::closeConn()..."<<std::endl;
if(this->m_ConnObj->is_open()) {
try{
std::cout<<"before closeConn pointer \"m_ConnObj\" address:"<< m_ConnObj <<std::endl;
this->m_ConnObj->disconnect();
delete this->m_ConnObj;
this->m_ConnObj=0;
}catch(std::exception &e){
std::cout<<"Exception for close connection!"<<e.what()<<std::endl;
throw;
}
std::cout<<"after closeConn pointer \"m_ConnObj\" address:"<< m_ConnObj <<std::endl;
}
}

pqxx::connection * DataAccessObj::getConn() const {
std::cout<<"DataAccessObj::getConn()..."<<std::endl;
return this->m_ConnObj;
}

void DataAccessObj::workCommit(void) {
std::cout<<"begin to commit work..."<<std::endl;
try{
this->m_WorkObj->commit();
}catch(std::exception &e){
//this->activeWork();
std::cout<<"Exeception for commit work!"<<e.what()<<std::endl;
throw;
}
std::cout<<"success for commit work!"<<std::endl;
}

-----------------------
以上方法可以保证内存不泄漏,连接的断开。
tzg_dzq 2010-01-26
  • 打赏
  • 举报
回复
DataAccessObject 类是自己定义的。
DataAccessObject::DataAccessObject(const std::string &loginInf) {
try {
ConnM = new pqxx::connection(loginInf);
WorkV = new pqxx::work(*ConnM, "newTransaction");
} catch (std::exception &e) {
std::cout << "Exception DataAccessObject: " << e.what() << std::endl;
throw;
}
}
DataAccessObject::~DataAccessObject() {
// //if(ConnM != NULL) //dzq添加
// //{
// delete ConnM;
// ConnM=NULL;
// std::cout<<"~DataAccessObject delete pqxx::connection."<<std::endl;
// //}
// //if(WorkV != NULL) //dzq添加
// //{
// delete WorkV;
// WorkV=NULL;
// std::cout<<"~DataAccessObject delete pqxx::work."<<std::endl;
// //}
delete WorkV;
delete ConnM;
}

pqxx::result DataAccessObject::doQuery(const std::string &sqlStr) {
pqxx::result rst;
try {
if (!ConnM->is_open()) {
ConnM->activate();
}
rst = WorkV->exec(sqlStr);
} catch (std::exception &e) {
delete WorkV;
//WorkV =NULL; //dzq
WorkV = new pqxx::work(*ConnM, "newTransaction");
std::cout << "Exception doQuery: " << e.what() << std::endl;
throw;
}
return rst;
}
bool DataAccessObject::doUpdate(const std::string &sqlStr) {
try {
if (!ConnM->is_open()) {
ConnM->activate();
}
WorkV->exec(sqlStr);
WorkV->commit();

delete WorkV;
WorkV = new pqxx::work(*ConnM, "newTransaction");
} catch (std::exception &e) {
delete WorkV;
WorkV = new pqxx::work(*ConnM, "newTransaction");
std::cout << "Exception doUpdate: " << e.what() << std::endl;
throw;
return false;
}
return true;
}
void DataAccessObject::doClose() {
try {
//if(ConnM != NULL) { //dzq
ConnM->disconnect();
//}
} catch(std::exception &e) {
std::cout<<"exception:DataAccessObject::doClose ,"<<e.what()<<std::endl;
}
std::cout<<"Success:DataAccessObject::doClose "<<std::endl;
return;
}

void DataAccessObject::restart(){

delete WorkV;
WorkV=new pqxx::work(*ConnM, "newTransaction");
return ;
}
DataAccessObject * const Conn() {
static DataAccessObject* result = 0;
if (!result) {
std::string
host ="hostaddr=127.0.0.1 dbname=logistics user=postgres password=postgres port=5432";
result = new DataAccessObject(host);
}
return result;
}
pqxx::work* DataAccessObject::getTransaction(){
return WorkV;
}
执行语句如下:
std::string sqlStr = "select \"company\" from company where \"id\"='12'";

pqxx::result resultOp =Conn()->getTransaction()->exec(sqlStr) ;

执行以上语句时可能出现如下错误:
Error executing query . Attempt to activate transaction <READ COMMITTED> 'newTransaction' which is already closed
为什么呢?

在应用程序中我改如何实现事务的回滚呢(当操作多张表时其中有些出错,此时就因该取消以前所有的操作)?

请各位高手露一手吧!!!
tzg_dzq 2010-01-25
  • 打赏
  • 举报
回复
各位:
我现在的情况:
系统:ubuntu9.04
开发语言:boost_1_39_0 c++
数据库:postgresql
访问数据库包:libpqxx-3.0.2


有谁能给我提供以下的帮助:
1、如何访问数据库?(最好有原代码)
2、如何执行事务回滚?(在应用程序中,当操作多张表时其中有些出错,此时就因该取消以前所有的操作)
3、出现此错误的原因及解决办法:Error executing query . Attempt to activate transaction<READ COMMITTED> 'newTransaction' which is already closed


cattycat 2010-01-24
  • 打赏
  • 举报
回复
sql语句错了,改一下就行了。 postNo没有冒号。
它那个错误说你想执行什么事务之类的,你先改一下查询语句看还有这个错误码。
周药师 2010-01-24
  • 打赏
  • 举报
回复
一则 你sql 语句本省就有问题

string sql = "select posNo from freeterminal where id='101' "

二则看错误提示 是你执行sql 语句的东东出问题了
要贴代码出来

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧