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

LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 - 6 févr. 2007 à 15:40
cs_exar Messages postés 286 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 22 avril 2012 - 22 nov. 2007 à 16:29
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 févr. 2007 à 01:05
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++
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
7 févr. 2007 à 09:43
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!

 
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
7 févr. 2007 à 11:30
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

 
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
7 févr. 2007 à 15:13
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

 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 mars 2007 à 11:25
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++
0
annaquin Messages postés 1 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 7 mars 2007
7 mars 2007 à 11:30
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
0
cs_exar Messages postés 286 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 22 avril 2012 1
22 nov. 2007 à 16:29
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 !
0
Rejoignez-nous