我在本地安装了instantclient11.1,它只有bin和lib.后来我按了instantsqlplus11.1我也没写tnsnames.ora,但奇怪的是我能连上远端的数据库。用sqlpuls的语句,我在上面还建表,插入数据了。
但我写了一段c++程序不行,
#include <iostream>
#include <occi.h>
#include <string>using namespace oracle::occi;
using namespace std;int main()
{
Environment * env =Environment::createEnvironment();
const string userName ="system"; //名
const string password ="8823"; //密码
const string connectString="172.16.100.101"; //远程IP地址
string mc;
{
Connection * conn =env->createConnection("system","8823","172.16.100.101");
try{
Statement * stmt =conn->createStatement("select * from test1");
ResultSet * rs =stmt->executeQuery();
while(rs->next()== true)
{
mc=rs->getString(1);
cout<<mc<<endl;
}
stmt->closeResultSet(rs);
conn->terminateStatement(stmt);
}
catch(SQLException e)
{
cout<<e.what();
}
env->terminateConnection(conn);
}
Environment::terminateEnvironment(env);
return 0;
}
错误:[root@localhost program]# ./testconn
terminate called after throwing an instance of 'oracle::occi::SQLException'
what(): ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA已放弃
请高手帮帮忙!
但我写了一段c++程序不行,
#include <iostream>
#include <occi.h>
#include <string>using namespace oracle::occi;
using namespace std;int main()
{
Environment * env =Environment::createEnvironment();
const string userName ="system"; //名
const string password ="8823"; //密码
const string connectString="172.16.100.101"; //远程IP地址
string mc;
{
Connection * conn =env->createConnection("system","8823","172.16.100.101");
try{
Statement * stmt =conn->createStatement("select * from test1");
ResultSet * rs =stmt->executeQuery();
while(rs->next()== true)
{
mc=rs->getString(1);
cout<<mc<<endl;
}
stmt->closeResultSet(rs);
conn->terminateStatement(stmt);
}
catch(SQLException e)
{
cout<<e.what();
}
env->terminateConnection(conn);
}
Environment::terminateEnvironment(env);
return 0;
}
错误:[root@localhost program]# ./testconn
terminate called after throwing an instance of 'oracle::occi::SQLException'
what(): ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA已放弃
请高手帮帮忙!
这不是很明示了吗?
listener.ora配置文件服务器名不对
using namespace std;
还用这个写法?
#include<string.h>
你是个老程序员?
你远程连接的时候的服务名是什么??
用户名:system
密码:8823
SID:OS101
所以你的程序中const string connectString='ip:port/sid'试试。
我想问下,安装即时客户端,要配置trsnames.ora和listener.ora吗?
Environment * env =Environment::createEnvironment();
const string userName ="system"; //名
const string password ="8823"; //密码
const string connectString="172.16.100.101"; //远程IP地址
string mc;
{
Connection * conn =env->createConnection("system","8823","172.16.100.101");
应该是Environment * env =Environment::createEnvironment();
const string userName ="system"; //名
const string password ="8823"; //密码
const string connectString="172.16.100.101"; //远程IP地址
string mc;
{
Connection * conn =env->createConnection(userName,password,connecString);我弧度了
Environment * env =Environment::createEnvironment();
const string userName ="system"; //名
const string password ="8823"; //密码
const string connectString="172.16.100.101:1521/OS101"; //远程IP地址
string mc;
{
Connection * conn =env->createConnection("system","8823","172.16.100.101"); 没错误了,咋没结果呢?
如果用user/pwd@sid这种本地名称解析方式连接,就需要配。
如果用user/pwd@ip:port/sid这种ezconnect方式连接,则不需要配。你表里是否有数据?用sqlplus直接登入能否查到数据?
2 ;Table created.SQL> insert into test1 values('mcm','01','man'); 1 row created.SQL> insert into test1 values('syc','02','man');1 row created.SQL> select * from test1
2 ;NAME EXPID SEX
-------------------- ---------- ----
mcm 1 man
syc 2 man
string mc;
{
Connection * conn =env->createConnection(userName,password,connectString);
try{
//Statement * stmt =conn->createStatement("select * from test1 ");
Statement * stmt =conn->createStatement("insert into test1 values('ct','03','man') ");
/* ResultSet * rs =stmt->executeQuery();
while(rs->next())
{
mc=rs->getString(1);
cout<<mc<<endl;
} */
stmt->executeUpdate();
cout<<"insert success"<<endl;
//stmt->closeResultSet(rs);
conn->terminateStatement(stmt);
}
catch(SQLException ex)
{
//cout<<e.what();
cout<<"gan xie shang di"<<endl;
cout<<ex.getMessage()<<endl;
}
env->terminateConnection(conn);
}
Environment::terminateEnvironment(env);
//system("pause");
return 0;SQL> select *from test1
2 ;NAME EXPID SEX
-------------------- ---------- ----
mcm 1 man
syc 2 man
ct 3 man
ct 3 man
还有我编辑tnsnames.ora文件,是不是在/root/.bash_profile文件,增加以下内容:
PATH=$PATH:$HOME/bin:/usr/lib/oracle/11.1/client/lib
LD_LIBRARY_PATH=$ LD_LIBRARY:/usr/lib/oracle/11.1/client/lib
SQLPATH=/usr/lib/oracle
TNS_ADMIN=/usr/lib/oracle
export PATH LD_LIBRARY_PATH SQLPATH TNS_ADMIN
unset USERNAME
就是传说中的环境变量.
太感谢了。
没递交的化,那我怎么能在数据库里面查到呢?
插入以后是对数据库中的数据进行了修改,这时一定要commit一下,才能把你的数据写入数据库!
光执行sql是达不到的!
你只要在你的语句后面写上commit;就可以了!还有就是每次要是修改了表的内容都需要进行提交的!删除数据的时候就不用了!
是不是就是这样啊!insert into test1 values('ct','03','man') commit;
如果commit了,rollback就不管是了