LINUX.ORG.RU

С++ + OracleDB OCCI

 , ,


0

1

Доброго времени суток, уже который день бьюсь над совмещением Oracle и C++. через OCCI. instantclient Я поставил, причём все версии instantclient-basic-linux instantclient-basiclite instantclient-jdbc-linux instantclient-sqlplus-linux instantclient-sdk-linux instantclient-odbc-linux instantclient-tools-linux

Я знаю, что это не надо, но уже не знал в чём проблема.

создал фаил tnsnames.ora,

. ora102 =
            (DESCRIPTION =
                (ADDRESS= (PROTOCOL = TCP)(HOST = 192.168.56.101)(PORT=1521))
        )

прописал путь к оракл либ сюда /etc/ld.so.conf выполнил ldconfig создал файлы /etc/idbc.ini

           [ora102]
                Application Attributes          = T
                Attributes              = W
                BatchAutocommitMode             = IfAllSuccessful
                CloseCursor             = T
                DisableDPM              = F
                DisableMTS              = T
                Driver          = Oracle_ODBC_Driver_in_ora102
                DSN             = ora102
                EXECSchemaOpt           =
                EXECSyntax              = T
                Failover                = T
                FailoverDelay           = 10
                FailoverRetryCount              = 10
                FetchBufferSize         = 64000
                ForceWCHAR              = F
                Lobs            = T
                Longs           = T
                MetadataIdDefault               = F
                QueryTimeout            = T
                ResultSets              = T
                ServerName              = ora102
                SQLGetData extensions           = F
                Translation DLL         =
                Translation Option              = 0
                UserID          = system

И /etc/odbcinst.ini

      [ODBC]
                Trace                   = No
                TraceFile               = /tmp/sql.log
                ForceTrace              = No
                Pooling                 = No
                UsageCount              = 2

                [Oracle_ODBC_Driver_in_ora102]
                Description             = Oracle 11g XE ODBC driver.
                Driver                  = /usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1
                Setup                   =
                FileUsage               =
                CPTimeout               =
                CPReuse                 =
                UsageCount              = 2

Выполнил установку переменных.

export ORACLE_BASE=/usr/lib/oracle export ORACLE_HOME=$ORACLE_BASE/11.2/client64 export LD_LIBRARY_PATH=$ORACLE_HOME/lib export PATH=$ORACLE_HOME/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:~/bin export TNS_ADMIN=/usr/lib/oracle/11.2/client64/

Взял простой пример программы

#include <occi.h> 
#include <iostream> 
#include <iomanip>



#define db_user_name "hr" 
#define db_password "hr" 
#define db_conn_str "192.168.56.101:1521/@XE" 
//#define db_conn_str "system" 

using namespace oracle::occi; 
using namespace std;

int main(){
	try{
	 Environment* env = Environment::createEnvironment(Environment::OBJECT);   
   Connection* conn = env->createConnection(db_user_name, db_password, db_conn_str); 
   cout<<"HELLO";
    Statement* stmt = conn->createStatement("Select 1 from dual"); 
     ResultSet *rs = stmt->executeQuery(); 
     int res = 0; 
      while (rs->next()) 
          { 
          res = rs->getInt(1); 
          } 
          
     stmt->closeResultSet(rs); 
    env->terminateConnection(conn); 
     Environment::terminateEnvironment(env); 
}
  catch(SQLException &sqlExcp) 
    { 
    cerr << sqlExcp.getErrorCode() << " " << sqlExcp.getMessage() << endl; 
    } 
	return 0;
}

компилирую вот так:

g++ -o test test.cpp -I /usr/include/oracle/11.2/client64 -L /usr/lib/oracle/11.2/client64/lib/ -lclntsh -locci
На выходе получаю не прияную Оракловскую ошибку.
12514 ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

Пытаюсь проверить так isql ora102 hr hr получаю [ISQL]ERROR: Could not SQLConnect


Так ты подцепиться к БД не можешь, получается.
Попробуй обычным клиентом сначала зацепиться, а потом уже программу пиши.

UVV ★★★★★ ()

создал фаил tnsnames.ora,

. ora102 =
            (DESCRIPTION =
                (ADDRESS= (PROTOCOL = TCP)(HOST = 192.168.56.101)(PORT=1521))
        )

чё за фигня?

anonymous ()
Ответ на: комментарий от anonymous

ТС: Обычно пишут без точки впереди. К примеру

