Connection base de données sql server via ODBC en C [Résolu]

Kizera 15 Messages postés vendredi 28 mai 2010Date d'inscription 15 juin 2011 Dernière intervention - 8 juin 2011 à 10:01 - Dernière réponse : Kizera 15 Messages postés vendredi 28 mai 2010Date d'inscription 15 juin 2011 Dernière intervention
- 8 juin 2011 à 12:38
Bonjour, j'ai un programme qui me permet de me connecter à une base sql server mais le problème c'est qu'il me manque 1 champ à compléter et que je ne sais pas à quoi il correspond.

Voici mon code :
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include 

#define MAIN_LEN 80

SQLHENV     henv;
SQLHDBC     hdbc;
SQLHSTMT    hstmt;

using namespace std;

void main ()
{
SQLRETURN retcode;
SQLCHAR COL2[MAIN_LEN+1];
 	
// Exemple de requete
char requete[1024+1]="SELECT * FROM TABLE_TEST";
char Serveur[MAIN_LEN+1]="";
char Login[MAIN_LEN+1]="USER-TEST";
char Pwd[MAIN_LEN+1]="azerty__00";	

// Connexion à la base de données	

retcode=SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

if(retcode SQL_SUCCESS || retcode SQL_SUCCESS_WITH_INFO)
retcode=SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3,0);

if(retcode SQL_SUCCESS || retcode SQL_SUCCESS_WITH_INFO)
retcode=SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

else
{
printf("Erreur sur l'instruction SQLAllocHandle1 !\n");
}

// Vérification du Lien ODBC, Login Et Pwd	
if(retcode SQL_SUCCESS || retcode SQL_SUCCESS_WITH_INFO)
retcode=SQLConnect(hdbc, (SQLCHAR*)Serveur, SQL_NTS, (SQLCHAR*)Login, SQL_NTS, (SQLCHAR*)Pwd, SQL_NTS);

else
{
printf("Erreur sur l'instruction SQLSetEnvAttr !\n");
}

if(retcode SQL_SUCCESS || retcode SQL_SUCCESS_WITH_INFO)
retcode=SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

else
{
printf("Erreur sur l'instruction SQLConnect !\n");
cout<<"ret :"<<retcode<<"\n";
}

// Execution de la requete
if(retcode SQL_SUCCESS || retcode SQL_SUCCESS_WITH_INFO)
retcode=SQLExecDirect(hstmt, (SQLCHAR*)requete, SQL_NTS);

else
{
printf("Erreur sur l'instruction SQLAllocHandle2 !\n");
cout<<"ret :"<<retcode<<"\n";
}

if (retcode SQL_SUCCESS || retcode SQL_SUCCESS_WITH_INFO)
{  
while (TRUE)
{
retcode = SQLFetch(hstmt);
if (retcode SQL_SUCCESS || retcode SQL_SUCCESS_WITH_INFO)
{
SQLGetData(hstmt, 2,SQL_C_CHAR, COL2, sizeof(COL2),NULL);
cout<<"col2 :"<<COL2<<"\n";
}
}
}							
// Déconnexion 
SQLFreeStmt(hstmt, SQL_DROP);
SQLDisconnect(hdbc);
SQLFreeConnect(hdbc);
getchar ();	
}


Si vous regardez bien j'ai un champ vide a la ligne 25 : "char Serveur[MAIN_LEN+1]="";
Mais à quoi correspond ce champ ?? que dois-je lui mettre dedans. Merci d'avance pour vos réponses.
Afficher la suite 

7 réponses

Répondre au sujet
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 8 juin 2011 à 10:26
+3
Utile
char szCONNECT[] = "Driver={SQL Server};Server=.\\NOMDUSERVEUR;Database=BNTESTS;"
                    "Trusted_Connection=yes;Uid=BruNews;Pwd=TonMotDePasse";

char szSQL[] = "SELECT fldA FROM BLKA";
char szappname[] = "blkAdd";

SQLHANDLE henv 0, hconn 0;


int bnConnectDB()
{
  if(SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv) & 0xFFFE) return 0;
  if(SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER) 3, SQL_IS_INTEGER) & 0xFFFE) goto sqlFREEENV;
  if(SQLAllocHandle(SQL_HANDLE_DBC, henv, &hconn) & 0xFFFE) goto sqlFREEENV;
  if(SQLDriverConnect(hconn, 0, szCONNECT, SQL_NTS, 0, 0, 0, SQL_DRIVER_NOPROMPT) & 0xFFFE) goto sqlFREEHDBC;
  return 1;
sqlFREEHDBC: SQLFreeHandle(SQL_HANDLE_DBC, hconn);
sqlFREEENV: SQLFreeHandle(SQL_HANDLE_ENV, henv);
  return 0;  
}

