Newsgroup: it.comp.programmare.win32
Titolo: ADO

Non ci credo!
E' possibile che nessuno sa spiegarmi come connettermi ad un db utilizzando
ADO?
Lo vorrei fare con un'applicazione da console (prompt dei comandi)...
Probabilmente si utilizzera' la libreria ADOINT.H... ma vorrei un aiutino da
qualcuno che lo sa fare!
Mi basta istanziare gli oggetto Connection e Recordset e cominciare a fare
una semplice query... non chiedo tanto!
Grazie mille.

 ha scritto nel messaggio
news:XUpV6.497$I37....@news.infostrada.it...

Non so se posso esserti utile....
Non utilizzo ADO per connettermi ai DB, preferisco di gran lunga le API ODBC
che poi sarebbero quelle che usa anche ADO.
Probabilmente avrai notato che tutta la documentazione su MSDN che riguarda
ADO si riferisce al visual basic, per l'utilizzo con Visual C++ c'è solo un
indice di riferimento alla sintassi degli oggetti. La procedura di
connessione non sarà diversa da quella che facevi col VB e penso che te la
potresti copiare tranquillamente rispettando la nuova sintassi.
Se invece vuoi un consiglio..  studiati le API ODBC (ben documentate in C)
e usa quelle.
Buon Divertimento! :-)

e usa quelle.
Ecco un buon consiglio da seguire.
Sai dove posso trovare un tutorial che spieghi come usare queste
funzioni ?
grazie

 ha scritto nel messaggio
news:3b27888...@news.inwind.it...

Il mio ben documentate si riferiva all'MSDN... ci trovi tutto quello che
serve per connetterti ad un database.
Per tutorial non ne conosco mi dispiace!
Ciao

Accetto il consiglio... le voglio studiare!
Ma chiedo troppo con due righe per fare un esempio di come connettersi e
semmai aprire un recordset?
Non sono sfaticato... e amo MSDN... ma non ho molto tempo!!
Giusto per capire e rendermi conto di cosa si tratta!!
P.S.: Preciso che io devo usare OLE-DB e non ODBC... cambia qualcosa?
Grazie mille!
Molebio <mol...@LEVAMIlibero.it> wrote in message
9g8a8a$6ie$1...@nreadA.inwind.it...


P.S.: Preciso che io devo usare OLE-DB e non ODBC... cambia qualcosa?
In ditta non sono io che mi occupo di DB, ma passare da ODBC a OLE-DB
non è semplicissimo, anche se i vantaggi sono notevoli!
Luc.

 Grazie mille!
Cambia tutto, le api sono diverse e immagino che le filosofie di
funzionamento sono diverse!
Se vuoi un esempio di connessione ODBC te la posso postare ma se vuoi
utilizzare OLE-DB e del tutto inutile, suppongo!

Per cominciare a farmi un'idea sarebbe utile anche un esempio via ODBC.
Poi se la cosa e' fattibile... faccio un po' di ricerce per l'OLE-DB.
Grazie.
Molebio <mol...@LEVAMIlibero.it> wrote in message
9ga0dq$vih$1...@nreadA.inwind.it...


 Grazie.
In questo c'č un po' tutto.. non č lo stato dell'arte ma puň servire:
#include <windows.h>
#include <stdio.h>
#include <SQL.H>
#include <SQLEXT.H>
#include <SQLTYPES.H>
SQLHDBC sqlhdbcMain ;
SQLHENV sqlhenvMain ;
char  pcPercorsoDati[_MAX_PATH]   ;
void VisualizzaRitornoInfoODBC(SQLSMALLINT sqlsiTipoHandle,SQLHANDLE
sqlhHandle)
{
 // Ci tornerň, per ora funziona e questo mi basta
 SQLCHAR  sqlcSqlState[6], sqlcMsg[SQL_MAX_MESSAGE_LENGTH] ;
 SQLINTEGER sqliNativeError   ;
 SQLSMALLINT sqlsi, sqlsiMsgLen  ;
 SQLRETURN   rc2       ;
 // Get the status records.
 sqlsi = 1;
 while ((rc2 = SQLGetDiagRec(sqlsiTipoHandle, sqlhHandle, sqlsi,
sqlcSqlState, &sqliNativeError,
   sqlcMsg, sizeof(sqlcMsg), &sqlsiMsgLen)) != SQL_NO_DATA) {
   MessageBox(NULL,(char *) sqlcMsg,(char *)sqlcSqlState,MB_ICONERROR) ;
   sqlsi++;
 }
}
void PercorsoDati(void)
{
   char pcDrive[_MAX_DRIVE] ;
   char pcDir[_MAX_DIR]   ;
   char pcFName[_MAX_FNAME] ;
   char pcExt[_MAX_EXT]   ;
   GetModuleFileName(NULL,pcPercorsoDati,_MAX_PATH)     ;
   _splitpath( pcPercorsoDati, pcDrive, pcDir, pcFName, pcExt ) ;
 lstrcpy(pcPercorsoDati,pcDrive) ;
 lstrcat(pcPercorsoDati,pcDir)  ;
 lstrcat(pcPercorsoDati,"\\miodb.mdb") ;  // Qua ci va il nome del DB che
deve essere nel path dell'applicazione
}
bool ConnectODBC()
{
 /* Perchč sia eseguita una connessione ODBC devo seguire la seguente
procedura...
    SQLAllocHandle(ENV)
    SQLSetEnvAttr
    SQLAllocHandle(DBC)
    SQLConnect
    SQLSetConnectAttr
 */
 // Mi ripartisco lo spazio necessario per il mio handle all'ambiente ODBC
....
 SQLHDBC sqlhdbcTmp ;
 SQLHENV sqlhenvTmp ;
 unsigned char pcConnectionStringOut[4096] ;
 unsigned char pcConnectionStringIn[2048]  ;
 short    lLenConn        ;
 ZeroMemory(pcConnectionStringOut,4096)   ;
 SQLRETURN sqlrtr      ;
 sqlrtr = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &sqlhenvTmp)    ;
 if ( (sqlrtr != SQL_SUCCESS) && (sqlrtr != SQL_SUCCESS_WITH_INFO)) return
