C++ 字符串析构函数中的读取访问冲突
字符串析构函数如何可能引发异常? 它在变量C++ 字符串析构函数中的读取访问冲突,c++,oracle,exception,occi,C++,Oracle,Exception,Occi,字符串析构函数如何可能引发异常? 它在变量s的try块末尾抛出 Environment *env = Environment::createEnvironment(Environment::DEFAULT); Connection *con; con = env->createConnection(Config::login, Config::password, Config::connection_string); string sqlStmt = "SELECT user FROM
s
的try块末尾抛出
Environment *env = Environment::createEnvironment(Environment::DEFAULT);
Connection *con;
con = env->createConnection(Config::login, Config::password, Config::connection_string);
string sqlStmt = "SELECT user FROM dual";
auto stmt = con->createStatement(sqlStmt);
ResultSet *rset = stmt->executeQuery();
try {
rset->next();
string s = rset->getString(1);
cout << "user: " << s << endl;
} // exception thrown here
Environment*env=Environment::createEnvironment(Environment::DEFAULT);
连接*con;
con=env->createConnection(配置::登录,配置::密码,配置::连接\u字符串);
字符串sqlStmt=“从双用户中选择用户”;
自动stmt=con->createStatement(sqlStmt);
结果集*rset=stmt->executeQuery();
试一试{
rset->next();
字符串s=rset->getString(1);
cout问题在于不同版本的CRT库。应用程序和Oracle的CRT库版本必须匹配。看起来不像是std::string异常
赤裸裸的rset->next()是不明智的。在进行任何操作之前,都应该检查rset,更重要的是,如果(rset->next()){..您的代码..}是保护您免受自己伤害的常用操作方式,则应检查rset
只要检查一下:
if (rset->next() == Status::DATA_AVAILABLE) {
auto s = rset->getString(1);
}
这是一个空指针。正如s
是auto
一样,我们只能猜测它是什么类型。你怎么知道它是一个字符串而不是指向临时缓冲区的指针呢?这种赤裸裸的rset->next()
是不明智的。rset
应该先检查一下,更重要的是,if(rset->next()){..你的代码..}
是一种保护你免受自己伤害的股票操作方式。与此无关,如果你使用的是mysql标签,那么这是值得的(我假设是)@RichardCritten为了清楚起见,我已经将自动
更改为std::string
。测试了它,它做了同样的事情。@WhozCraig为了问这个问题,我简化了代码。我检查rset
在生产中是否良好。