Connexion à une base oracle via programme C ou C++

Signaler
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
-
Messages postés
286
Date d'inscription
vendredi 5 décembre 2003
Statut
Membre
Dernière intervention
22 avril 2012
-
Bonjour a tous,

Alors voila,je cherche un moyen d'attaquer une base oracle a partir d'un petit programme simple qui
me permettra de faire des INSERT et autre requetes SQl tres simples

je suis sous windows ;ma base oracle est v10.g;et je travaille sous visual studio 2005.

Apres quelques recherches j'ai trouver une librairie "oci "
malheureusement cela ne fonctionne pas.
Quandje lance mon programme ca plante au niveau de l'environnement
juste avant de faire laconnexion....


je sais pas si vous vous y connaissez, mais je ne trouve quasi aucune doc
et je planche dessus depuis plusieurs heures sans trouver de moyen de m'en sortir

pourriez vous SVP m'aidez...

voici mon bout de code test pr ma connexion:


#include
<stdlib.h>



#include








#include






<conio.h>




#include






<occi.h>

using






namespace
oracle::occi;


using






namespace
std;


int



main (

int
argc,

char
* argv[]){


// Fetch our required environment variable values. The program






// will exit if one of these can’t be obtained.






//






const
string user =

"orafce"
;


const
string pass =

"orafce"
;


const
string osid =

"orafce"
;


// Establish the Oracle client environment. Allows the Oracle






// libraries to allocate memory, initialize data structures, etc.






//

Environment*




const
env = Environment::createEnvironment(Environment::DEFAULT);


// Open a connection to the database, then close it.






//






int
ret = 0;


try

{


Connection*




const
con = env->createConnection(user, pass, osid);cout <<


"Connected as "
<< user <<

"@"
<< osid <<

"."
<< endl;


//list_visible_tables ( con,user,osid);

displayAllRows(con);


cout <<




"Closing connection."
<< endl;env->terminateConnection(con);

}



catch



(SQLException ea){


// We couldn’t connect. what() will give us the Oracle error






// code and message, so we can troubleshoot the issue.






//

cerr <<




"Can’t connect: "
<< ea.what();ret = 1;

}


// Cleanup the environment. It is a very good idea to let Oracle






// cleanup before your program terminates.






//

Environment::terminateEnvironment(env);







//while(!kbhit()); // exit condition !! get char CTRL C






return
ret;}



et voici l'erreur quis 'affiche lors du lancement
First-chance exception at 0x612f89e9 in sgbd-sample.exe: 0xC0000005: Access violation reading location 0x6661726f.

Unhandled exception at 0x612f89e9 in sgbd-sample.exe: 0xC0000005: Access violation reading location 0x6661726f.

The program '[1540] sgbd-sample.exe: Native' has exited with code 0 (0x0).

Je suis débutant merci pr votre aide !!!

 

7 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Sous Windows on utilise ODBC ou ADO (je conseille ADO pour sa simplicité).
J'ai fait plusieurs exemples avec l'un et l'autre, s'y référer.
Le format de la chaine de connexion est ici (prendre OLE DB):
http://www.connectionstrings.com/?carrier=oracle

Les biblis exotiques sont à proscrire. La prog des bases de données en code natif ne me semble pas non plus indiquée pour un débutant pour cause de pointeur d'interface COM et autres joyeusetés de ce genre.

ciao...
BruNews, MVP VC++
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
Ok merci pour ta réponse, je vais donc poursuivre mes recherches sur ADO voir ODBC
Pour cette bibli "exotique" elle m'a été conseillée par les gens de chez Oracle( voir leur site)

Si je rencontre un probleme je te recontacte , merci encore!

 
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
Salut,*
Je n'arrive pas a trouver d'exemple simple et basique de connection a oracle via ADO
ecrit en C .

Pourrez tu m'en donner un , un simple qui effectue seulement la connexion a oracle puis un select ou autre requete basique???

je te remercie d'avance pr ton aide

 
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
Salut voila ce que j'ai fait apres une petite recherche
le code compile sans erreur mais il ne retourne rien...

lors du SELECT rien ne s'affiche ensuite !!!

#include

#include

<stdio.h>#import

"C:\Program Files\Common files\System\ado\msado15.dll" \no_namespace rename(

"EOF",
"ADOEOF")
void

main(){

//initialise les variablesHRESULT hr;

CoInitialize(NULL);

try{

//declare la connection_ConnectionPtr connection;

hr = connection.CreateInstance(

__uuidof(Connection));

//vérifie si réussite

if (FAILED(hr)){

throw _com_error(hr);}

//declare le recordset_RecordsetPtr recordset;

hr = recordset.CreateInstance(

__uuidof(Recordset));

//verifie si reussite

if (FAILED(hr)){

throw _com_error(hr);}

//établi la connectionconnection->CursorLocation = adUseClient;

connection->Open(

"Provider=OraOLEDB.Oracle;Data Source=orafce;User Id=orafce;Password=orafce;", L
"",L
"", adConnectUnspecified);

//va chercher les éléments

recordset->Open(

"SELECT * from STOPPAGE",connection.GetInterfacePtr(),

adOpenForwardOnly, adLockReadOnly,

adCmdText);

//les affichent

while(!recordset->ADOEOF){

_variant_t var;

var = recordset->Fields->GetItem(L

"TIME_END")->GetValue();std::cout <<

static_cast<
char *>(_bstr_t(var.bstrVal))<< std::endl;recordset->MoveNext();

};

//referme le recordsetrecordset->Close();

}

catch(_com_error &e){

std::cout <<

"planté";}

catch(...){

std::cout <<

"planté";};

}

Donc voila je ne vois pas en quoi ca ne marche pas pourquoi est ce que ca se connecte pas?
peut etre une erreur dans mon choix de connexion string??????

merci de m'aider

 
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Gaffe de ne pas mixer ANSI et UNICODE dans ton projet.

recordset->Fields->GetItem(L"TIME_END")->Value();
L'emploi direct de l'index est prérable pour les perfs, il n'y aura pas de reherche de la position du champ.
recordset->Fields->GetItem((long) IndexIci)->Value();


Reprends EXACT la syntaxe de mes exemples, tu seras ainsi certain que le problème ne viendra pas de là.

ciao...
BruNews, MVP VC++
Messages postés
1
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
7 mars 2007

Tu devrais aussi ne pas ecouter n'importe qui.

utilises OCCI et ne part pas dans les facilites ODBC ... Ton premier probleme vient qu'il ne connait pas ORA_HOME. Comme il a besoin du tnsname, il faut que ORA_HOME pointe sur le repertoire d'installation de ton driver oracle.

ciao
Messages postés
286
Date d'inscription
vendredi 5 décembre 2003
Statut
Membre
Dernière intervention
22 avril 2012
2
Hello,

Il y a aussi Pro*C/C++ (précompilateur C/C++ d'Oracle) qui fonctionne très très bien !  Surtout si ce n'est que pour quelques petits select ou insert...
Bon amusement !