採用ADO+ACCESS進行資料庫操作
第一接觸資料庫是2年前在研究生院上課的時候,北京理工大學的一個老太太講的。不是太好!選課失敗!今天做的東西中有根資料庫相關的部分,於是便學了一下,最終決定採用ADO方式防衛ACCESS。 感謝W.C.Y, Z.W.J, W.S.F在這個過程中給與的指導和討論!
(1) 動態建立資料庫
bool createDatabase(std::string &databasefile,std::string &strcnn)
{
//生成Database路徑
strcnn="Provider=Microsoft.JET.OLEDB.4.0;Data source=";
strcnn+=databasefile;
//試圖建立該Database,如果該Database不存在的話,不進行建立
CFileFind fFind;
BOOL bSuccess;
bSuccess=fFind.FindFile(databasefile.c_str());
if(bSuccess)
return true;
else
{
HRESULT hr = S_OK;
try
{
_CatalogPtr m_pCatalog = NULL;
hr = m_pCatalog.CreateInstance(__uuidof (Catalog));
if(FAILED(hr))
{
_com_issue_error(hr);
}
else
{
m_pCatalog->Create(_bstr_t((strcnn.c_str()))); //Create MDB
}
}
catch(_com_error &e)
{
AfxMessageBox("建立資料庫檔案失敗!");
return false;
}
}
return true;
}
(2)準備工作
#import "D:\Program Files\Common Files\System\ADO\msado15.dll" \
rename("EOF", "EndOfFile")
#import "msadox.dll" no_namespace
::CoInitialize(NULL);
::CoUninitialize();
(3)開啟資料庫
ADODB::_ConnectionPtr m_pConnection;
m_pConnection.CreateInstance(__uuidof(ADODB::Connection));
try
{
// 開啟本地Access庫Demo.mdb
m_pConnection->Open(strOpen.c_str(),
"","",ADODB::adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox("資料庫連線失敗,確認資料庫是否存在!");
return;
}
(4)資料庫資訊新增
variant_t RecordsAffected;
//執行SQL命令:CREATE TABLE建立表格
m_pConnection->Execute("CREATE TABLE users(ID INTEGER,Histogram INTEGER)",&RecordsAffected,ADODB::adCmdText);
//往表格裡面新增記錄
// unsigned int i=2;
// unsigned int val=2001;
// m_pConnection->Execute("INSERT INTO users(ID,Histogram)VALUES (1, 200)",&RecordsAffected,ADODB::adCmdText);
// m_pConnection->Execute("INSERT INTO users(ID,Histogram)VALUES (2, 2002)",&RecordsAffected,ADODB::adCmdText);
//向資料庫中新增資料項
ADODB::_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance (__uuidof (ADODB::Recordset));
try
{
m_pRecordset->Open("SELECT * FROM users", // 查詢DemoTable表中所有欄位
m_pConnection.GetInterfacePtr(), // 獲取庫接庫的IDispatch指標
ADODB::adOpenDynamic,
ADODB::adLockOptimistic,
ADODB::adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
return;
}
_variant_t var;
for(int i=0; i<20; i++)
{
m_pRecordset->AddNew();
var.intVal=i;
var.vt=VT_INT;
m_pRecordset->PutCollect("ID",var);
var.intVal=i*i;
m_pRecordset->PutCollect("Histogram",var);
}
m_pRecordset->Update();
m_pRecordset->Close();
m_pRecordset = NULL;
(5)查詢資料庫
可以採用兩種方式,第一種:
ADODB::_CommandPtr m_pCommand;
m_pCommand.CreateInstance(__uuidof(ADODB::Command));
m_pCommand->ActiveConnection = m_pConnection;
m_pCommand->CommandText = "SELECT * FROM users WHERE ID=9";
m_pRecordset = m_pCommand->Execute(NULL, NULL,ADODB::adCmdText);
_variant_t vSum;
vSum = m_pRecordset->GetCollect("Histogram");// m_pRecordset->Fields->GetItem("Histogram")->Value;
CString mystr;
mystr.Format("%d",vSum.intVal);
AfxMessageBox(mystr);
第二種
m_pRecordset=m_pConnection->Execute("SELECT * FROM users WHERE ID=9",&vSum,ADODB::adCmdText);
vSum = m_pRecordset->GetCollect("Histogram");// m_pRecordset->Fields->GetItem("Histogram")->Value; _variant_t vSum;
CString mystr;
mystr.Format("%d",vSum.intVal);
AfxMessageBox(mystr);
std::string strCmd="SELECT COUNT(ID) AS IDCount FROM users";
_variant_t vSum;
m_ppara->m_pRecordset = m_ppara->m_pConnection->Execute(strCmd.c_str(),&vSum,ADODB::adCmdText);
vSum = m_ppara->m_pRecordset->GetCollect("IDCount");
if(vSum.vt == NULL)
return false;
else
{
int nLookup = vSum.intVal;
}
(5)遍歷資料庫
while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("Name");
if(var.vt != VT_NULL)
strName = (LPCSTR)_bstr_t(var);
var = m_pRecordset->GetCollect("Age");
if(var.vt != VT_NULL)
strAge = (LPCSTR)_bstr_t(var);
m_AccessList.AddString( strName + " --> "+strAge );
m_pRecordset->MoveNext();
}
參考文獻:
(1)資料庫查詢方面
http://www.vckbase.com/document/viewdoc/?id=1215
http://www.codeguru.com/cpp/data/mfc_database/ado/article.php/c6729__2/
(2)資料庫建立方面
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/adproprimarykeyxvc.asp
http://www.51cto.com/html/2005/0922/3585.htm
(3) 資料庫升級部分
http://www.codeproject.com/database/ADOImageDB.asp
遇到的典型問題
(1) error C2011: 'DataTypeEnum' : 'enum' type redefinition
解決方案:
#import "msado15.dll" rename("EOF","adoEOF") rename("DataTypeEnum","adoDataTypeEnum")
#import "msadox.dll" rename_namespace("MAJIANGLIN") rename("EOF","adoXEOF") rename("DataTypeEnum","adoXDataTypeEnum")
我試從http://www.blogcn.com/user3/jiangsheng/index.html 伯克商找到的答案, TKS google