[Pro*C]Se connecter a Oracle avec DevC++

Se connecter a Oracle avec DevC++ [Pro*C] - C - Programmation

Marsh Posté le 09-03-2008 à 19:08:59    

Bonsoir,
 
Voici une semaine que je suis en train d'essayer de me connecter a une base de donnée sous Oracle, créee sur ma machine (petite base de donnée).
J'ai besoin d'utiliser le langage Pro*C pour pouvoir exécuter des instructions SQL dans mon langage C. Oui mais voilà, je dois tout d'abord réussir a me connecter a cette fichue base de donnée.
 
J'ai essayé avec DevC++ ou Visual Studio mais rien y fait, je n'arrive pas a générer un foutu fichier qui pourrait ressembler a quelque chose se rapprochant du Pro*C. Je précise que mes capacités sont quand même très limitées.
Je n'ai même pas de code a vous proposer, juste que je dois réussir a me connecter a cette base de donnée Oracle (sysdba je suppose). J'ai bien essayé d'inclure des bibliothèques sous les logiciels pré-cités mais je ne vois pas comment faire la liaison entre DevC++ et Oracle.
 
Si une bonne âme passe par ici...
 
Merci d'avance :)  !

Reply

Marsh Posté le 09-03-2008 à 19:08:59   

Reply

Marsh Posté le 09-03-2008 à 19:25:31    

Ils ont l'air de savoir faire ici:
 
http://www.developpez.net/forums/a [...] 80542.html
 


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 10-03-2008 à 20:16:44    

Merci de la réponse.
 
J'ai bien suivit les instructions, mais impossible de savoir si j'arrive a me connecter a ma BDD locale.
J'arrive a obtenir un .c (après compliation du C) , dans lequel je peux mettre du C, les commandes SQL ont l'air d'être reconnues.
Seulement avec la commande suivante :
 
EXEC SQL BEGIN DECLARE SECTION;
 
char  log[]="system";
char pass[]="monpass";
char  hote[]="sysdba";
int codecommune;  
int postal;
EXEC SQL END DECLARE SECTION;
 
EXEC SQL CONNECT :log IDENTIFIED BY :pass USING :hote;
 
Quand je lance le .exe , je sens bien que celui ci charge, mais impossible de savoir si la connections a été établie (je ne pense pas vu que les requêtes ne s'exécutent pas ensuite).
Existe ils une commande permettant de savoir si la connection a été effectué?
 
Merci !
 

Reply

Marsh Posté le 11-03-2008 à 12:12:40    

Voici un extrait d'un programme Pro*C que j'avais écris et qui marchait :


#include <stdio.h>
#include <stdlib.h>
 
EXEC SQL INCLUDE SQLCA;
EXEC SQL INCLUDE ORACA;
 
/* ======================================================================
   Recupere des infos sur la derniere erreur
   ====================================================================== */
int db_erreur(void)
{
 log_write("Erreur Oracle : dernier SQL : %s.\n",
     oraca.orastxt.orastxtc);
 log_write("message court : %d, %s.\n",
           sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc);
 if (sqlca.sqlcode < 0) {
  char msg_buffer[1000];
  int buf_size;
  int msg_lg;
  buf_size = 1000;
  sqlglm(msg_buffer, &buf_size, &msg_lg);
  log_write("message long : %*.*s.\n", msg_lg, msg_lg, msg_buffer);
 }
 return (0);
}
 
/* ======================================================================
   Connexion a la base
   ====================================================================== */
int db_connect(char *p_user, char *p_pass, char * p_dbstring)
{
 EXEC SQL BEGIN DECLARE SECTION;
  VARCHAR username[20];
  VARCHAR password[20];
  VARCHAR dbstring[100];
 EXEC SQL END DECLARE SECTION;
 
 strcpy(username.arr, p_user);
 username.len = strlen(username.arr);
 strcpy(password.arr, p_pass);
 password.len = strlen(password.arr);
 strcpy(dbstring.arr, p_dbstring);
 password.len = strlen(password.arr);
 
 EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbstring;
 EXEC ORACLE OPTION (ORACA=YES);
 oraca.oradbgf = 1;  /* enable all debug operations */
 oraca.orastxtf = 1; /* save the SQL statement text on SQLERROR only */
 if (sqlca.sqlcode < 0) {
  db_erreur(); return (-1);
 }
 log_write("Connection OK.\n" );
 return (0);
 }


Reply

Marsh Posté le 12-03-2008 à 16:37:23    

Tout d'abord merci pour la réponse, je test ca ce soir.
 
Par contre j'aurais besoin d'encore une petite aide concernant le programme en lui même (oui encore :) ) !
 
J'explique mon cas : j'arrive a executer une requete SQL dans le main, mais impossible de faire passer en parametre de fonction une valeur initialisé dans le main. La requete SQL de la fonction me previent que l'identificateur est inconnu (car il n'est pas présent dans les DECLARE SECTION de la fonction, mais bien du main).
Voici un aperçu du problème :
 

Citation :


int main(void)
{
EXEC SQL BEGIN DECLARE SECTION;
long SQLCODE;
...
char SQLSTATE[6];
char nom_com[35]="Paris";
EXEC SQL END DECLARE SECTION;
 
int code;
 
EXEC SQL CONNECT :ETD IDENTIFIED BY :ETD USING :HOTE; // il arrive bien a se connecter
 
code=retourner_code_commune(nom_com);
printf("Code commune : %d",code);
...
}
 
int retourner_code_commune(char nom_com[35])
{
EXEC SQL BEGIN DECLARE SECTION;
int code_commune;
EXEC SQL END DECLARE SECTION;
 
EXEC SQL
 SELECT CODECOMMUNE
INTO :code_commune
FROM COMMUNES
WHERE NOMCOMMUNE = :nom_com;
 
printf("Nom commune : %s",nom_com);
printf("Code commune %d",code_commune);
return code_commune;
}


J'ai essayé d'afficher Nom commune : il affiche bien paris. Cependant quand j'execute ce code, il me dit que l'identificateur :nom_com est inconnu (c'est mon paramètre de fonction). Les types semblent correspondre avec la BDD.
Une idée?
Merci :) !

Reply

Marsh Posté le 14-03-2008 à 12:04:55    

Citation :

il n'est pas présent dans les DECLARE SECTION de la fonction


Il faut le déclarer dans la DECLARE SECTION, et il est alors inutile de le redéclarer en dehors.
Ou bien, on peut avoir une variable dans la DECLARE SECTION et une variable en dehors, et faire un copy de l'une vers l'autre avant ou après une requête.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed