各位,本人写的数据库动态链接库,欢迎观赏
最近本人在做一个要和数据库交互的项目,其中有很多需要环节需要进行数据库操作,所以写了这个动态链接库,也就是DLL。本人写的DLL是MFC规则DLL,可以在MFC程序中调用,非常的简便易用。
首先要说的是数据库参数的配置问题,这些参数包括数据库的类型、版本,如果安全权限则还需要设定密码和口令。故而在本DLL中设计了一个类似于普通MFC EXE程序的参数设定对话框,DBConfigDlg.h和DBConfigDlg.cpp。
一些关键代码为:
程序代码:
void CDBConfigDlg::OnApply() { // TODO: Add your control notification handler code here UpdateData(TRUE); if(BST_CHECKED==((CButton*)GetDlgItem(IDC_PASSWORDENABLE))->GetCheck()) { GetDlgItem(IDC_USERID)->GetWindowText(UserID); GetDlgItem(IDC_PASSWORD)->GetWindowText(Password); } IsApplyed=TRUE; OnOK(); } void CDBConfigDlg::OnCancel() { // TODO: Add extra cleanup here IsApplyed=FALSE; CDialog::OnCancel(); } void CDBConfigDlg::OnPasswordenable() { // TODO: Add your control notification handler code here if(BST_CHECKED==((CButton*)GetDlgItem(IDC_PASSWORDENABLE))->GetCheck()) { GetDlgItem(IDC_USERID)->EnableWindow(TRUE); GetDlgItem(IDC_PASSWORD)->EnableWindow(TRUE); } else { GetDlgItem(IDC_USERID)->SetWindowText(""); GetDlgItem(IDC_PASSWORD)->SetWindowText(""); GetDlgItem(IDC_USERID)->EnableWindow(FALSE); GetDlgItem(IDC_PASSWORD)->EnableWindow(FALSE); } }
然后是数据库的连接函数,此函数在DLL中导出,用于各位调用。
程序代码:
//连接数据库 BOOL __stdcall ConnectDB(DBPARAM* DBParam,_ConnectionPtr pConn) { try { CString connStr; switch(DBParam->DBVersion) { case 0://MS ACCESS2000 connStr=_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=")+DBParam->DBPath+_T(";Persist Security Info=false"); break; case 1://MS ACCESS2003 connStr=_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=")+DBParam->DBPath+_T(";Persist Security Info=false"); break; case 2://MS ACCESS2007 connStr="Provider=Microsoft.ACE.OLEDB.12.0;DataSource="; connStr+=DBParam->DBPath; break; case 3://MS SQL SEVER2000 connStr="Provider=sqloledb;DataSource="; connStr+=DBParam->DBPath; break; case 4://Oracle connStr="Provider=OraOLEDB.Oracle;DataSource="; connStr+=DBParam->DBPath; break; default://MS ACCESS2000 connStr="Provider=Microsoft.Jet.OLEDB.4.0;DataSource="; connStr+=DBParam->DBPath; break; } _bstr_t Connection=connStr; if(DBParam->IsPasswordEnabled)//带密码的访问 pConn->Open(Connection,(LPCTSTR)(DBParam->UserID),(LPCTSTR)(DBParam->Password),adConnectUnspecified); else//不带密码的访问 pConn->Open(Connection,"","",adConnectUnspecified); } catch (_com_error e) { return FALSE; } return TRUE; }
然后是SQL语句的执行函数
程序代码:
BOOL __stdcall CheckRecordSet(CString SQLCommand,_ConnectionPtr pConn,_RecordsetPtr pRecordset) { try { pRecordset->Open(_variant_t(SQLCommand.GetBuffer(SQLCommand.GetLength())),_variant_t(pConn,true),adOpenStatic,adLockOptimistic,adCmdText); } catch(_com_error e) { return FALSE; } return TRUE; }
当然对于DLL来说,接口函数的导出至关重要,这里也把接口函数的导出代码贴出来。
程序代码:
#include "stdafx.h" struct DBPARAM { BOOL IsPasswordEnabled; int DBVersion; CString Password; CString UserID; CString DBPath; }; extern "C" __declspec(dllexport) BOOL __stdcall SetDBParams(DBPARAM* DBParam); extern "C" __declspec(dllexport) BOOL __stdcall ConnectDB(DBPARAM* DBParam,_ConnectionPtr pConn); extern "C" __declspec(dllexport) BOOL __stdcall CheckRecordSet(CString SQLCommand,_ConnectionPtr pConn,_RecordsetPtr pRecordset);
最后自己写了一个测试程序,用于测试该DLL,运行效果如图:
需要程序代码的,发E-mail至worm.msblast@