false ;
 /*
  Imposto i parametri del mio ambiente ODBC.
  Piů precisamente specificherň al driver di segure le specifiche ODBC 3.x
 */
 sqlrtr = SQLSetEnvAttr(sqlhenvTmp,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)
SQL_OV_ODBC3, SQL_IS_INTEGER) ;
 if (sqlrtr == SQL_ERROR)
 {
  VisualizzaRitornoInfoODBC(SQL_HANDLE_ENV,sqlhenvTmp) ;
  SQLFreeHandle(SQL_HANDLE_ENV,sqlhenvTmp)     ;
  return false              ;
 }
 /*
  Adesso mi ripartisco lo spazio per l'handle della connessione al DB
 */
 sqlrtr = SQLAllocHandle(SQL_HANDLE_DBC, sqlhenvTmp, &sqlhdbcTmp);
 if (sqlrtr == SQL_ERROR)
 {
  VisualizzaRitornoInfoODBC(SQL_HANDLE_ENV,sqlhenvTmp)  ;
  SQLFreeHandle(SQL_HANDLE_ENV,sqlhenvTmp)      ;
  return false               ;
 }
   sprintf((char*)pcConnectionStringIn,"DRIVER={Microsoft Access Driver
(*.mdb)};DBQ=%s",pcPercorsoDati) ;
 sqlrtr =
