SQL serveur et C

denebola Messages postés 12 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 19 juin 2006 - 19 juin 2006 à 14:41
 ezneti - 19 avril 2007 à 12:53
Bonjour à tous et toutes,

Je suis a la recherche d'une petite source pour me connecter a une base de donnée SQL et je desespere de trouver la lol.

Le but est simple je souhaite juste établir une connection a mon serveur SQL en C soit directe soit par ODBC je ne sais pas ce qui est possible je débute.

Voila l'objectif est simple je me connecte sur le localhost avec un simple login sa sans mot de passe .

C'est faisable ?

merci pour vos réponses.

25 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
19 juin 2006 à 15:17
Exemple minimal, juste vérif de bonne connexion.

#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include "McrAsm.h"


#pragma comment(lib, "odbc32.lib")


HINSTANCE hinst;
SQLHANDLE henv, hconn;


char szbuff[1024];
char szappname[] = "Connect";


int OdbcConnEnvCreate()
{
  SQLRETURN retcd;
  retcd = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
  if(retcd == SQL_SUCCESS) goto envOK;
  if(retcd == SQL_SUCCESS_WITH_INFO) goto envOK;
  strcpy(szbuff, "Environment handle allocation failed");
  goto errMsg;
envOK:
  retcd = SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3,0);
  if(retcd == SQL_SUCCESS) goto versOK;
  if(retcd == SQL_SUCCESS_WITH_INFO) goto versOK;
  strcpy(szbuff, "ODBC version incorrecte");
  goto envOut;
versOK:
  retcd = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hconn);  if((retcd SQL_SUCCESS) || (retcd SQL_SUCCESS_WITH_INFO)) return 1;
  strcpy(szbuff, "Connection handle allocation failed");
envOut:
  SQLFreeHandle(SQL_HANDLE_ENV, henv);
errMsg:
  MessageBox(0, szbuff, szappname, MB_ICONERROR);
  return 0;
}


int OdbcSqlConnect(char* dbname, char* dbpwd) // dbpwd char* optionnel
{ // RETOURNE STATUS ERREUR
  SQLRETURN rtcd;
  char *c;
  c = bnstrcpy(szbuff, "DRIVER=SQL Server;AnsiNPW=No;Trusted_Connection=Yes;AutoTranslate=No;SERVER=BIXEON\\BNSQL;DATABASE=");
  c = bnstrcpy(c, dbname);
  *c = ';';
  if(dbpwd) {
    if(dbpwd[0]) {      *(c+1) 'P'; *(c+2) 'W'; *(c+3) = 'D'; *(c+4) = '=';      c bnstrcpy(c+5, dbpwd); *c ';';
    }
  }
  *(c+1) = 0;
  rtcd = SQLDriverConnect(hconn, 0, (SQLCHAR*)szbuff, c - szbuff + 2,
                           0, 0, 0, SQL_DRIVER_NOPROMPT);
  if(rtcd &= 0xFFFE) {
    SQLFreeHandle(SQL_HANDLE_DBC, hconn);
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
  }
  return rtcd;
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE x, PSTR y, int z)
{
  hinst = hInstance;
  if(!OdbcConnEnvCreate()) return 0;
  if(OdbcSqlConnect("MyDb", 0)) return 0;
  MessageBox(0, "OK", szappname, MB_ICONINFORMATION);
  SQLDisconnect(hconn);
  SQLFreeHandle(SQL_HANDLE_DBC, hconn);
  SQLFreeHandle(SQL_HANDLE_ENV, henv);
  return 0;
}

ciao...
BruNews, MVP VC++
0
denebola Messages postés 12 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 19 juin 2006
19 juin 2006 à 15:44
Merci pour ta réponse effectivement j'avais trouvé ton script mais j'ai beau le regarder j'arrive pas a comprendre ce qui cloche. j'ai modifié les lignes

"DRIVER=SQL Server;AnsiNPW=No;Trusted_Connection=Yes;AutoTranslate=No;SERVER=BIXEON\\BNSQL;DATABASE=");

avec le nom de mon serveur et la base de donnée et la ligne qui parle de L'ODBC
A la compilation sur DevC++ il me reste ca :