ora102 =
   (DESCRIPTION =
      (ADDRESS= (PROTOCOL = TCP)(HOST = 192.168.56.101
      (PORT=1521))
   )
И вообще у тебя

$ sqlplus USER/PASSWORD@ora102

отзывается?? если нет, то рано писать программу, сначала разберись с серваком.

Atlant ★★★★★ ()
Ответ на: комментарий от Atlant

sqlplus hr/hr@ora102

мне выкидывает [code] ERROR: ORA-12162: TNS:net service name is incorrectly specified [/code] Но Java вполне успешно подключается через jdbc, и NetBeans после плясок, B JDeveloper подключается. у Всех их настройки [code] SID = XE host = 192.168.56.101 port = 1521 [/code]

Вот другой вариант подключения sqlPlus

[code] linux-86vr:~ # sqlplus hr/hr@192.168.56.101:1521/XE

SQL*Plus: Release 11.2.0.3.0 Production on Thu Apr 19 09:31:52 2012

Copyright (c) 1982, 2011, Oracle. All rights reserved.

ERROR: ORA-21561: OID generation failed [/code]

Oracle http://ora-21561.ora-code.com/ насколько я понял , мне советует проверить переменный окружения

PATH=/usr/lib/oracle/11.2/client64/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/root/bin ORACLE_BASE=/usr/lib/oracle ORACLE_HOME=/usr/lib/oracle/11.2/client64 TNS_ADMIN=/usr/lib/oracle/11.2/client64/lib/

Чего-то не хватает?

vsrmis ()

Немного не по теме, но взгляни на OTL - сэкономишь кучу нервов.

JackyTreehorn ()
Ответ на: комментарий от Atlant

/lib/ -l
итого 186216
-rw-r--r-- 1 root root       368 сент. 17  2011 glogin.sql
lrwxrwxrwx 1 root root        17 апр.  17 12:32 libclntsh.so -> libclntsh.so.11.1
-rw-r--r-- 1 root root  52761218 сент. 17  2011 libclntsh.so.11.1
-rw-r--r-- 1 root root   7955322 сент. 17  2011 libnnz11.so
lrwxrwxrwx 1 root root        15 апр.  17 12:32 libocci.so -> libocci.so.11.1
-rw-r--r-- 1 root root   1971762 сент. 17  2011 libocci.so.11.1
-rw-r--r-- 1 root root 118408281 сент. 17  2011 libociei.so
-rw-r--r-- 1 root root    164836 сент. 17  2011 libocijdbc11.so
-rw-r--r-- 1 root root   1503303 сент. 17  2011 libsqlplusic.so
-rw-r--r-- 1 root root   1477446 сент. 17  2011 libsqlplus.so
-rwxr-xr-x 1 root root    999115 апр.  18 22:39 libsqora.so.11.1
-rw-r--r-- 1 root root   2095661 сент. 17  2011 ojdbc5.jar
-rw-r--r-- 1 root root   2714016 сент. 17  2011 ojdbc6.jar
-rw-r--r-- 1 root root    300666 сент. 17  2011 ottclasses.zip
-rw-r--r-- 1 root root       106 апр.  19 09:12 tnsnames.ora
-rw-r--r-- 1 root root     66779 сент. 17  2011 xstreams.jar
linux-86vr:/usr/lib/oracle/11.2/client64/bin # ls  /usr/lib/oracle/11.2/client64/bin/ -l
итого 48
-rwxr-xr-x 1 root root  8136 сент. 17  2011 adrci
-rwxr-xr-x 1 root root 30320 сент. 17  2011 genezi
-rwxr-xr-x 1 root root  4920 сент. 17  2011 sqlplus

Фаил *.ora у меня 1 это tnsnames.ora


ora102 =
   (DESCRIPTION =
      (ADDRESS= (PROTOCOL = TCP)(HOST = 192.168.56.101
      (PORT=1521))
   )

Мне , честно говоря, не совсем понятна система взаимодействия этих файлов ora с программами. Но название ora102 я брал из одного из turtorial. Там была настройка Oracle 10g R2 и С++, в то время как у меня Oracle 11 XE . Название ora102 на что-то влияет может? И мне нужно его сделать XE? Потому что на сервере у меня ORACLE_SID = XE

vsrmis ()
Ответ на: комментарий от vsrmis

Я в универе, дома прийду покопаю OTL. На первый взгляд интересно.

vsrmis ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.