教你用ADO+VC在程序中完成创建和修改ACCESS数据库
最近MSDN上多了好多问关于数据库方面开发的,这里为了回答一些朋友的问题,特别整理了一个大家容易忽视的很好的技术,相信你读完你也许会恍然大悟,关键的是能对你有帮助才是我的劳动的动力来源。。。
//======================================
用ADO方式新建一个Access数据库文件(*.mdb)
//导入对应Dll
#import "c:/Program Files/Common Files/system/ado/msadox.dll"
::CoInitialize(NULL);
ADOX::_CatalogPtr pCatalog(__uuidof(ADOX::Catalog));
_bstr_t str="Provider=Microsoft.Jet.OLEDB.4.0;data source=C:/xxx.mdb";
try
{
pCatalog->Create(str); //创建数据库
}
catch(_com_error &e)
{
//错误处理
::MessageBox(NULL,_T("数据库创建失败。"), _T("提示"),MB_OK | MB_ICONINFORMATION);
}
CoUninitialize();
/*
插个小广告:
很简单吧?学习的过程中要善于发现!善于创新!善于挑战我们的开发环境,挖掘它的潜能!更是挖掘我们的潜能!~~~
没有你做不到的,就怕你想不到!
继续往下看。。。
*/
//=======================================================
//ADO实现Access数据库表的遍历和字段的遍历(VC版)
CoInitialize(NULL);
_ConnectionPtr pconn(__uuidof(Connection));
_RecordsetPtr prs(__uuidof(Recordset));
pconn->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D://VC//Lesson20//db.mdb;Persist Security Info=False";
pconn->Open("","","",adConnectUnspecified);
prs=pconn->OpenSchema(adSchemaTables);
while (!prs->adoEoF)
{
if (!strcmp((_bstr_t)prs->Fields->GetItem("TABLE_TYPE")->Value,"TABLE"))
{
m_tablelist.AddString((_bstr_t)prs->Fields->GetItem("TABLE_NAME")->Value);
prs->MoveNext();
}
else
prs->MoveNext();
}
prs->Close();
pconn->Close();
prs.Release();
pconn.Release();
CoUninitialize();
//遍历字段的代码:
CString str;
m_tablelist.GetText(m_tablelist.GetCurSel(),str);//通过表列表框得到表的名称
if (m_columnlist.GetCount()>0)
{
m_columnlist.ResetContent();
}
CoInitialize(NULL);
_ConnectionPtr pconn(__uuidof(Connection));
_RecordsetPtr prs(__uuidof(Recordset));
pconn->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D://VC//Lesson20//db.mdb;Persist Security Info=False";
pconn->Open("","","",adConnectUnspecified);
prs=pconn->OpenSchema(adSchemaColumns);
while (!prs->adoEoF)
{
if (!strcmp((_bstr_t)prs->Fields->GetItem("TABLE_NAME")->Value,(_bstr_t)(LPCTSTR)str))
{
int index=m_columnlist.GetCount();
// m_columnlist.AddString((_bstr_t)prs->Fields->GetItem("COLUMN_NAME")->Value);
m_columnlist.InsertString(index,(_bstr_t)prs->Fields->GetItem("COLUMN_NAME")->Value);
prs->MoveNext();
}
else
prs->MoveNext();
}
prs->Close();
pconn->Close();
prs.Release();
pconn.Release();
CoUninitialize();
//呵呵!记住了吗?自己还要多思考!多动手编写代码才能真正提高自己的。
//===================================
//通过程序增加指定的数据库字段
void CUpdateDBDlg::OnUpdateDB()
{
// TODO: 在此添加控件通知处理程序代码
::CoInitialize(NULL);
CString strConnection;
CString strMsg;
CString strTemp1, strTemp2,strAddField1,strAddField2;
_variant_t RecordsAffected;
_ConnectionPtr pConnection;
_RecordsetPtr pRecordset;
strTemp1 = _T("新字段1");
strTemp2 = _T("新字段2");
m_strSelectDB = _T("C://xxx.mdb");
strConnection.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=False;"),m_strSelectDB);
HRESULT hr = pConnection.CreateInstance( __uuidof(Connection) );
if ( FAILED(hr) )
{
::MessageBox(NULL,_T("您系统中的数据库驱动有问题。"), _T("提示"),MB_OK | MB_ICONINFORMATION);
}
pRecordset.CreateInstance( __uuidof(Recordset));
try
{
pConnection->ConnectionTimeout = 18;
pConnection->ConnectionString =_bstr_t(strConnection);
pConnection->Open( _bstr_t(L""), _bstr_t(L""), _bstr_t(L""), -1 );
//需要增加的字段及数据类型
strAddField1 = TEXT("ALTER TABLE Covers ADD COLUMN ") + strTemp1 + TEXT(" int");
pConnection->Execute(_bstr_t(strAddField),&RecordsAffected,adCmdText);
//需要增加的字段及数据类型
strAddField2 = TEXT("ALTER TABLE Covers ADD COLUMN ") + strTemp2 + TEXT(" datetime");
pConnection->Execute(_bstr_t(strAddField),&RecordsAffected,adCmdText);
::MessageBox(NULL,_T("数据库更新成功。"), _T("提示"),MB_OK | MB_ICONINFORMATION);
}
catch( _com_error& e)
{
_bstr_t bstrError = e.Description();
strMsg=(LPCTSTR)bstrError;
::MessageBox(NULL,strMsg, _T("提示"),MB_OK | MB_ICONINFORMATION);
return;
}
pConnection->Close();
pConnection.Release();
CoUninitialize();
}
//
估计通过这个简单的例子你可以使用程序来新建数据库(包括字段),或是增加需要的字段都可以运用自如了。在这里我只是简单的抛砖引玉而已,你可以做出更加强大的而脱离在数据库哪里建数据库的模式的强大软件,当然这里的技术是ADO居于ACCESS数据库的创新,由于本人经验不足,还有些没有考虑得当的地方还请各位读者多多指教,也可以留言反馈你的高见,一块探讨,共同进步!谢谢!
更多交流QQ:343878725
MSN:lbpeking@hotmail.com
/
http://user.qzone.qq.com/343878725