SQLDriverConnect(sqlhdbcTmp,NULL,pcConnectionStringIn,SQL_NTS,pcConnectionSt
ringOut,4096,&lLenConn,SQL_DRIVER_NOPROMPT);
 if (sqlrtr == SQL_ERROR)
 {
  VisualizzaRitornoInfoODBC(SQL_HANDLE_DBC,sqlhdbcTmp) ;
  SQLFreeHandle(SQL_HANDLE_DBC,sqlhdbcTmp)     ;
  SQLFreeHandle(SQL_HANDLE_ENV,sqlhenvTmp)     ;
  return false              ;
 }
 sqlhdbcMain = sqlhdbcTmp ;
 sqlhenvMain = sqlhenvTmp ;
 /* Connessione riuscita  esco felice e contento */
 return true ;
}
void CloseConnectionODBC()
{
 SQLDisconnect(sqlhdbcMain)      ;
 SQLFreeHandle(SQL_HANDLE_DBC,sqlhdbcMain) ;
 SQLFreeHandle(SQL_HANDLE_ENV,sqlhenvMain) ;
}
int PASCAL WinMain( HINSTANCE hInstance,
       HINSTANCE hPrevInstance,
       LPSTR lpszCmdLine,
       int nCmdShow )
{
 char pcQuery[256] ;
 PercorsoDati() ;
 if (!ConnectODBC())
 {
  MessageBox(NULL,"Impossibile connettersi al database!","Operazione
Annullata",MB_ICONERROR) ;
 }else{
  // sono connesso gioco un po' con il DB
  SQLHSTMT Statement_Handle;
  SQLRETURN risultato;
  if (SQLAllocHandle(SQL_HANDLE_STMT, sqlhdbcMain, &Statement_Handle)==
SQL_ERROR) {
   MessageBox(NULL,"Impossibile allocare lo Statement Handler!","Prova
DB",MB_ICONERROR);
   CloseConnectionODBC() ;
   return(0);
  }
  // Mi creo un tabella per gli esperimenti
  strcpy(pcQuery,"CREATE TABLE TabTMP  (Campo CHAR(50))") ;
  risultato = SQLExecDirect(Statement_Handle,(unsigned
char*)pcQuery,strlen(pcQuery));
  if ((risultato== SQL_ERROR) || (risultato == SQL_INVALID_HANDLE)) {
   VisualizzaRitornoInfoODBC(SQL_HANDLE_STMT,Statement_Handle);
   SQLFreeHandle(SQL_HANDLE_STMT,Statement_Handle);
   CloseConnectionODBC() ;
   return(0);
  }
// La riempio con tre valori
  strcpy(pcQuery,"INSERT INTO TabTMP VALUES ('Pippo')") ;
  risultato = SQLExecDirect(Statement_Handle,(unsigned
char*)pcQuery,strlen(pcQuery));
  if ((risultato== SQL_ERROR) || (risultato == SQL_INVALID_HANDLE)) {
   VisualizzaRitornoInfoODBC(SQL_HANDLE_STMT,Statement_Handle);
   SQLFreeHandle(SQL_HANDLE_STMT,Statement_Handle);
   CloseConnectionODBC() ;
   return(0);
  }
  strcpy(pcQuery,"INSERT INTO TabTMP VALUES ('Pluto')") ;
  risultato = SQLExecDirect(Statement_Handle,(unsigned
char*)pcQuery,strlen(pcQuery));
  if ((risultato== SQL_ERROR) || (risultato == SQL_INVALID_HANDLE)) {
   VisualizzaRitornoInfoODBC(SQL_HANDLE_STMT,Statement_Handle);
   SQLFreeHandle(SQL_HANDLE_STMT,Statement_Handle);
   CloseConnectionODBC() ;
   return(0);
  }
  strcpy(pcQuery,"INSERT INTO TabTMP VALUES ('Paperino')") ;
  risultato = SQLExecDirect(Statement_Handle,(unsigned
char*)pcQuery,strlen(pcQuery));
  if ((risultato== SQL_ERROR) || (risultato == SQL_INVALID_HANDLE)) {
   VisualizzaRitornoInfoODBC(SQL_HANDLE_STMT,Statement_Handle);
   SQLFreeHandle(SQL_HANDLE_STMT,Statement_Handle);
   CloseConnectionODBC() ;
   return(0);
  }
    // adesso vedo che cosa ci ho messo. Che ci sarŕ?
  char pcCampo1[51];
  long lContenuto ;
    // Di seguito c'č il binding cioč l'associazione di un campo della query
ad una mia variabile
  SQLBindCol(Statement_Handle, 1,SQL_C_CHAR,pcCampo1,51,&lContenuto) ;
  // Eseguo la mia query
  if (SQLExecDirect(Statement_Handle,(unsigned char*) "SELECT * FROM
TabTMP",20)== SQL_ERROR)
  {
   VisualizzaRitornoInfoODBC(SQL_HANDLE_STMT,Statement_Handle)  ;
   SQLFreeStmt(Statement_Handle,SQL_HANDLE_STMT)      ;
   CloseConnectionODBC()              ;
   return (0)                  ;
  }
   // Ogni chiamata SQLFetch aggiorna le variabili  collegate alla query
  while ((risultato = SQLFetch(Statement_Handle)) != SQL_NO_DATA)
  {
   MessageBox(NULL,pcCampo1,"Valore Campo",MB_ICONINFORMATION) ;
  }
  SQLCloseCursor(Statement_Handle) ; // Libero lo statement dai risultati
della query
  // Cancello la Tabella e lascio il DB Lindo e pindo
  risultato = SQLExecDirect(Statement_Handle,(unsigned char*)"DROP TABLE
TabTMP",19);
  if ((risultato== SQL_ERROR) || (risultato == SQL_INVALID_HANDLE)) {
   VisualizzaRitornoInfoODBC(SQL_HANDLE_STMT,Statement_Handle);
   SQLFreeHandle(SQL_HANDLE_STMT,Statement_Handle);
   CloseConnectionODBC() ;
   return(0);
  }
  SQLFreeHandle(SQL_HANDLE_STMT,Statement_Handle) ;
  CloseConnectionODBC()         ;
 }
   return (0);
}

#include <SQLTYPES.H>
Il tuo esempio e' interessante . 
Presumo che le funzioni dichiarate nei files header siano definiti in
una libreria .
Dove trovo questa libreria ?
grazie

 grazie
Queste sono le librerie da linkare:
kernel32.lib user32.lib odbc32.lib LIBC.lib
Sono piuttosto standard non dovresti avere difficoltà nel trovarle.
Utilizzo il visual studio e me le propone in automatico per le applicazioni
win32!
Prego e spero ti sia di aiuto !
Ciao

win32!
Ho tutti file tranne il LIBC.LIB .
Me ne manderesti una copia ?
grazie

Me ne manderesti una copia ?
cioč ti mancano le librerie del C???
marco