IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

requete avec OBCD et visual c++


Sujet :

MFC

  1. #1
    Membre averti

    Homme Profil pro
    Inscrit en
    mars 2002
    Messages
    0
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2002
    Messages : 0
    Points : 309
    Points
    309
    Par défaut requete avec OBCD et visual c++
    je ne trouve pas comment on fait des requete sous visual c++ avec OBCD
    j'utilise une base de données access 2000
    elle comprend une table avec quelques champs
    nom
    prenom
    adresse

    je voudrais fair eune fonction qui recherche dans ma base les enregistrement avec un nom donné dans un edit par exemple
    en gros comment on fait pour faire une requete
    dois je utilisé le SQL ?
    merci d'avance pour votre réponse(c pour mon projet bts de fin d'année

  2. #2
    Membre averti

    Homme Profil pro
    Inscrit en
    mars 2002
    Messages
    0
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2002
    Messages : 0
    Points : 309
    Points
    309
    Par défaut ODBC
    Ce n'est pas simple ....
    Ce qu'il faut faire :
    1) Ouvrir la data base et regarder les tables MDB de la base : m_strDatabase = m_database.GetName();
    et faire éventuellement un choix sur une table
    2) créer un environnement : HENV
    3) Connection à ODBC /MDB : créer un HDBC
    4) Lancer SqlExecutedirect avec SqlFechScroll pour lister les éléments dela table.

    Ci joint un exemple de ENDUSER4GL , nouveau projet Vc++ "OPEN SOURCE".
    Vous trouverez plein d'exemples de programmes C++ (sql, queries, sort...) de EndUser4gl
    Notre projet Shareware : http:\\www.enduser4gl.com


    Bon courage
    Ph bergougnoux
    bergou@club-internet.fr
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
     
    //  ////////////////////////////////////////////////
    //  INITIALIZE GRID 4 : TABLE ACCES                 //
    ////////////////////////////////////////////////////
    SQLHDBC   EU_Create_HdbcACCES(LPSTR pstrFileName )  
    {  	CDaoDatabase m_database;
    	CString m_strDatabase;
    	CString m_strQuery;
     	CDaoTableDefInfo tdi;
    	int i,  NumDial,NumWin,y,   Result,nRows  ;
          char *szBuffer  ;
     	  SQLHDBC   hdbc ;                   //hdbc
         SQLRETURN nResult;                //result code
         SQLHSTMT  hstmt  ; 
     	HENV    henv;
    	RETCODE retcode;
    	BOOL IiSheet=FALSE;
      	CHAR    szDSNName[SQL_MAX_DSN_LENGTH + 1];
     
     	CHAR    szDSNNameDrivers[SQL_MAX_DSN_LENGTH + 1];
    	CHAR    szLegalDSNName[SQL_MAX_DSN_LENGTH + 1];
      	CHAR    szFileDSNName[1024];
     	char    *pvaleur;
       	UWORD	rgbValue;  		
     	 HCURSOR  hOldCursor;
     
    	  	    y=	SearchDialAndWin( hWndTBtnQuery4 ,&NumDial,&NumWin,2);
    			if(!y) { TRACEEU("Error Creation Window Query Load Table xls/mdb "); return 0;}
     
    	 	   for(i=0;i < 40;i++)//init GRID
    		   {
    			   *(int *)Dialog[NumDial].TabCoordWinGrid[NumWin].InfoTable[i][1] =0;
     
          	   	 AllocAddItemGridSql(2,i,NumDial,NumWin, "\0");
         	  	 AllocAddItemGridSql(3,i,NumDial,NumWin, "mdb");
    	   }
     
    	 nRows=0;
    	 try {
          // non exclusif, lecture seule
          m_database.Open(pstrFileName, FALSE, TRUE);
        }
        catch (CDaoException* e) {
          ::DaoErrorMsg(e);
              e->Delete();	 AfxDaoTerm(); // hyper important 
          return 0;
        }
     
    	 m_strDatabase = m_database.GetName();
    //     TRACEEU("Nom BDD = %s, \n",
     //        (const char*) m_strDatabase );
       	int nTables = m_database.GetTableDefCount();
         for (int n = 0; n < nTables; n++) {
            m_database.GetTableDefInfo(n, tdi);
             if (tdi.m_strName.Left(4) != "MSys") {
      		 	 	szBuffer = strdup( tdi.m_strName);
    	 		   AllocAddItemGridSql(2,nRows,NumDial,NumWin,(char *)  szBuffer);
    	 		    AllocAddItemGridSql(3,nRows,NumDial,NumWin, (char *)"MDB");
                   nRows++;
      	//  TRACEEU("TABLE GRID4...%s ",(const char*) szBuffer);
    	}
    	 } 
     
    		m_database.Close();  // route ECHAP
    	 	 AfxDaoTerm(); // hyper important 
     
    // Attributes & Operations
      InvalidateRect(hWndTBtnQuery4,0,0);
     ShowWindow(HwndTQueryChild4,SW_RESTORE);
     SetForegroundWindow((HWND)HwndTQueryChild4);
          hOldCursor = SetCursor(LoadCursor((HINSTANCE)NULL, IDC_WAIT));
     	 SetCursor((LoadCursor((HINSTANCE)NULL, IDC_WAIT)));
    	 ShowCursor(TRUE);
     	    strcpy(SQLInfoDriver[5].EnvDatabaseSql,pstrFileName);
    	    strcpy(SQLInfoDriver[5].VerSql,"MS Access Driver");
    	    strcpy(SQLInfoDriver[5].VerDriver ,"25");
    		Format_Drivers_MDB();
                    SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
    		(void) SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
    					(SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);
     			retcode = 	SQLDrivers(henv,SQL_FETCH_FIRST,(unsigned char *) szDSNNameDrivers,
    			sizeof(szDSNNameDrivers), NULL, NULL, 0, NULL);
    // recherche du driver 
      		while(SQL_SUCCEEDED(retcode))
    		{	
    			if(pvaleur = strstr( szDSNNameDrivers,"Access Driver")) 
    			{
     
     				G_IncrDataSource++; 
    				memcpy(szFileDSNName,"\0",MAXBUFLEN+1);  
    				 sprintf(szLegalDSNName,"%05d",G_IncrDataSource);
    				strcpy(szDSNName,"EndUser4gl");strcat(szDSNName,szLegalDSNName);	
    				strcat(szFileDSNName,"DSN=");
    				strcat(szFileDSNName,szDSNName);strcat(szFileDSNName,";");
    				strcat(szFileDSNName,G_szFileDSNName); 
    				y= strlen(szFileDSNName);
    		    for(i = 0;i  <  y + 1 ;i++) {
    		    if(!strncmp((char *) szFileDSNName+i,(char *)";",1)) 
    	   	  szFileDSNName[i] ='\0' ;
    		   }
     
       strcat(szDSNName,"\0"); 
            	SQLRemoveDSNFromIni(szDSNName);
         	SQLConfigDataSource(NULL,ODBC_REMOVE_DSN, szDSNNameDrivers,szFileDSNName);
     
        if(! SQLWriteDSNToIni(szDSNName, szDSNNameDrivers))
    	{	 TRACEEU("1 Erreur SQLWriteDSNToIni %s", szDSNNameDrivers); 
    		SQLFreeHandle(SQL_HANDLE_ENV, henv);
     
    	return 0;
    	}
     
     	   	if(!SQLConfigDataSource(NULL,ODBC_ADD_DSN, szDSNNameDrivers,szFileDSNName))
    		{  	  TRACEEU("4 Erreur SQLConfigDataSource  %s", szDSNNameDrivers);   
    			  TRACEEU("4 Erreur SQLConfigDataSource  %s", szFileDSNName);   
    				SQLFreeHandle(SQL_HANDLE_ENV, henv);
    				SQLRemoveDSNFromIni(szDSNName);
     		return 0;
    		}
     
     
     	if ((nResult = SQLAllocHandle(SQL_HANDLE_DBC,henv, (SQLHDBC FAR *)&hdbc)) != SQL_SUCCESS) {
    			DisplayError(nResult, 0, SQL_HANDLE_ENV, henv);
    		   	SQLFreeHandle(SQL_HANDLE_ENV, henv);
    			SQLRemoveDSNFromIni(szDSNName);
    		 	SQLConfigDataSource(NULL,ODBC_REMOVE_DSN, szDSNNameDrivers,szFileDSNName);
    			SQLDisconnect(hdbc);
    			SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    			return 0;
        }
      		//test SQL_AUTOCOMMIT		
     	 		nResult = SQLSetConnectAttr(hdbc,SQL_AUTOCOMMIT,(void *)SQL_AUTOCOMMIT_ON,SQL_IS_INTEGER);
          	 if((nResult != SQL_SUCCESS ) ) 
    		 {TRACEEU("PB03%d",nResult);
            DisplayError(nResult, 0, SQL_HANDLE_STMT, hdbc);
            return 0;
    		 }
     
      	 	nResult = SQLSetConnectAttr(hdbc,SQL_ACCESS_MODE,(void *)SQL_MODE_READ_ONLY,SQL_IS_INTEGER);
       	 if((nResult != SQL_SUCCESS )  ) 
     	{TRACEEU("PB02%d",nResult);
         DisplayError(nResult, 0, SQL_HANDLE_STMT, hdbc);
          return 0;
    	 }
     
     
     		//test SQL_LOGIN_TIMEOUT
    		//the choice of 15 seconds for timeout is arbitrary
    		rgbValue = 15;
       	nResult =  SQLSetConnectAttr(hdbc,SQL_LOGIN_TIMEOUT,(void *)&rgbValue ,SQL_IS_INTEGER);
        	 if((nResult != SQL_SUCCESS ) ) 
    		 {TRACEEU("PB04%d",nResult);
          DisplayError(nResult, 0, SQL_HANDLE_STMT, hdbc);
           return 0;
    		 }
    // CONNECTION  ODBC/MDB BY TRANSPARENCY ******************************
      nResult = SQLConnect(hdbc,(unsigned char *)szDSNName,SQL_NTS,(unsigned char *)"",\
    	 SQL_NTS,(unsigned char *)"",SQL_NTS);
        	  	if(nResult == SQL_SUCCESS || nResult == SQL_SUCCESS_WITH_INFO)
    		{   	// try to get a list of columns for the table
     		    nResult = SQLAllocHandle(SQL_HANDLE_STMT,hdbc, (SQLHSTMT FAR *)&hstmt);
    				 Result=0;
     
    			 	if(nResult == SQL_SUCCESS || nResult == SQL_SUCCESS_WITH_INFO)
    				{ 	
    						   G_hdbc = hdbc; // tres important
                               G_hstmt = hstmt; // tres important
     						strcpy(  G_szDSNName,szDSNName);
     						strcpy(  G_szDSNNameDrivers,szDSNNameDrivers) ;
    						strcpy(  G_szFileDSNNameODBC,szFileDSNName) ;
    						G_henv = henv;
    						ExecuteSQLDialog( hdbc,    hstmt,pstrFileName) ;
                                   return hdbc;
    				}//if(nResult == SQL_SUCCESS
    				else
    				{
      	 	 			DisplayError(nResult, 0, SQL_HANDLE_STMT, hdbc);
    		 		 	SQLFreeHandle(SQL_HANDLE_ENV, henv);
    		 			SQLRemoveDSNFromIni(szDSNName);
     	 	 			SQLConfigDataSource(NULL,ODBC_REMOVE_DSN, szDSNNameDrivers,szFileDSNName);
    		 			SQLDisconnect(hdbc);
    		 			SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    						MessageBox(0, INITERROR, EXECERROR, MB_OK|MB_ICONHAND);
    	 	 		return 0;
    				}
     
    		}// nResult = SQLConnect
    				else
    				{
      	 	 			DisplayError(nResult, 0, SQL_HANDLE_STMT, hdbc);
    		 		 	SQLFreeHandle(SQL_HANDLE_ENV, henv);
    		 			SQLRemoveDSNFromIni(szDSNName);
     	 	 			SQLConfigDataSource(NULL,ODBC_REMOVE_DSN, szDSNNameDrivers,szFileDSNName);
    		 			SQLDisconnect(hdbc);
    		 			SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
     
    				 	MessageBox(0, INITERROR, EXECERROR, MB_OK|MB_ICONHAND);
    				}
     
     
     
    		break;
    		} //if Excel driver
    				retcode = 	SQLDrivers(henv,SQL_FETCH_NEXT,(unsigned char *) szDSNNameDrivers,
    			sizeof(szDSNNameDrivers), NULL, NULL, 0, NULL);
     
     }// while
    	  return 0 ;
     
     
     
    }
     
     
    int FAR PASCAL ExecuteSQLDialog(SQLHDBC   hdbc, SQLHSTMT  hstmt,char *szBuffer) 
    {
     
        SWORD     nCols = 0;                  // # of result columns
       SWORD     nCount;                     // index
       SWORD     swColType;                  // column data type
       SWORD     swColScale;                 // column scale
       SWORD     swColNull;                  // nullable column ?
       SWORD     swColLength = MAXDATALEN;   // column data length
        UDWORD    udwColDef;                  // precision on the column
       SQLRETURN nReturn;                    // return code
       HCURSOR   hOldCursor;                 // default cursor handle
       int       nRows,i=0,y,NumDial,NumWin;                      // # of result rows
     	MSG msg;
     	RECT rc;
      //	strcpy(szBuffer," SELECT  * FROM   clients    WHERE clients.CODE_CLIEN like '*A*'  ");
     
      // change cursor shape to hour glass
     //TRACEEU("%d Wait..........Please %s",strlen(szBuffer),szBuffer);
       hOldCursor = SetCursor(LoadCursor((HINSTANCE)NULL, IDC_WAIT));
     	 SetCursor((LoadCursor((HINSTANCE)NULL, IDC_WAIT)));
         ShowCursor(TRUE);
     	nReturn =SQLPrepare(hstmt,(unsigned char *)szBuffer,strlen(szBuffer));
    	GlobalDoubleValResult = (double)nReturn;
     
      		if( nReturn != SQL_SUCCESS ) 
    		{ 
       			DisplayError(nReturn, hWndFrameSQL, SQL_HANDLE_STMT, hstmt);
    			  	 while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))// hyper important :nettoyer
                     DispatchMessage (&msg) ;
     
    			SQLCloseCursor(hstmt);
     			SQLFreeStmt(hstmt, SQL_CLOSE);
    				GlobalDoubleValResult = -1;// no select
    		     return EUError;
    		}
     
     
        nReturn = SQLExecDirect(hstmt, (unsigned char *)szBuffer,strlen(szBuffer) );
    	GlobalDoubleValResult = (double)nReturn;
     	if(nReturn != SQL_SUCCESS ) 
        {
           DisplayError(nReturn, hWndFrameSQL, SQL_HANDLE_STMT, hstmt);
       // if the return value was just information, carry on
             // Close the open result set.
    	     	 while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))// hyper important :nettoyer
                     DispatchMessage (&msg) ;
     
       			SetCursor(hOldCursor);
     			DestroyWindow(hWndFrameSQL) ; 
    			SQLCloseCursor(hstmt);
    			SQLFreeStmt(hstmt, SQL_CLOSE);
       // restore the cursor to default value
    				SetCursor(hOldCursor);
    				GlobalDoubleValResult =  1;
    		        return EUError; ;
        }
        // call SQLNumResultCols to calculate the number of columns in
       // the result set, if more than the MAX_COL (the array boundary)
       // limit the number to MAX_COL and display truncation warning.
       // if it is 0, the statement probably was a non-SELECT simply return
       nReturn = SQLNumResultCols(hstmt, &nCols);
     //printfEU("  nCols %d",nCols);STOP();STOP();STOP();
         if ((nCols == 0)  )
    	 {  // if "INTO" in szBuffer
    		   	 while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))// hyper important :nettoyer
                     DispatchMessage (&msg) ;
     
    		 SQLCloseCursor(hstmt);
    			 SetCursor(hOldCursor);
     			//	DestroyWindow(hWndFrameSQL) ; 
    			  // restore the cursor to default value
    				SetCursor(hOldCursor);
    				if((strstr(szBuffer,"into")) || (strstr(szBuffer,"INTO")))
    				{	//printfEU("Find INTO............");
    					return  GlobalDoubleValResult=0;//normal
    				}
    			 	else return  GlobalDoubleValResult = 1;// not find
     
        }
     
     //	 TRACEEU("1 Cols.......... :%d",nCols);
      y=	SearchDialAndWin( hWndBtnSQL ,&NumDial,&NumWin,2);
    if(!y) { TRACEEU("Error Creation Window Sql "); return EUError;}
     	   AllocGridSql(2,nCols,64,26,NumDial,NumWin);
      GetWindowRect(hWndFrameSQL,&rc);
    	 y =((nCols + 1) * 160) +70 ;
    	 if( y < rc.right){
    		  SetWindowPos(hWndFrameSQL, NULL,\
    		  rc.left, rc.top, y, rc.bottom,  
            SWP_NOZORDER | 	SWP_DRAWFRAME	 ); 
    	 	// Ascenseur horizontal : en bas, nouvelles dimensions
    		  GetClientRect(hWndFrameSQL,&rc);
      		MoveWindow(Dialog[NumDial].TabCoordWinGrid[NumWin].hwndTableur[1],0,rc.bottom-96,\
    			rc.right-86,16,0);
    		// Ascenseur vertical : à droite, nouvelles dimensions
     		MoveWindow(Dialog[NumDial].TabCoordWinGrid[NumWin].hwndTableur[2],rc.right-86,\
    		Dialog[NumDial].TabCoordWinGrid[NumWin].HeightGrid,16,rc.bottom-96-Dialog[NumDial].TabCoordWinGrid[NumWin].HeightGrid,0);
     
    	 }
     
       // call SQLBindCol to bind column data array and column data length
       // array to the result set
      SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_BIND_TYPE, SQL_BIND_BY_COLUMN, 0);
     
        for(nCount=1, szBuffer[0]='\0'; nCount <= nCols; nCount++) {
     
         SQLDescribeCol(hstmt, nCount,(unsigned char *) szBuffer, MAXDATALEN, &swColLength, &swColType, &udwColDef,
                          &swColScale, &swColNull);
     	  SQLBindCol(hstmt, (UWORD)(nCount), SQL_C_CHAR,(void *)szBuffer, MAXDATALEN, &dwDataLen);
      	  AllocColumnGridSqlPUSHBUTTON(NumDial,NumWin);
    			 	   AllocColumnGridSql(nCount,NumDial,NumWin,szBuffer);
    	}
          // call SQLFetch to fetch each row of the result set. Extract data
       // value and store it in the display buffer, separated by tabs.
       // continue until SQLFetch fails.
     //	  CenterWindow(hWndFrameSQL);
     y=0;
     // SQLFECTHSCROLL ***************************************************************
           for(nRows = 0; (nReturn = SQLFetchScroll(hstmt,SQL_FETCH_NEXT,0))==SQL_SUCCESS \
    		  || nReturn==SQL_SUCCESS_WITH_INFO;) {
    		   if(nRows >1 ){ 
    		Dialog[NumDial].TabCoordWinGrid[NumWin].LigneAColler =nRows  ;
    		Dialog[NumDial].TabCoordWinGrid[NumWin].LigneClicDroit =nRows  ;
     		CopierLigne(NumDial, NumWin);
      		 CollerLigne(NumDial, NumWin);
    		   }
    		   else
              AllocMallocItemGridSql(nRows,NumDial,NumWin);
     		 for(nCount=1; szBuffer[0]='\0',  nCount<= nCols+1 ; nCount++) {
     
     
    	 SQLGetData(hstmt, (UWORD)(nCount), SQL_C_CHAR,(unsigned char *) szBuffer,\
    		 MAXDATALEN, &dwDataLen );
     
       	 		 AllocAddItemGridSql(nCount,nRows,NumDial,NumWin, (char *)szBuffer);
     			 y++;
     
    		 } 
    		  if(nRows<10) //visual express
    	 {       	 	Dialog[NumDial].TabCoordWinGrid[NumWin].NbLines =nRows +1;
    	  	Dialog[NumDial].TabCoordWinGrid[NumWin].StructureNbLignes=nRows +1;//tres important
     
     
    			  CenterWindow(hWndFrameSQL);
                ShowWindow(hWndFrameSQL, SW_SHOWNORMAL) ;
     	        UpdateWindow(hWndFrameSQL);
    	}
        nRows++;
    	   } 
     
    	     	 	Dialog[NumDial].TabCoordWinGrid[NumWin].NbLines =nRows ;
    	  	Dialog[NumDial].TabCoordWinGrid[NumWin].StructureNbLignes=nRows ;//tres important
     
        	 CenterWindow(hWndFrameSQL);
      	     ShowWindow(hWndFrameSQL, SW_SHOWNORMAL) ;
      	  	    i= UpdateWindow(hWndFrameSQL);
        SQLCloseCursor(hstmt); //important laisser en commentaire voir Query.cpp
       SQLFreeStmt(hstmt, SQL_UNBIND);
       	 while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
                     DispatchMessage (&msg) ;
     
     
         // restore the cursor to default value
       SetCursor(hOldCursor);
       GlobalDoubleValResult = 0;
       return  	msg.wParam;
    }

  3. #3
    Membre averti

    Homme Profil pro
    Inscrit en
    mars 2002
    Messages
    0
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2002
    Messages : 0
    Points : 309
    Points
    309
    Par défaut
    ca ma l'air assez compliquer
    est ce qu'il y aurai une facon de faire des recherche dans ma table plus simplement car je n'utilise que une table dans ma base de données?

    merci d'avance

    si la dificulté était mortelle visual serai un cimetière !

  4. #4
    Expert confirmé Avatar de debug
    Profil pro
    Inscrit en
    avril 2002
    Messages
    1 034
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2002
    Messages : 1 034
    Points : 4 002
    Points
    4 002
    Par défaut
    Voila un code qui peut d'aider enfin j'espère !!



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    int main()
    {
    SQLRETURN	rc;
    SQLHENV		henv;
    SQLHDBC		hdbc1;
    SQLHSTMT	                hstmt1;
     
    char		CodeLivre[7];
    long		CCodeLivre;
    char		Titre[51];
    long		CTitre;
    char		NumSection[5];
    long		CNumSection;
     
    int		Choix;
    char*		MonDSN=new char[20];
     
    // allocation du handle d'environnement et définition de la version
    rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
    rc = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
     
    strcpy(MonDSN,"Bibli Access");
     
    // allocation du handle de connexion et connexion
    rc = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
    rc = SQLConnect(hdbc1, (unsigned char*)MonDSN, SQL_NTS, (unsigned char*) "bibli", SQL_NTS, (unsigned char*)"bibli", SQL_NTS);
     
    // allocation du handle de statement
    rc = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
     
    // Bind Parametre
    rc= SQLBindParameter(hstmt1, 1, SQL_PARAM_INPUT, SQL_C_CHAR,SQL_CHAR, 4, 0, NumSection, 5, &CNumSection);
    CNumSection = SQL_NTS;
     
    // choix de la section
    printf("Choix de la section :");
    fflush(stdin);
    gets(NumSection);
     
    // envoi de la requête de comptage
    rc = SQLExecDirect(hstmt1,(unsigned char*)"SELECT code_livre, titre FROM Livre WHERE code_section= ? ORDER BY Titre", SQL_NTS);
     
    // attache à une variable C
    rc = SQLBindCol(hstmt1, 1, SQL_C_CHAR, CodeLivre, 7, &CCodeLivre);
    rc = SQLBindCol(hstmt1, 2, SQL_C_CHAR, Titre, 51, &CTitre);
     
    // récupération du résultat
    rc = SQLFetch(hstmt1);
     
    // affichage du résultat
    while(rc ==0)
    {
    	printf("Livre : %s , %s\n", CodeLivre, Titre);
    	rc=SQLFetch(hstmt1);
    }
    fflush(stdin);
    getchar();
     
    // fermeture du curseur
    SQLCloseCursor(hstmt1);
     
    // libération des handles et déconnexion
    SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);
    SQLDisconnect(hdbc1);
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
     
    return 0;
    }
    Tu n'a qu'a remplacé :
    - la requete SQL par celle que tu veux.
    - le nom de ta variable paramètre.
    May the Troll, be with you
    (Que le troll soit avec toi)

  5. #5
    Futur Membre du Club
    Inscrit en
    avril 2002
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : avril 2002
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Bien sur, car la facon qui est decrite plus haut est bien trop compliquée!!!!

    Tu déclare ta CDatabase tu fais un open dessus avec le nom de ta base,password,utilisateur et tu declare un CRecordset en lui passant l adresse de ta base et la requete SQL que tu veux.

    Voila, pour toi ca sera du genre
    CDatabase db;
    db.Open(_T("DSN =....,UID = ...., ....);
    tu declare ton recordset :
    CRecordset rs(&db);
    rs.Open("SELECT table.nom,table.adresse,table.prenom FROM table ORDER by table.nom");->regarde la methode CRecordset::Open pour les parametres car je crois qu il y en a d autres!

    et apres tu peux faire rs.MoveFirst() ou MoveNext() ou ....;

    pour modifier tu fais un rs.edit() et tu modifie ton recordset comme tu veux et apres tu fais rs.Update() ..

  6. #6
    Membre averti

    Homme Profil pro
    Inscrit en
    mars 2002
    Messages
    0
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2002
    Messages : 0
    Points : 309
    Points
    309
    Par défaut azertyui
    Peut on déclarer le DSN directement dans l'appli sous Visual où faut il obligatoirement passer par le panneau de configuration Windows????

  7. #7
    Expert confirmé Avatar de debug
    Profil pro
    Inscrit en
    avril 2002
    Messages
    1 034
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2002
    Messages : 1 034
    Points : 4 002
    Points
    4 002
    Par défaut
    Eh bien il y a deux choses différentes :
    - si tu veux utiliser un DSN, il doit obligatoirement existé dans le panneau de configuration WIndows -> outils d'administration -> Source de données ODBC. En fait un DSN est un raccourci.
    - si tu ne veux pas déclarer de DSN, tu utilise directement les attributs de la base c'est à dire : son nom, un login et un password pour te connecter.

    Voila...
    May the Troll, be with you
    (Que le troll soit avec toi)

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    janvier 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2003
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Bonjour à tous,

    Moi aussi je compte acceder à une base Access en c++. Selon les conseils de deftonesMichael, je tente de passer par une CDatabase.

    En lisant un peu la doc dessus, je fais bien #include <afxdb.h>

    Seulement, à peine j'essaye de déclarer une variable:
    ça refuse de compiler (erreur de link, plus précisement)
    Linking...
    nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
    nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex

    Je soupsonne que cela vienne du fait que je sois parti d'un projet Win32 Console Application - Hello world Application. Donc, sans support des MFC par defaut.

    Dois je repartir d'un projet application that supports MFC ??

    Merci de vos lumieres

    wAx

  9. #9
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2003
    Messages : 9 055
    Points : 17 317
    Points
    17 317
    Par défaut
    salut au cas ou
    il des liens interessants sur l'acces ODBC :
    exemple classe STL :
    http://www.codeguru.com/mfc_database/Cidsql.html
    une autre implementation par tom archer:
    http://www.codeguru.com/mfc_database/dynamic_odbc_class.shtml
    sinon regarder sur codeguru
    http://www.codeguru.com/mfc_database/index.shtml
    pleins de possibilites.

  10. #10
    Membre habitué Avatar de BertrandA
    Inscrit en
    août 2003
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : août 2003
    Messages : 170
    Points : 197
    Points
    197
    Par défaut
    si tu veux utiliser un DSN, il doit obligatoirement existé dans le panneau de configuration WIndows
    Il me semble qu'il existe un truc pour créer un DSN dynamiquement s'il n'existe pas dans le panneau de config, mais je n'arrive pas à remettre la main dessus.
    Les orteils servent à trouver les pieds de chaise et les montants de porte quand il fait noir.

  11. #11
    Membre averti
    Inscrit en
    mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : mars 2004
    Messages : 425
    Points : 358
    Points
    358
    Par défaut
    BertrandA!!
    Est ce que tu as retrouvé ton truc pour créer la DNS dynamiquement?

    Merci
    OS:Win 2000 Pro, WIN XP
    SGBD: MS Sql Server, Oracle
    Environnement: VS.NET 2002, JBuilder
    Web: www.ndestudents.com

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    novembre 2004
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2004
    Messages : 1
    Points : 1
    Points
    1
    Par défaut création DNS dynamique
    Bonjour,

    avec l'objet suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    class C_DataBaseMsSql : public CDataBase
    {
    public:
    	C_DataBaseMsSql();
    	~C_DataBaseMsSql() {}
    	bool Init();
    	bool Open();
    	bool GetDriver();
    public:
    	CString m_SDataBaseName;
    };
     
    et le source qui suit:
     
    C_DataBaseMsSql::C_DataBaseMsSql()
    {
    }
     
    bool C_DataBaseMsSql::Init()
    {
    	m_DwConnectOptions = CDatabase::noOdbcDialog; 	m_SDsn = "MQIS";
    	m_SDataBaseName = "nom de la base";
    	m_SServerName = "nom du serveur";
     
    	m_SUserName="sa";
    	m_SPassword = "mot de passe SA";
     
    	GetDriver();
     
    	m_SConnectString.Format("DRIVER={%s};Server=%s;DSN=%s;DataBase=%s;Uid=%s;Pwd=%s",
    		m_SDriver, m_SServerName, m_SDsn, m_SDataBaseName, m_SUserName, m_SPassword);
     
    	return CDataBase::Init();
    }
     
    bool C_DataBaseMsSql::Open()
    {
    	bool returnValue = (m_CDatabase.OpenEx(m_SConnectString, m_DwConnectOptions)==0 ? false : true);
    	if (!returnValue)
    		return false;
    	return CDataBase::Open();
    }
     
    bool C_DataBaseMsSql::GetDriver()
    {
    	char szBuf[2001];
    	WORD cbBufMax = 2000;
    	WORD cbBufOut;
    	char *pszBuf = szBuf;
     
    	// Get the names of the installed drivers ("odbcinst.h" has to be included )
    	if(!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut))
    		return false;
     
    	// Search for the driver...
    	do
    	{
    		if( strstr( pszBuf, "SQL Server" ) != 0 )
    		{
    			// Found !
    			m_SDriver = CString( pszBuf );
    			break;
    		}
    		pszBuf = strchr( pszBuf, '\0' ) + 1;
    	}
    	while( pszBuf[1] != '\0' );
     
    	return true;
    }
    [Attention aux balises de code ,Farscape Merci]

  13. #13
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : juin 2004
    Messages : 722
    Points : 1 123
    Points
    1 123
    Par défaut
    Bonjour ange1708

    Je crois avoir une réponse à ton problème.
    D'abord sache que c'est très simple. De bonnes explications résumé en dix pages seulement est suffisant pour vraiment démarrer avec ODBC.
    Je te conseil le livre Visual C++ 6.0 Chap 20 et 21. Je ne peux pas tout t'expliquer ici.
    Mais je vais être bref.

    1° Crée ta table sous Access comme tu l'as déjà fait.
    2° Tes champs sont : nom, prenom, adresse
    3° N'oublie pas une clé primaire comme le numéro d'ordre dans ta table
    ex: champs type
    N long
    Nom text
    Prenom text
    Adresse text
    4° Va dans panneaux de configuration de Window et trouve l'administrateur ODBC ( par ex sous Windows XP)
    5° Ajoute une source de donnée
    6° Sélectionne le pilote d'access
    7° Selectionne ta database ie le chemin
    8° Valide par OK toutes les boites de dialogues de l'administrateur ODBC
    9° Ouvre l' IDE de Visual C++
    10° Dans l'assistant choisit ton type de projet SDI ou MDI
    11° Sélectionne ta base de données mais attention
    12° Si elle est utilisé en lecture seule choisit l'option snapshot
    13° Si il y a des mise à jour choisit dynaset
    14° Commence par snapshot c'est plus simple
    15° Continue les autres options de configuration de ton projet
    16° Une fois ton projet ouvert tu as deux classes importantes du moins les classes dérivées de ceux-ci CRecordset et CRecordView
    17° CRecordset représente ta requête SQL
    18° CRecordView est un formulaire pour afficher les résultats de ta requête
    19° CRecordset comprend les données membres suivants:
    20° m_strFilter : c'est un CString qui contient la requête
    21° m_strSort : c'est un CString qui contient le nom du champ à trier
    22° il y en a beaucoup d'autres
    23° Dans OnInitialUpdate de la classe dérivée du CRecordView c'est là où tu commence tes requêtes selon tes besoin
    24° Ou dans une quelconque fonction de ton choix

    24° Voici un exemple de code qui peux t'inspirer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     void CMyRecordView::OnInitialUpdate()
    {
    	BeginWaitCursor();
     
    	CPowerCircuitDoc* pDoc = GetDocument();
    	m_pSet = &pDoc->m_MyRecordSet;
    	m_pSet->m_strSort = "[nom]";  // pour trier suivant les noms
    	CRecordView::OnInitialUpdate();   // on se connecte à la base indirectement par CRecordView::OnInitialUpdate
     
    	if(m_pSet->IsOpen())   // on vérifie si la connection à réussie
    	{
    		CString strTitle = m_pSet->m_pDatabase->GetDatabaseName();
    		CString strTable = m_pSet->GetTableName();
     
    		if (!strTable.IsEmpty())
    			strTitle += _T(":") + strTable;
    		else
    			strTitle += _T(": commande: table multiples");
     
    		GetDocument()->SetTitle(strTitle);  // on donne un titre suivant le nom de la table
    	}
     
    	EndWaitCursor();
    }

    Si l'utilisateur entre un nom que tu dois retoruver dans la base voici un peux code rapidement construit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     void CMyRecordView::SelectRecord(CString name)
    { 
       m_pSet->m_NomParam = name;  // à déclarer m_NomParam dans le Recordset
       m_pSet->m_strFilter = "[nom] = ?";  // champ nom égale à ? ie m_NomParam 
       m_pSet->Requery();  // refait la requête
       UpdateData(FALSE);
    }
    Dans la CRecordView crée trois zones d'édition que tu associe aux variables CRecordset ie les champs de la table
    Verifie le dans DoDataExchange de CMyRecordView

    Dans le constructeur tu écrits
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     CMyRecordSet::CMyRecordSet(CDatabase* pdb)
    	: CRecordset(pdb)
    {
    	//{{AFX_FIELD_INIT(CMyRecordSet)
    	m_N = 0;
    	m_Nom = _T("");
    	m_Prenom = _T("");
    	m_Adresse = _T("");
    	m_nFields = 4;
    	//}}AFX_FIELD_INIT
     
    	m_NomParam = _T("");
    	m_nParams = 1;      // précise le nombre de paramêtre ici 1
    	m_nDefaultType = snapshot;
    }
    dans la fonction DoFieldExchange tu écrits
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     void CMyRecordSet::DoFieldExchange(CFieldExchange* pFX)
    {
    	//{{AFX_FIELD_MAP(CMyRecordSet)
    	pFX->SetFieldType(CFieldExchange::outputColumn);
    	RFX_Long(pFX, _T("[N]"), m_N);
    	RFX_Double(pFX, _T("[Nom]"), m_Nom);
    	RFX_Double(pFX, _T("[Prenom]"), m_Prenom);
    	RFX_Double(pFX, _T("[Adresse]"), m_Adresse);
    	//}}AFX_FIELD_MAP
     
                   // if faut définir le paramêtre
    	pFX->SetFieldType(CFieldExchange::param);
    	RFX_Double(pFX, _T("[Nom Param]"), m_NomParam);
    }
    Je crois que ça suffit. Mais d'abord je te conseillerais de lire une très bonne doc sur ODBC avec VC++. Une fois que les bases sont assises alors il est plus facile de répondre à des questions plus spécifiques. Je souhaiterais vivement qu'on prolonge la fac Visual C++ sur les bases de données. Merci

    Gabrielly

Discussions similaires

  1. requete avec la valeur NULL
    Par Hinkel dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 12/11/2008, 16h39
  2. requete avec ibquery 'colonne inconnue'???
    Par mvg dans le forum InterBase
    Réponses: 2
    Dernier message: 01/02/2004, 17h45
  3. Pb d'execution de requete avec un script php
    Par ythierrin dans le forum Requêtes
    Réponses: 3
    Dernier message: 22/08/2003, 14h34
  4. Requete avec une sous-requete... Ne fonctionne qu'a moitie..
    Par mythtvtalk.com dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 18/08/2003, 09h54
  5. Requete avec des décimales
    Par Sandrine75 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 27/06/2003, 10h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo