我在本地安装了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已放弃
请高手帮帮忙!

解决方案 »

  1.   

    ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA 
    这不是很明示了吗?
    listener.ora配置文件服务器名不对
      

  2.   

    #include <string>
    using namespace std;
    还用这个写法?
    #include<string.h>
    你是个老程序员? 
      

  3.   

    ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA 
    你远程连接的时候的服务名是什么??
      

  4.   

    你用sqlplus连接是用sqlplus usr/pwd@ip:port/sid这种方式连的吗?
      

  5.   

    我连接IP是172.16.100.101
    用户名:system
    密码:8823
    SID:OS101
      

  6.   

    这等于使用了ezconnect名称解析方式,而没有使用本地名称解析,即不需配置tnsnames.ora文件。
    所以你的程序中const string connectString='ip:port/sid'试试。
      

  7.   

    我用sqlplus连时:sqlplus system/[email protected]:1521/OS101
    我想问下,安装即时客户端,要配置trsnames.ora和listener.ora吗?
      

  8.   

    对不起大家了,我写的什么啊!
    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);我弧度了
      

  9.   

    谢谢上面的兄弟,但该了之后,
    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"); 没错误了,咋没结果呢?
      

  10.   

    那请问trsnames.ora要配置要加到那呢?是即时客户端的lib下吗?
      

  11.   

    根据你的连接方式决定是否配置tnsnames.ora。
    如果用user/pwd@sid这种本地名称解析方式连接,就需要配。
    如果用user/pwd@ip:port/sid这种ezconnect方式连接,则不需要配。你表里是否有数据?用sqlplus直接登入能否查到数据?
      

  12.   

    你安的是即时客户端,所以如果想用本地名称解析的话,就新建tnsnames.ora文件,位置自己决定,不过要设置环境变量TNS_ADMIN对应到它的目录。
      

  13.   

    有的,SQL> create table test1 ( Name VARCHAR(20),ExpID NUMBER(10) not NULL,Sex VARCHAR(4))
      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
      

  14.   

    谢谢,哥们了,我试了一下,插入可以,查找不行,可能是我的代码?有问题。
    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
      

  15.   

    1.注意检查插入后是否commit提交了?2.c++代码不懂,帮你顶。不知道代码是否有问题。
      

  16.   

    兄弟你太帅了,我刚学数据库,想问下,什么是ezconnect方式连接,就是把IP端口都搞上吗?
    还有我编辑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
    就是传说中的环境变量.
    太感谢了。
      

  17.   

    对不起,问个蠢问题,咋递交啊,插入不就是插入了吗?不是执行问SQL语句就递交了吗?
    没递交的化,那我怎么能在数据库里面查到呢?
      

  18.   


    插入以后是对数据库中的数据进行了修改,这时一定要commit一下,才能把你的数据写入数据库!
    光执行sql是达不到的!
    你只要在你的语句后面写上commit;就可以了!还有就是每次要是修改了表的内容都需要进行提交的!删除数据的时候就不用了!
      

  19.   

    谢谢了,又学习了不少啊!
    是不是就是这样啊!insert into test1 values('ct','03','man') commit;
      

  20.   

    roolback  一下就和什么也沒執行時一樣的
    如果commit了,rollback就不管是了