OCCI错误之ORA-01017: invalid username/password; logon denied
occi基本东西我就不讲了,怎么包含头文件啊,加载库文件之类的,网上有很多方法,不在此啰嗦。
这里主要记载一下我遇到的连接不上的错误情况。错误原因见标题:
代码如下:
occiAdapter.h
1 #ifndef _OCCI_H_ 2 #define _OCCI_H_ 3 4 #include <iostream> 5 #include "occi.h" 6 #include "boost/shared_ptr.hpp" 7 using namespace oracle::occi; 8 using namespace std; 9 typedef struct database_con 10 { 11 string db_name; 12 string db_username; 13 string db_passwd; 14 15 }TDBCON; 16 17 18 class occiAdapter 19 { 20 public: 21 occiAdapter(); 22 ~occiAdapter(); 23 public: 24 bool create_connet(Environment::Mode mode = Environment::THREADED_MUTEXED); 25 bool create_connet(const char * db_name,const char * db_username,const char *db_passwd,Environment::Mode mode = Environment::THREADED_MUTEXED); 26 void disConnect(); 27 static void set_db_info(string db_name,string username,string db_passwd); 28 Connection * get_connect(); 29 30 bool close_connect(); 31 32 Statement * create_statment(const char * sql_ptr); 33 bool close_statement(Statement* statement); 34 void commit(); 35 void rollback(); 36 37 private: 38 static TDBCON m_db_config; 39 static Environment* m_env; 40 41 Connection * m_connect; 42 43 char m_error_msg[1024]; 44 45 }; 46 47 48 #endif
occiAdapter.cpp
#include "stdafx.h" #include "occiAdapter.h" #pragma comment(lib,"D:\\app\\Administrator\\product\\11.2.0\\dbhome_1\\OCI\\lib\\MSVC\\vc9\\oraocci11.lib") TDBCON occiAdapter::m_db_config; Environment* occiAdapter::m_env = NULL; occiAdapter::occiAdapter() { m_env = NULL; m_connect = NULL; m_error_msg[0] = 0; } occiAdapter::~occiAdapter() { this->close_connect(); m_connect = NULL; } Connection * occiAdapter::get_connect() { return m_connect; } bool occiAdapter::close_connect() { try { //如果使用数据库连接池,将获取的连接还给连接池 if (m_connect != NULL && m_env != NULL) { m_env->terminateConnection(m_connect); } m_connect = NULL; } catch (SQLException &ex) { memset(m_error_msg, 0, sizeof(m_error_msg)); sprintf_s(m_error_msg,sizeof(m_error_msg),"DataBase Close Connection Failed. Info:[%s]",ex.what()); m_connect = NULL; return false; } catch(...) { m_connect = NULL; return false; } return true; } bool occiAdapter::create_connet(Environment::Mode mode /*= Environment::THREADED_MUTEXED*/) { try { if (m_env == NULL) { m_env = Environment::createEnvironment(mode); if (NULL == m_env) { return false; } } if (m_connect == NULL) { m_connect = m_env->createConnection(m_db_config.db_username, m_db_config.db_passwd,m_db_config.db_name); if (NULL == m_connect) { return false; } cout<<"success connect\n"; } } catch (SQLException &ex) { memset(m_error_msg, 0, sizeof(m_error_msg)); cout<<"ex.what():"<<ex.what(); sprintf_s(m_error_msg,sizeof(m_error_msg),"DataBase Connection Failed. Info:[%s]", ex.what()); cout<<"m_error_msg:"<<m_error_msg<<endl; return false; } catch(...) { return false; } return true; } bool occiAdapter::create_connet(const char * db_name,const char * db_username,const char *db_passwd,Environment::Mode mode /*= Environment::THREADED_MUTEXED*/) { try { if (m_env == NULL) { m_env = Environment::createEnvironment(mode); if (NULL == m_env) { return false; } } if (m_connect == NULL) { m_connect = m_env->createConnection(db_username, db_passwd,db_name); if (NULL == m_connect) { return false; } //cout<<"connect success\n"; } } catch (SQLException &ex) { memset(m_error_msg, 0, sizeof(m_error_msg)); sprintf_s(m_error_msg,sizeof(m_error_msg),"DataBase Connection Failed. Info:[%s]", ex.what()); return false; } catch(...) { return false; } return true; return true; } void occiAdapter::commit() { try { if (m_connect) { m_connect->commit(); } } catch (SQLException &ex) { memset(m_error_msg, 0, sizeof(m_error_msg)); sprintf_s(m_error_msg,sizeof(m_error_msg), \ "DataBase RollBack Failed. Info:[%s]", ex.what()); } catch(...) { return ; } } Statement * occiAdapter::create_statment(const char * sql_ptr) { if (m_connect == NULL) { return NULL; } try { if (sql_ptr != NULL) { return m_connect->createStatement(sql_ptr); } else { return m_connect->createStatement(); } } catch (SQLException &ex) { memset(m_error_msg, 0, sizeof(m_error_msg)); sprintf_s(m_error_msg, sizeof(m_error_msg),\ "DataBase Create Statement Failed. Info:[%s]", ex.what()); return NULL; } catch(...) { return NULL; } } void occiAdapter::set_db_info(string _db_name,string _username,string _db_passwd) { occiAdapter::m_db_config.db_name = _db_name; occiAdapter::m_db_config.db_username = _username; occiAdapter::m_db_config.db_passwd = _db_passwd; } void occiAdapter::rollback() { try { if (m_connect) { m_connect->rollback(); } } catch (SQLException &ex) { memset(m_error_msg, 0, sizeof(m_error_msg)); sprintf_s(m_error_msg, sizeof(m_error_msg),\ "DataBase RollBack Failed. Info:[%s]", ex.what()); } catch(...) { return ; } } bool occiAdapter::close_statement(Statement* statement) { if (statement == NULL || m_connect == NULL) { return false; } try { m_connect->terminateStatement(statement); } catch (SQLException &ex) { memset(m_error_msg, 0, sizeof(m_error_msg)); sprintf_s(m_error_msg,sizeof(m_error_msg),\ "DataBase Close Statement Failed. Info:[%s]", ex.what()); return false; } catch(...) { return false; } return true; }
main.cpp
main.cpp #include "stdafx.h" #include "occiAdapter.h" int main() { occiAdapter occiObj; occiAdapter::set_db_info("127.0.0.1:1521/oracle","djs","123456789"); occiObj.create_connet(); }
编译执行:
ex.what():ORA-01017: invalid username/password; logon denied
m_error_msg:DataBase Connection Failed. Info:[ORA-01017: invalid username/passwo
rd; logon denied
]
请按任意键继续. . .
我核对了很多遍用户名和密码,没发现任何问题,然后使用sqlplus工具 以及sqlplus命令连接,都可以连上,这就纳闷儿了,用户名密码都正确啊,怎么就成标题那个错误了呢。
于是,我不使用封装,直接在main.cpp建立连接:
#include "stdafx.h" //#include "occiAdapter.h" #include <iostream> #include "occi.h" using namespace std; using namespace oracle::occi; int main() { //occiAdapter occiObj; //occiAdapter::set_db_info("127.0.0.1:1521/oracle","djs","123456789"); //occiObj.create_connet(); Environment *env = Environment::createEnvironment(Environment::THREADED_MUTEXED); Connection *con =NULL; if (env) { try { con = env->createConnection("djs","123456789","127.0.0.1:1521/oracle"); cout<<"connect success\n"; } catch (SQLException e) { cout<<e.what()<<endl; } catch (...) { cout<<"other exception\n"; } } env->terminateConnection(con); con = NULL; Environment::terminateEnvironment(env); env =NULL; return 0; }
编译执行发现报下面错误:
ORA-24960: 属性 OCI_ATTR_USERNAME 的长度大于最大允许长度 255
请按任意键继续. . .
现在开始在网上搜索,该种错误的解决办法,居然是把编译模式改成release
于是试了试,果然连接成功了。
在将代码改成封装模式,使用release编译执行,也连接成功了。
疑问:此处为什么要使用release模式,为什么封装之后报的错误与不封装报的错误不一样?
待高人解决啊!!!
posted on 2015-09-01 22:07 xiaoerbuku 阅读(297) 评论(0) 收藏 举报
浙公网安备 33010602011771号