\Dev-Cpp\test.c C:\Dev-Cpp\C McrAsm.h: No such file or directory.
C:\Dev-Cpp\test.c In function `OdbcSqlConnect':
43 C:\Dev-Cpp\test.c [Warning] assignment makes pointer from integer without a cast
44 C:\Dev-Cpp\test.c [Warning] assignment makes pointer from integer without a cast
49 C:\Dev-Cpp\test.c [Warning] assignment makes pointer from integer without a cast

Il faut modifier autre chose ? ou j'ai vraiment rien compris ?

Merci par avance.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
19 juin 2006 à 15:58
Sur devcpp sers toi de strcpy + strcat en place de bnstrcpy().

ciao...
BruNews, MVP VC++
0
denebola Messages postés 12 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 19 juin 2006
19 juin 2006 à 16:24
Re : alors effectivement ca resout bien une partie de mon problème avec ce code


#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include "McrAsm.h"


#pragma comment(lib, "odbc32.lib")


HINSTANCE hinst;
SQLHANDLE henv, hconn;


char szbuff[1024];
char szappname[] = "Connect";


int OdbcConnEnvCreate()
{
  SQLRETURN retcd;
  retcd = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
  if(retcd == SQL_SUCCESS) goto envOK;
  if(retcd == SQL_SUCCESS_WITH_INFO) goto envOK;
  strcpy(szbuff, "Environment handle allocation failed");
  goto errMsg;
envOK:
  retcd = SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3,0);
  if(retcd == SQL_SUCCESS) goto versOK;
  if(retcd == SQL_SUCCESS_WITH_INFO) goto versOK;
  strcpy(szbuff, "ODBC version incorrecte");
  goto envOut;
versOK:
  retcd = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hconn);  if((retcd SQL_SUCCESS) || (retcd SQL_SUCCESS_WITH_INFO)) return 1;
  strcpy(szbuff, "Connection handle allocation failed");
envOut:
  SQLFreeHandle(SQL_HANDLE_ENV, henv);
errMsg:
  MessageBox(0, szbuff, szappname, MB_ICONERROR);
  return 0;
}


int OdbcSqlConnect(char* dbname, char* dbpwd) // dbpwd char* optionnel
{ // RETOURNE STATUS ERREUR
  SQLRETURN rtcd;
  char *c;
  c = strcpy(szbuff, "DRIVER=SQL Server;AnsiNPW=No;Trusted_Connection=Yes;AutoTranslate=No;SERVER=PCTEST\\MSDE2000;DATABASE=Test");// PCTEST et BDD c'est test
  c = strcpy(c, dbname);
  *c = ';';
  if(dbpwd) {
    if(dbpwd[0]) {      *(c+1) 'P'; *(c+2) 'W'; *(c+3) = 'D'; *(c+4) = '=';      c strcpy(c+5, dbpwd); *c ';';
    }
  }
  *(c+1) = 0;
  rtcd = SQLDriverConnect(hconn, 0, (SQLCHAR*)szbuff, c - szbuff + 2,
                           0, 0, 0, SQL_DRIVER_NOPROMPT);
  if(rtcd &= 0xFFFE) {
    SQLFreeHandle(SQL_HANDLE_DBC, hconn);
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
  }
  return rtcd;
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE x, PSTR y, int z)
{
  hinst = hInstance;
  if(!OdbcConnEnvCreate()) return 0;
  if(OdbcSqlConnect("Test", 0)) return 0; // Et la c'est la BDD aussi.
  MessageBox(0, "OK", szappname, MB_ICONINFORMATION);
  SQLDisconnect(hconn);
  SQLFreeHandle(SQL_HANDLE_DBC, hconn);
  SQLFreeHandle(SQL_HANDLE_ENV, henv);
  return 0;
}

Mais il me reste toujours le probleme de biblio :
 \Dev-Cpp\test.c C:\Dev-Cpp\C McrAsm.h: No such file or directory.

Tu aurais une idée ?

Une autre chose me perturbe j'ai pas bien compris ou tu renseigne le login et le mot de passe j'ai vu que tu parle du "dbpwd" mais pas de login ?

Et donc si j'ai bien compris a la fin du code si j'arrive a le faire fonctionner je serais connecté a me bas et donc faire mes requetes SQL ?

Merci encore
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
19 juin 2006 à 16:41
Vire ce #include, c'est de l'asm inemployable avec ce cretin de devcpp qui ne prend que du sabir AT&T.

Il est clair que:
c = strcpy(c, dbname);
*c = ';';
n'a plus aucun sens, strcpy) est une vieille bourrique de fonction qui ne retourne que ce qui lui a été passé, utilité NULLE donc.

Mets en haut de ton moduke un truc de ce genre:

inline char* bnstrcpy(char *dst, char *src)
{
  while(*dst = *src) {dst++; src++;}
  return dst;
}

ainsi tu pourras conserver tout le code sans retoucher.

ciao...
BruNews, MVP VC++
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 juin 2006 à 16:46
Oui même écrit en C, ca reste infiniment meilleur que strcpy + strcat...
Au fait, je comprends pas pourquoi dans ton bnstrcpy tu ne mets pas src en const char*?
Parce que des fois on est obligé de caster en char* et c'est pas joli joli

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
19 juin 2006 à 16:56
moi et les 'joli joli'....
Conseil de vecchio à suivre et non ma flegme du clavier.

ciao...
BruNews, MVP VC++
0
denebola Messages postés 12 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 19 juin 2006
19 juin 2006 à 17:21
C'est encore moi  un grand merci déjà pour vos réponses c'est cool. Alors ca avance pas mal je pense pas que ce sois loin même. J'ai fais le test avec un const char il m'envoi balader le chose :)

Donc pour l'instant j'ai laisser en char.

Une subtilité qui m'échape c'est ces parties :

SERVER=PCTEST\\MSDE2000;DATABASE=Test"); //cette partie la c'est bien le nom de mon serveur et de ma base qu'il faut ?

et c'est la que ca m'échape :

if(OdbcSqlConnect("XXX", 0)) return 0 // XXX la je met le lien ODBC ou direct la base ? car si c'est la base je comprend pas comment tu fais l'autentification.

En dehors de ca :

J'ai viré le #include <McrAsm.h> effectivement il remonte plus en erreur mais depuis je me fais insulter lorsque je compile j'ai des erreur comme ceci :
  [Linker error] undefined reference to [mailto:`SQLAllocHandle@12' `SQLAllocHandle@12']
  [Linker error] undefined reference to [mailto:`SQLSetEnvAttr@16' `SQLSetEnvAttr@16']
  [Linker error] undefined reference to [mailto:`SQLAllocHandle@12' `SQLAllocHandle@12']
  [Linker error] undefined reference to [mailto:`SQLFreeHandle@8' `SQLFreeHandle@8']
  [Linker error] undefined reference to [mailto:`SQLDriverConnect@32' `SQLDriverConnect@32']
  [Linker error] undefined reference to [mailto:`SQLFreeHandle@8' `SQLFreeHandle@8']
  [Linker error] undefined reference to [mailto:`SQLFreeHandle@8' `SQLFreeHandle@8']
  [Linker error] undefined reference to [mailto:`SQLDisconnect@4' `SQLDisconnect@4']
  [Linker error] undefined reference to [mailto:`SQLFreeHandle@8' `SQLFreeHandle@8']
  [Linker error] undefined reference to [mailto:`SQLFreeHandle@8' `SQLFreeHandle@8']
  ld returned 1 exit status

Désolé de vous embetter mais ca m'interesse vraiment de comprendre.

Merci encore et toujours
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
19 juin 2006 à 17:29
linker error, manque le lib, aucune idée comment se nomme pour devcpp.

f(OdbcSqlConnect("SimpleNomDeLaBaseIci", 0)) return 0;
par contre ne le mets pas en dur dans la fonction puisque tu l'auras en param.

ciao...
BruNews, MVP VC++
0
denebola Messages postés 12 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 19 juin 2006
19 juin 2006 à 17:34
Ok merci je vais chercher pour le lib, donc je laisse "" if(OdbcSqlConnect("MyDb", 0)) return 0;"" comme tu l'avais fais et je vais fouinner pour trouver comme ajouter cette librairie sur devcpp.

merci
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
19 juin 2006 à 17:42
en place de "MyDb" tu mets le nom de ta base.

ciao...
BruNews, MVP VC++
0
denebola Messages postés 12 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 19 juin 2006
19 juin 2006 à 18:06
J'ai trouvé ca comme information sur l'aide devcpp mais pour la syntaxe je ne sais pas trop comment faire et ca corespondrait a ce que je recherche a integrer non ?

You are required to include the "odbc32.lib" provided by your compiler vendor in the list of external libraries to be linked in. If using the makefiles supplied with wxWidgets, this library should already be included for use with makefile.b32, makefile.vc, and makefile.g95.

merci
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
19 juin 2006 à 18:12
Vecchio, dis lui où prendre VC++ Express 2005.

ciao...
BruNews, MVP VC++
0
denebola Messages postés 12 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 19 juin 2006
19 juin 2006 à 18:30
lol je vais le telecharger :) j'ai l'impression qu'on nous apprend pas forcement sur les bon outils j'aurais du commencer par la :)

merci encore.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 juin 2006 à 18:34
Si tu es étudiant, tu as même le droit a la version Pro gratuitement

Pour les versions express, ca voir ici

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
19 juin 2006 à 18:39
Il te faudra aussi prendre le SDK et ensuite configurer tout cela.
Lis ceci aussi: http://www.cppfrance.com/forum.v2.aspx?ID=737417

ciao...
BruNews, MVP VC++
0
denebola Messages postés 12 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 19 juin 2006
19 juin 2006 à 18:55
Merci a vous deux pour toutes ces informations :) je vais tester ca posément.

PS: merci de l'info mais je ne serais plus étudient dans trois jours :)

merci encore
0
denebola Messages postés 12 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 19 juin 2006
19 juin 2006 à 20:42
C'est encore moi

J'ai essayé de compilé le bout de code sur VC++ et en fait c'est kif kif je comprend pas :( voila le type de message a la fin de la compilation et après bonne configuration comme décrite dans les tuto

d:\mes documents\visual studio 2005\projects\remi\remi\test.c(20) : warning C4996: 'strcpy' a été déclaré désapprouvé

c:\program files\microsoft visual studio 8\vc\include\string.h(73) : voir la déclaration de 'strcpy'

Message : 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'

d:\mes documents\visual studio 2005\projects\remi\remi\test.c(26) : warning C4996: 'strcpy' a été déclaré désapprouvé

c:\program files\microsoft visual studio 8\vc\include\string.h(73) : voir la déclaration de 'strcpy'

Message : 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'

d:\mes documents\visual studio 2005\projects\remi\remi\test.c(31) : warning C4996: 'strcpy' a été déclaré désapprouvé

c:\program files\microsoft visual studio 8\vc\include\string.h(73) : voir la déclaration de 'strcpy'

Message : 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'

d:\mes documents\visual studio 2005\projects\remi\remi\test.c(43) : warning C4013: 'bnstrcpy' non défini(e) ; extern retournant int pris par défaut

d:\mes documents\visual studio 2005\projects\remi\remi\test.c(43) : warning C4047: '=' : 'char *' diffère de 'int' dans les niveaux d'indirection

d:\mes documents\visual studio 2005\projects\remi\remi\test.c(44) : warning C4047: '=' : 'char *' diffère de 'int' dans les niveaux d'indirection

d:\mes documents\visual studio 2005\projects\remi\remi\test.c(49) : warning C4047: '=' : 'char *' diffère de 'int' dans les niveaux d'indirection

d:\mes documents\visual studio 2005\projects\remi\remi\test.c(53) : warning C4244: 'fonction' : conversion de '__w64 int' en 'SQLSMALLINT', perte possible de données

-----------------------------------------------

Vous auriez une idée ??

J'ai du elever a nouveau

#include "McrAsm.h"

merci par avance.

remi
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 juin 2006 à 20:46
Ce ne sont que des warnings, ce n'est pas grave.
Avant d'inclure windows.h, tu peux ajouter cette ligne:
#define _CRT_SECURE_NO_DEPRECATE

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
denebola Messages postés 12 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 19 juin 2006
19 juin 2006 à 20:54
J'ai cru comprendre en effet mais je pensais que de les résoudre c'était plus propre :) ta ligne corige bien des problemes merci mais au final j'ai lancé le debug et la j'ai 4 erreurs :

test.obj : error LNK2019: symbole externe non résolu __imp__MessageBoxA@16 référencé dans la fonction _OdbcConnEnvCreate

test.obj : error LNK2019: symbole externe non résolu _bnstrcpy référencé dans la fonction _OdbcSqlConnect

MSVCRTD.lib(crtexe.obj) : error LNK2019: symbole externe non résolu _main référencé dans la fonction ___tmainCRTStartup

D:\Mes documents\Visual Studio 2005\Projects\remi\Debug\remi.exe : fatal error LNK1120: 3 externes non résolus

Les message sont bien complexs quand même je trouve dur a résoudre (sans connaitre bien sur)
0
Rejoignez-nous