PDA

Visualizza la versione completa : Pillola: [VC++] Connessione ai Database con ADO (SELECT, INSERT, DELETE, UPDATE)


Johnny_Depp
22-01-2003, 04:40
/*

ESEMPIO 1 - SELECT

Prima di utilizzare questo codice

1) Creare un database con ACCESS e chiamarlo "mio_database"
creare una tabella e chiamarla "mia_tabella"
inserire nella tabella 3 campi di tipo testo
e chiamarli: "nome", "cognome", "telefono".
Ora inserire nella tabella 2 o 3 record.

2) La prima riga del codice, importa la libreria ADO
"msado15.dll", indispensabile per l'esecuzione
del programma.

*/

#import "c:\Programmi\File comuni\SYSTEM\ADO\msado15.dll" no_namespace rename("EOF","EndOfFile")

#include <stdio.h>
#include <iostream>
using namespace std;

int main(int argc, char* argv[]){

// Inizializzo la libreria COM prima di utilizzare le sue funzioni.
CoInitialize(NULL);

// Costrutto 'try - catch' se si verifica un eccezione (exception) con 'catch' la "catturo"
try{

// Dichiaro un puntatore al recordset (utilizzando la tecnologia ADO)
_RecordsetPtr pRst("ADODB.Recordset");

// Stringa di connessione DSN-Less con un database ACCESS
//_bstr_t strCnn("DRIVER={Microsoft Access Driver (*.mdb)};UID=;PWD=;DBQ=mio_database.mdb");

// Stringa di connessione con DSN Attivo, valida con tutti i database
_bstr_t strCnn("Provider=MSDASQL; Data Source=mio_database; Database=mio_database; User Id=; Password=; Security Info=True");

// Query SQL (seleziono tutto il recordset presemte nella tabella)
pRst->Open("SELECT * FROM mia_tabella;", strCnn, adOpenStatic, adLockReadOnly, adCmdText);

// Muovo il puntatore al recordset sul primo record
pRst->MoveFirst();

// Itero fino alla fine del recordset (<-- totale dei record presenti nella tabella)
while (!pRst->EndOfFile) {

// Visualizzo a video il campo NOME
cout<<(char*) ((_bstr_t) pRst->GetFields()->GetItem("nome")->GetValue())<<endl;

// Visualizzo a video il campo COGNOME
cout<<(char*) ((_bstr_t) pRst->GetFields()->GetItem("cognome")->GetValue())<<endl;

// Visualizzo a video il campo TELEFONO
cout<<(char*) ((_bstr_t) pRst->GetFields()->GetItem("telefono")->GetValue())<<endl<<endl;

// Muovo il puntatore sul record successivo
pRst->MoveNext();
}

// Chiudo connessione al recordset
pRst->Close();

}

// Se si verifica un errore lo catturo
catch (_com_error &exception){

// ... E lo visualizzo a video (con tanto di descrizione)
cout<<"Errore: "<<(char*) exception.Description()<<endl;

}

// libero la memoria utilizzata da COM
CoUninitialize();

return(0);

}


/*

ESEMPIO 2 - INSERT, DELETE, UPDATE

Prima di utilizzare questo codice

1) Creare un database con ACCESS e chiamarlo "mio_database"
creare una tabella e chiamarla "mia_tabella"
inserire nella tabella 3 campi di tipo testo
e chiamarli: "nome", "cognome", "telefono".

2) La prima riga del codice, importa la libreria ADO
"msado15.dll", indispensabile per l'esecuzione
del programma.

*/

#import "c:\Programmi\File comuni\SYSTEM\ADO\msado15.dll" no_namespace rename("EOF","EndOfFile")

#include <iostream>
#include <cstdio>
using namespace std;

