
BruNews
|
voici un exemple en 1 seul fichier.
#include <windows.h> #include <sql.h> #include <sqlext.h>
#pragma comment(lib, "odbc32.lib")
HINSTANCE hinst; SQLHANDLE henv, hconn; char szbuff[1024]; char *szappname = "Requete";
inline char* bnstrcpy(char *dst, char *src) { // return ptr sur NULL final __asm { mov eax, dst mov ecx, src dec eax LcpyLoop: mov dl, [ecx] inc eax inc ecx mov [eax], dl or dl, dl jz short LcpyOut mov dl, [ecx] inc eax inc ecx mov [eax], dl or dl, dl jz short LcpyOut mov dl, [ecx] inc eax inc ecx mov [eax], dl or dl, dl jnz short LcpyLoop LcpyOut: } }
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 bReadOnly, char* dbname, char* dbpwd) { // dbname et dbpwd en options // dbpwd pris en compte SI dbname est fourni SQLRETURN retcd; if(bReadOnly) SQLSetConnectAttr(hconn, SQL_ATTR_ACCESS_MODE, (SQLPOINTER)SQL_MODE_READ_ONLY, 0); char *c = bnstrcpy(szbuff, "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="); if(dbname) { 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; }
int OdbcExecAction(char *pszqry) { // return != 0 SI ERREUR SQLHANDLE hstmt; SQLRETURN retcd; retcd = SQLAllocHandle(SQL_HANDLE_STMT, hconn, &hstmt); if(retcd & 0xFFFE) return 1; retcd = SQLExecDirect(hstmt, (SQLCHAR*)pszqry, 60); SQLFreeHandle(SQL_HANDLE_STMT, hstmt); return (retcd & 0xFFFE); }
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(0, "Mybase.mdb", 0)) return 0; MessageBox(0, "OUVERT", szappname, MB_ICONINFORMATION); //if(!OdbcExecAction("CREATE TABLE T7 (a INTEGER, b INTEGER, c TIMESTAMP)")) // MessageBox(0, "QUERY OK", szappname, MB_ICONINFORMATION); if(!OdbcExecAction("SELECT * INTO T2 IN Tmp.mdb FROM T1 WHERE a < 10")) MessageBox(0, "QUERY OK", szappname, MB_ICONINFORMATION); SQLDisconnect(hconn); SQLFreeHandle(SQL_HANDLE_DBC, hconn); SQLFreeHandle(SQL_HANDLE_ENV, henv); return 0; }
ciao...
------------------------------- Réponse au message : -------------------------------
> Bonjour > Pourriez vous m'expliquer comment on fait pour créer des nouveau champs et des nouveau enregistrements dans une base de données acces grâce a odbc sous visual c++. Merci
|