void bnDisconnectDB()
{
  SQLDisconnect(hconn);
  SQLFreeHandle(SQL_HANDLE_DBC, hconn);
  SQLFreeHandle(SQL_HANDLE_ENV, henv);
}



ciao...
BruNews, MVP VC++
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de BruNews
Kizera 15 Messages postés vendredi 28 mai 2010Date d'inscription 15 juin 2011 Dernière intervention - 8 juin 2011 à 10:40
0
Utile
Hmmm merci beaucoup pour avoir répondu mais j'ai un souci c'est que le "nom du serveur" je ne sais pas où le trouver.. En fait je suis en stage là j'ai déjà développé un bench simplifié puis la il faut que je me connecte à une base sql server pour récupérer quelques millions de lignes et en fait on m'a envoyé par mail des logs/pass/nom de machine/nom de bases pour pouvoir m'y connecter et donc je n'ai pas vraiment d'adresse IP ou encore un nom de serveur précis.. donc voila si tu pouvais juste prendre le temps de me répondre par écrit cette fois x) Merci d'avance.
Commenter la réponse de Kizera
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 8 juin 2011 à 10:54
0
Utile
Si ta base est en local sur ton poste tu mets direct le nom d'instance SqlServer à laquelle tu dois te connecter.

SQLGetData() et autres à oublier pour aspirer des millions de lignes.

Préparer un vecteur de structures en mémoire, mapper les champs (1 seule fois) par SQLBindCol() en mode SQL_BINARY et aspirer par passes avec SQLFetchScroll(). Ainsi les perfs seront au RDV.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Kizera 15 Messages postés vendredi 28 mai 2010Date d'inscription 15 juin 2011 Dernière intervention - 8 juin 2011 à 11:18
0
Utile
ahh ok, la base n'est pas sur mon poste, elle est sur un poste distant dont j'ai l'adresse local mais même si lui passe comme lien ODBC cela ne fonctionne toujours pas lorsque j'exécute mon programme il m'affiche :


"Erreur sur l'instruction SQLConnect !"
ret = -1
"Erreur sur l'instruction SQLAllocHandle !"
ret = -1


Pour SQLAllocHandle je penses que si l'erreur du SQLConnect est réparé, ce sera de même pour SQLAllocHandle.

Merci de bien vouloir répondre une derniere fois surement .
Commenter la réponse de Kizera
Kizera 15 Messages postés vendredi 28 mai 2010Date d'inscription 15 juin 2011 Dernière intervention - 8 juin 2011 à 11:33
0
Utile
En fait je viens de remarquer une erreur... Si on regarde bien mon programme les printf dans les else sont un peu dispatché en fait... Lorsque dans le if de SQLConnect il échoue il va passer dans le else et m'afficher "Erreur de l'instruction SQL SQLSetEnvAttr !" en fait je viens de voir que ma fonction SQLConnect à l'air de bien marcher mais ce sont :
if(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
retcode=SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

else
{
printf("Erreur sur l'instruction SQLAllocHandle !\n");
cout<<"ret :"<<retcode<<"\n";
}

// Execution de la requete
if(retcode SQL_SUCCESS || retcode SQL_SUCCESS_WITH_INFO)
retcode=SQLExecDirect(hstmt, (SQLCHAR*)requete, SQL_NTS);

else
{
printf("Erreur sur l'instruction SQLExecDirect !\n");
cout<<"ret :"<<retcode<<"\n";
}


Voila ce sont en fait ces 2 fonctions qui plantes ! et qui me retourne un retcode = -1.

PS : Je n'ai pas trouver la fonction éditer ou supprimer pour mon ancien message... Désolé et merci d'avance ;).
Commenter la réponse de Kizera
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 8 juin 2011 à 12:32
0
Utile
pourquoi n'utilises-tu pas les fonctions que je mets ???
ça éviterait ces 'if' qui trainent en longueur et qui conduisent aux erreurs.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Kizera 15 Messages postés vendredi 28 mai 2010Date d'inscription 15 juin 2011 Dernière intervention - 8 juin 2011 à 12:38
0
Utile
Ben je vais essayer tiens ^^ j'avais du mal à comprendre mais là en quelques heures de recherche j'en ai vu des tas similaires donc sa va. Je vais essayer mais maintenant je sais exactement d'où vient mon problème vu que j'ai découvert la fonction : SQLGetDiagRec() elle est super en tout cas merci pour tout ;) et il faudrais mettre le sujet en "résolu" si vous avez ^^ je n'ai pas trouver la commance non plus bref bonne journée ;) merci encore.
Commenter la réponse de Kizera

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.