int main(int argc, char* argv[]){

char queryString[200], nome[20]="pinco", cognome[20]="pallino", telefono[15]="0622222222";

// Inizializzo la libreria COM prima di utilizzare le sue funzioni.
CoInitialize(NULL);

// Costrutto 'try - catch' se si verifica un eccezione (exception) con 'catch' la "catturo"
try{

// Dichiaro un puntatore alla connessione ADO
_ConnectionPtr pCnn("ADODB.Connection");

// Stringa di connessione al database ACCESS (DSN-LESS)
_bstr_t strCnn("DRIVER={Microsoft Access Driver (*.mdb)};UID=;PWD=;DBQ=mio_database.mdb");

// Stringa di connessione con DSN Attivo, valida con tutti i database
// _bstr_t strCnn("Provider=MSDASQL; Data Source=mio_database; Database=mio_database; User Id=; Password=; Security Info=True");

// Apro la connessione
pCnn->Open(strCnn, "", "", adConnectUnspecified);

// Inserisco nella stringa 'queryString' la Query Sql (INSERT)
sprintf(queryString,"INSERT INTO mia_tabella (nome,cognome,telefono) VALUES ('%s','%s','%s');",nome,cognome,telefono);

// Inserisco nella stringa 'queryString' la Query Sql (DELETE)
// sprintf(queryString,"DELETE FROM mia_tabella WHERE nome = '%s' AND cognome = '%s';",nome,cognome);

// Inserisco nella stringa 'queryString' la Query Sql (UPDATE)
// sprintf(queryString,"UPDATE mia_tabella SET telefono = '0244444444' WHERE nome = '%s' AND cognome = '%s';",nome,cognome);

// Eseguo la Query
pCnn->Execute(queryString, NULL, adCmdText);

// Chiudo la connessione al database
pCnn->Close();

cout<<"Operazione eseguita con successo"<<endl;

}

// Se si verifica un errore lo catturo
catch(_com_error &exception){

// ... E lo visualizzo a video (con tanto di descrizione)
cout<<"Errore: "<<(char*) exception.Description()<<endl;

}

// libero la memoria utilizzata da COM
CoUninitialize();

return(0);

}
N.B.1 Il codice riportato nell'esempio specifico per Microsoft Visual C++ 6.0 (Pertanto con altri compilatori ed altri ambienti potrebbe causare degli errori)

N.B.2 Nell'esempio specifico, viene effettuata una connessione ad un Database Microsoft Access, ma modificando la stringa di connessione (evidenziata in neretto) questo codice vi permette di connettervi anche ad altri Database (testato con: Oracle, SqlServer, MySql)

Andrea Simonassi
22-01-2003, 21:25
Con i compilatori diversi da Microsoft fare dei client COM un'impresa ardua, forse per questo non ha spopolato su altre piattaforme, ma bisogna ammettere che con il VC++ questo codice funziona benissimo.

artedelcorpo
08-01-2006, 11:05
#import and #using available only in C++ compiler

Con Visual C++ 2005 Express edition. Come lo risolvo??? Grazie, Michele

XWolverineX
08-01-2006, 13:47
Stai compilando il tutto come codice di C

alka
08-01-2006, 14:11
Originariamente inviato da artedelcorpo
#import and #using available only in C++ compiler
Con Visual C++ 2005 Express edition. Come lo risolvo???
Ogni nuovo quesito va proposto in una nuova discussione, senza risollevare quelle concluse da tempo.

Ciao! :ciauz:

scancode
04-02-2006, 19:18
x Johnny_Depp

In locale funziona.

Invece non riesco a connettermi al mio db access esterno ossia online sul mio sito da programma.exe:

questa sotto non funge:
_bstr_t strCnn("DRIVER={Microsoft Access Driver (*.mdb)};UID=mioID;PWD=miaPASS;DBQ=http:\\\\www.mi osito.it\\public\\dbBike.mdb");

questa sotto non funge:
_bstr_t strCnn("Provider=MSDASQL; Data Source=www.server.it; Database=http:////www.miosito.it//public//dbBike.mdb; User Id=mioID; Password=miaPASS; Security Info=True");

ma quale il problema come vedete ho messo il db nella cartella public del mio sito... perch non me lo trova!!!!!!

come diavolo devo fare??... cosa che sbaglio
il sito che ospita il mio db aruba e il db l'ho messo nella cartella public... non capisco perch non v

alka
04-02-2006, 20:26
Originariamente inviato da scancode
Invece non riesco a connettermi al mio db access esterno ossia online sul mio sito da programma.exe
Ci che chiedi non consentito.

Ad ogni modo, apri una nuova discussione per ogni diverso quesito da porre.

pigiama
17-02-2006, 17:44
mi da questo tipo di errore che puo essere???

Errore: [Microsoft][Driver Manager ODBC] Nome origine dati non trovato e driver
predefinito non specificato.

ciao grazie!!

alka
15-04-2006, 17:34
"BUMP!"

Loading