INTELLIGENT WORK FORUMS FOR COMPUTER PROFESSIONALS
Come Join Us!
- Talk With Other Members
- Be Notified Of Responses
To Your Posts
- Keyword Search
- Turn Off Ad Banners
- One-Click Access To Your
Favorite Forums
- Automated Signatures
On Your Posts
- Best Of All, It's Free!
*Tek-Tips's functionality depends on members receiving e-mail. By joining you are opting in to receive e-mail.
Partner With Us!
"Best Of Breed" Forums Add Stickiness To Your Site

(Download This Button Today!)
Member Feedback
"...I have tons of books, have book marked tons of tutorials, which have helped, but this forum has answered those "impossible to find" solutions. I am thrilled with this site..."
Geography
Where in the world do Tek-Tips members come from?
|
Microsoft: Visual C++ FAQ
|
DataBase Access
|
shortly DAO, ADO, ODBC, just do it
Posted: 5 Sep 05 (Edited 5 Sep 05)
|
The DAO and ADO codes are described with using ATL, because using OLE2 api directly is more routines than understandable code.
using ODBC:
CODE#include<windows.h> #include<iostream> #include<string> #include<sql.h> #include<sqlext.h> using namespace std; int main() { HENV hEnv; HDBC hDbc; RETCODE rc; int iOut; char strOut[256]; char szDSN[256] = "driver={Microsoft Access Driver (*.mdb)};dbq=[c:\\db1.mdb];"; //dsn samples: //"driver={Microsoft Access Driver (*.mdb)};dbq=[f:\\db1.mdb];" //"driver={SQL Server};pwd={password there};Server={server name};Database={dbname there}" //driver names for different databases: //{SQL Server} //{Microsoft ODBC for Oracle} //{Oracle in oracle9} //{Microsoft Access Driver (*.mdb)} //{MySQL ODBC 3.51 Driver}
char* szSql = "select * from table1"; rc = SQLAllocEnv(&hEnv); rc = SQLAllocConnect(hEnv, &hDbc);
rc = SQLDriverConnect(hDbc, NULL, (unsigned char*)szDSN, SQL_NTS, (unsigned char*)strOut, 255, (SQLSMALLINT*)&iOut, SQL_DRIVER_NOPROMPT); { int ival; char chval[128]; int ret1; int ret2; HSTMT hStmt; rc = SQLAllocStmt(hDbc,&hStmt); rc = SQLPrepare(hStmt,(unsigned char*)szSql, SQL_NTS);//1 //rc = SQLBindCol(hStmt, tab_column, tr_type, tr_value, tr_len, len_or_ind); rc = SQLBindCol(hStmt, 1, SQL_C_ULONG, &ival, 4, (SQLINTEGER*)& ret1); rc = SQLBindCol(hStmt, 2, SQL_C_CHAR, chval, 128, (SQLINTEGER*)&ret2); rc = SQLExecute(hStmt); //2 //if you have queries like drop/create/many update... //instead of //1 //2 and //3 you could use //rc=SQLExecDirectA(hStmt,(unsigned char*)szSql,SQL_NTS); cout<< ">table:"<< endl; while(1) //3 { rc = SQLFetch(hStmt); if(rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)break; cout<< "{"<< ival<<"}{"<< chval<< "}"<< endl; } rc=SQLFreeStmt(hStmt, SQL_DROP); } rc = SQLDisconnect(hDbc); rc = SQLFreeEnv(hEnv); return 0; } //using ADO
CODE#import "G:\Program Files\Common Files\System\ADO\msado15.dll" #include "Debug\msado15.tlh" #include<atlbase.h> #include<iostream>
using namespace std;
int main() { CoInitialize(0); { HRESULT hr = -1; CComPtr<IUnknown> cnnobj; CComPtr<IUnknown> rdsnobj; CComPtr<IUnknown> errobj; hr = cnnobj.CoCreateInstance(L"ADODB.Connection.2.7"); ADODB::_Connection* cnn; ADODB::_Recordset* rds; ADODB::Error* err; BSTR berr; ADODB::Fields* fds; ADODB::Field* fd1; ADODB::Field* fd2;
hr = cnnobj->QueryInterface(&cnn); hr = cnn->Open(L"driver={Microsoft Access Driver (*.mdb)};dbq=[c:\\db1.mdb];", L"", L"", -1); hr = rdsnobj.CoCreateInstance(L"ADODB.Recordset.2.7"); hr = rdsnobj->QueryInterface(&rds);
hr = errobj.CoCreateInstance(L"ADODB.Error.2.7"); hr = errobj->QueryInterface(&err);
hr = rds->put_ActiveConnection(_variant_t(cnn)); hr = rds->Open(_variant_t("select * from Table1"), _variant_t(cnn), ADODB::adOpenUnspecified, ADODB::adLockUnspecified, -1);
VARIANT_BOOL eof; VARIANT_BOOL bof; hr = rds->MoveFirst(); hr = rds->get_Fields(&fds); hr = fds->get_Item(_variant_t(L"X"), &fd1); hr = fds->get_Item(_variant_t(L"Y"), &fd2); BSTR namex; BSTR namey; hr = fd1->get_Name(&namex); hr = fd2->get_Name(&namey);
cout<< "filends count: "<< fds->GetCount()<< endl; wcout<< L"<"<< namex<< L"><"<< namey<< L">"<< endl; VARIANT valx, valy; while(true) { hr = rds->get_EOF(&eof); hr = rds->get_BOF(&bof); if(eof)break; if(bof)break; fd1->get_Value(&valx); fd2->get_Value(&valy); wcout<< L"{"<< (wchar_t*)_bstr_t(_variant_t(valx))<< L"}{"; wcout<< (wchar_t*)_bstr_t(_variant_t(valy))<< L"}"<< endl;
hr = rds->MoveNext(); } hr = rds->Close(); hr = cnn->Close();
} CoUninitialize(); return 0; } using DAO
CODE#import "G:\Program Files\Common Files\Microsoft Shared\DAO\dao360.dll" #include "Debug\dao360.tlh" #include<atlbase.h> #include<iostream>
using namespace std;
int main() { CoInitialize(0); { HRESULT hr = -1; CComPtr<IUnknown> app; DAO::_DBEngine* eng; DAO::Workspace* wr; DAO::Database* db; DAO::Recordset* rs; VARIANT_BOOL eof; VARIANT_BOOL bof; DAO::Fields* fs; DAO::_Field* f1; DAO::_Field* f2; hr = app.CoCreateInstance(L"DAO.DBEngine.36"); hr = app->QueryInterface(&eng); hr = eng->raw_CreateWorkspace(L"TestWorkSpace1", L"Admin", L"", _variant_t(DAO::dbUseJet), &wr); //open dbname, ifexclusive, ifreadonly, connect, retdb hr = wr->raw_OpenDatabase(_bstr_t(L"c:\\db1.mdb"), _variant_t(0), _variant_t(0), _variant_t(L""), &db); hr = db->raw_OpenRecordset(_bstr_t(L"select * from Table1"), _variant_t(DAO::dbOpenDynaset), _variant_t(0), _variant_t(2), &rs); hr = rs->get_Fields(&fs); hr = fs->get_Item(_variant_t(0), &f1); hr = fs->get_Item(_variant_t(1), &f2); wcout<< L"<"<< (BSTR)f1->Name<< L"><" << f2->Name<< L">"<< endl; VARIANT valx, valy; while(true) { hr = rs->get_EOF(&eof); hr = rs->get_BOF(&bof); if(eof)break; if(bof)break; f1->get_Value(&valx); f2->get_Value(&valy); wcout<< L"{"<< (wchar_t*)_bstr_t(_variant_t(valx))<< L"}{"; wcout<< (wchar_t*)_bstr_t(_variant_t(valy))<< L"}"<< endl; hr = rs->MoveNext(); }
hr = hr; } CoUninitialize(); return 0; } |
Back to Microsoft: Visual C++ FAQ Index
Back to Microsoft: Visual C++ Forum
My FAQ Archive
Email This FAQ To A Friend |
|
 |
|