2015-12-11 6 views
0

Я не могу заставить libpqxx работать с базовым запросом. Он всегда преувеличивает. В настоящее время я использую класс для облегчения подключения.C++ соединение с postgres всегда segfaults

//nearestLoc.h 
class databaseConnection{ 
public: 
    databaseConnection(); 
    ~databaseConnection(); 
    void SetConnection(); 
    void Disconnect(); 
    pqxx::result query(); 
    void SetCredentials(); 
    void SetSqlString(std::string queryString); 

private: 
    pqxx::connection *conn; 
    std::string strSQL; 
    std::string username; 
    std::string pass; 
    std::string host; 
}; 

//nearestLoc.cpp 
#include <cstdlib> 
#include <string> 
#include <pqxx/pqxx> 
#include <iostream> 
#include "nearestLoc.h" 

using namespace std; 
using namespace pqxx; 

void databaseConnection::SetConnection(){ 
     try{ 
      string tot = string("dbname=xxxx") + string(" user=")+username+ string(" password=")+pass+ string(" host=")+host + string(" port=9000"); 
     pqxx:connection *conn = new connection(tot); 
     } 
     catch(const std::exception &e){ 
      std:cerr << e.what() << std::endl; 
     } 
    } 

void databaseConnection::Disconnect(){ 
     conn->disconnect(); 
    } 

pqxx::result databaseConnection::query(){ 
     pqxx:work txn(*conn); 
     pqxx::result res= txn.exec(strSQL); 
     return res; 
    } 

void databaseConnection::SetCredentials(){ 
    this->username= std::getenv("PGUSER"); 
    this->pass= std::getenv("PGPASSWORD"); 
    this->host = std::getenv("PGHOST"); 
} 

void databaseConnection::SetSqlString(std::string &queryString){ 
    this->strSQL = queryString; 
} 


int main(int argc, char **argv) = 
    std::string strque = "SELECT * FROM test LIMIT 5"; 
    databaseConnection* pdatabase; 
    pdatabase->SetSqlString(strque); 
    pdatabase->SetCredentials(); 
    pdatabase->SetConnection(); 
    pqxx::result sites = pdatabase-> query(); 
    std::cout 
      <<"ID"<<"\t" 
      <<"Station_id"<<"\t" 
      <<std::endl; 
    std::cout 
      <<"The top 5 closest sites are"<<std::endl; 
    for(pqxx::result::const_iterator row = sites.begin(); row != sites.end(); ++row){ 
     std::cout 
      <<row["id"].as<int>() <<"\t" 
      <<row["station_id"].as<int>() <<"\t" 
      <<std::endl; 
    } 
    return 0; 
} 

Я просто пытаюсь получить что-то вверх и бегать, чтобы поиграть. Компилирует отлично с g ++, любые предложения?

ответ

0
databaseConnection* pdatabase; 
pdatabase->SetSqlString(strque); 

Вы объявляете неинициализированный указатель, а затем вы вызываете метод на неинициализированном указателе.

У вас возникли проблемы. Вы, вероятно, намеревались написать это:

databaseConnection* pdatabase=new databaseConnection; 
pdatabase->SetSqlString(strque); 
+0

Или лучше, не используйте указатель. Просто используйте значение. –

Смежные вопросы