LIEN source ODBC

cs_psycomel Messages postés 128 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 24 octobre 2006 - 20 janv. 2004 à 13:38
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 20 janv. 2004 à 20:32
Bonjour.
J'aurais aimé savoir comment j'aurais pu générer automatiquement une source odbc.

Par exemple j'ai ma base Access dans le meme repertoire que mon projet et automatiquement dans mon projet je créee cette base Access comme source ODBC.

Merci d'avance 10000 fois.

6 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 janv. 2004 à 14:17
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include "McrAsm.h"

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

HINSTANCE hinst;
SQLHANDLE henv, hconn;
long lerror = 0;

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 OdbcMdbConnect(int unic, int rdonly, char* dbname, char* dbpwd) // les 2 char* options
{
SQLRETURN retcd;
retcd = SQLSetConnectAttr(hconn, SQL_ATTR_ACCESS_MODE, (SQLPOINTER)SQL_MODE_READ_ONLY, 0);
char *c = bnstrcpy(szbuff, "DRIVER={Microsoft Access Driver (*.mdb)};");
if(unic) c = bnstrcpy(c, "EXCLUSIVE=1;"); *c 'D'; *(c+1) 'B'; *(c+2) = 'Q'; *(c+3) = '='; *(c+4) = 0;
if(rdonly) SQLSetConnectAttr(hconn, SQL_ATTR_ACCESS_MODE, (SQLPOINTER)SQL_MODE_READ_ONLY, 0);
if(dbname) {
c += 4;
if(dbname[0]) {
c = bnstrcpy(c, dbname);
if(dbpwd) {
if(dbpwd[0]) { *c ';'; *(c+1) 'P'; *(c+2) = 'W'; *(c+3) = 'D'; *(c+4) = '=';
c = bnstrcpy(c+5, dbpwd);
}
}
}
}
retcd = SQLDriverConnect(hconn, 0, (SQLCHAR*)szbuff, c - szbuff,
0, 0, 0, SQL_DRIVER_COMPLETE_REQUIRED); if((retcd SQL_SUCCESS) || (retcd SQL_SUCCESS_WITH_INFO)) return 1;
SQLFreeHandle(SQL_HANDLE_DBC, hconn);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return 0;
}

void AppPathInitialize()
{
char szThis[300];
char* c = szThis + GetModuleFileName(NULL, szThis, 300); while(*c !'\\') c--; *c 0;
SetCurrentDirectory(szThis);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int)
{
hinst = hInstance;
AppPathInitialize();

if(!OdbcConnEnvCreate()) return 0;

if(!OdbcMdbConnect(1 , 0, "Mybase.mdb", 0)) return 0;

MessageBox(0, "OK", szappname, MB_ICONINFORMATION);
SQLDisconnect(hconn);
SQLFreeHandle(SQL_HANDLE_DBC, hconn);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return 0;
}

BruNews, ciao...
0
cs_psycomel Messages postés 128 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 24 octobre 2006
20 janv. 2004 à 17:13
Je te remercie deja pour cet apport.

mais, dan ta procédure OdbcMdbConnect, tu te sert de bnstrcpy()
. apparement cela n'est pa reconnu . et il met plein d'erreur de cast. peutetr que c'est une fonction perso contenue dans #include "McrAsm.h"
que d'ailleur je sui obligée de mettre en commentaire. !!
Donc que faire?

Je suppose aussi que la fonction int WINAPI Winmain est la fonction prinicpale. Je ne sais pas si qu'en il n'y auras plus d'erreur j'arriverais a faire marcher cette fonction car elle se balade un peu nulle part. Mais plutot faudra-t-il que je l'intergre kkpart. Mais pour ma culture perso, si tu pouvais mexpliquer en clair quel est ce type HINSTANCE.? PSTR ?

Répond surtout à la premiere question . Je te remercie Brunews
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 janv. 2004 à 17:28
bnstrcpy en C:
inline char* bnstrcpy(char *dst, char *src)
{
while(*dst = *src++) dst++;
}

donc retourne ptr sur le null de fin de copie, ce qui evite les strcat stupides.

int WINAPI Winmain est le point d'entree d'un prog win32.

BruNews, ciao...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 janv. 2004 à 17:30
OUPS oubli du return:
inline char* bnstrcpy(char *dst, char *src)
{
while(*dst = *src++) dst++;
return dst;
}

BruNews, ciao...
0

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

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
20 janv. 2004 à 20:21
on pourrait pareil utiliser strcpy non? mais je crois savoir que bnstrcpy à une homologue écrit en asm beaucoup plus efficace!
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 janv. 2004 à 20:32
et non pas de strcpy qui est con comme une valise, il retourne pointeur sur debut de chaine ce qui oblige au strcat a suivre et ainsi on peut parcourir toute la chaine 50 fois.
<La mienne donne pointeur sur fin de copie, une chaine ne sera jamais parcourue qu'1 seule fois.
Passons le cas de l'ASM ou bien entendu je deroule la boucle, ce qui la rend bien plus efficace sur longues distances.
BruNews, ciao...
0
Rejoignez-nous