vc中调用ado的方法
说明:
ole DB是基于com技术的,而ado是ole DB之上的,ADO本身也是基于COM的。
COM编程需要初始化,可以使用CoInitialize,使用完后可以用CoUninitialize释放。
一、在头文件中添加动态连接库文件msado15.dll的导入
假设文件位置为:D:\Program Files\Common Files\System\ado\msado15.dll
导入语句为:
#import "D:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF")
说明:
(1)重命名EOF为rsEOF是因为文件的结尾也为EOF,重命名后方便区分
(2)导入并编译后可以在debug目录下发现两个文件:msado15.tlh;msado15.tli
(3)将上述两个文件导入到工程文件中,msado15.tlh可以看作头文件,msado15.tli看作源文件。当然实际是不需要导入的,在此只是为了查看方便
二、实现方法
(1)方法一
//初始化COM库(调用msado15.dll为COM库调用方式)
CoInitialize(NULL);
//利用_ConnectionPtr这个智能指针构造对象pConn,调用其中的Connection定义
_ConnectionPtr pConn(__uuidof(Connection));
_RecordsetPtr pRst(__uuidof(Recordset));
//Microsoft Access数据库
//pConn->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\vc\LazyCat\data\dhcp.mdb;Persist Security Info=False";
//连接字符串说明:Provider表示驱动引擎;Data Source表示数据库文件名及其完整路径;
//SQL 数据库
pConn->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=;Initial Catalog=pubs";
//连接字符串说明:Provider表示驱动引擎;User ID表示用户名;Password表示口令;Initial Catalog表示数据库名
pConn->Open("","","",adConnectUnspecified);
pRst=pConn->Execute("select * from authors",NULL,adCmdText);
while(!pRst->rsEOF)
{
((CListBox*)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect("au_lname"));
pRst->MoveNext();
}
pRst->Close();
pConn->Close();
pRst.Release();
pConn.Release();
//释放COM库
CoUninitialize();
(2)方法二
//初始化COM库(调用msado15.dll为COM库调用方式)
CoInitialize(NULL);
//利用_ConnectionPtr这个智能指针构造对象pConn,调用其中的Connection定义
_ConnectionPtr pConn(__uuidof(Connection));
_RecordsetPtr pRst(__uuidof(Recordset));
///Microsoft Access数据库
//pConn->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\vc\LazyCat\data\dhcp.mdb;Persist Security Info=False";
//连接字符串说明:Provider表示驱动引擎;Data Source表示数据库文件名及其完整路径;
//SQL 数据库
pConn->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=;Initial Catalog=pubs";
//连接字符串说明:Provider表示驱动引擎;User ID表示用户名;Password表示口令;Initial Catalog表示数据库名
pConn->Open("","","",adConnectUnspecified);
pRst->Open("select * from authors",_variant_t((IDispatch*)pConn),adOpenDynamic,adLockOptimistic,adCmdText);
while(!pRst->rsEOF)
{
((CListBox*)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect("au_lname"));
pRst->MoveNext();
}
pRst->Close();
pConn->Close();
pRst.Release();
pConn.Release();
//释放COM库
CoUninitialize();
(3)方法三
//初始化COM库(调用msado15.dll为COM库调用方式)
CoInitialize(NULL);
//利用_ConnectionPtr这个智能指针构造对象pConn,调用其中的Connection定义
_ConnectionPtr pConn(__uuidof(Connection));
_RecordsetPtr pRst(__uuidof(Recordset));
_CommandPtr pCmd(__uuidof(Command));
//Microsoft Access数据库
//pConn->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\vc\LazyCat\data\dhcp.mdb;Persist Security Info=False";
//连接字符串说明:Provider表示驱动引擎;Data Source表示数据库文件名及其完整路径;
//SQL 数据库
pConn->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=;Initial Catalog=pubs";
//连接字符串说明:Provider表示驱动引擎;User ID表示用户名;Password表示口令;Initial Catalog表示数据库名
pConn->Open("","","",adConnectUnspecified);
pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConn));
pCmd->CommandText="select * from authors";
pRst=pCmd->Execute(NULL,NULL,adCmdText);
while(!pRst->rsEOF)
{
((CListBox*)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect("au_lname"));
pRst->MoveNext();
}
pRst->Close();
pConn->Close();
pCmd.Release();
pRst.Release();
pConn.Release();
//释放COM库
CoUninitialize();
(4)方法四
//定义
_ConnectionPtr pConn;
_RecordsetPtr pRst;
//初始化COM库(调用msado15.dll为COM库调用方式)
CoInitialize(NULL);
//初始化pConn和pRst
pConn.CreateInstance(__uuidof(Connection));
pRst.CreateInstance(__uuidof(Recordset));
//Microsoft Access数据库
//pConn->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\vc\LazyCat\data\dhcp.mdb;Persist Security Info=False";
//连接字符串说明:Provider表示驱动引擎;Data Source表示数据库文件名及其完整路径;
//SQL 数据库
pConn->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=;Initial Catalog=pubs";
//连接字符串说明:Provider表示驱动引擎;User ID表示用户名;Password表示口令;Initial Catalog表示数据库名
pConn->Open("","","",adConnectUnspecified);
pRst=pConn->Execute("select * from authors",NULL,adCmdText);
while(!pRst->rsEOF)
{
((CListBox*)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect("au_lname"));
pRst->MoveNext();
}
pRst->Close();
pConn->Close();
pRst.Release();
pConn.Release();
//释放COM库
CoUninitialize();
三、我实际使用方法
(1)在应用类(MWRCCApp)中定义数据库连接对象m_pConnection。如:
_ConnectionPtr m_pConnection;
(2)在应用类(MWRCCApp)的InitInstance()函数中进行初始化。如:
//初始化数据库
AfxOleInit();///初始化COM库
////////////连接数据库//////////////
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
if(SUCCEEDED(hr))
{
char sTemp[MAX_PATH];
GetCurrentDirectory(sizeof(sTemp),sTemp);
char sConn[1024];
sprintf(sConn,"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s\\dhcp.mdb;Persist Security Info=False",sTemp);
hr = m_pConnection->Open((_bstr_t)sConn,"","",adModeUnknown);///连接数据库
///上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51; }
}
}
catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
return FALSE;
}
(3)在框架类(CMainFrame)中定义数据库记录对象。如:
//增加ADODB数据库定义
_RecordsetPtr m_pRecordset;
(4)读取数据。如:
CString sGroup,sNote,sSQL;
sGroup="....";
sSQL="select * from GroupStructure where GroupName='"+sGroup+"'";
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open((_bstr_t)sSQL,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
sNote=((_variant_t)m_pRecordset->GetCollect("Note")).bstrVal;
......
(5)新增记录。如:
CString sGroupName,sFatherName, sNote,sID;
_variant_t strGroupName,strFatherName,strNote,strID;
strGroupName=sGroupName;
strFatherName=sFatherName;
strNote=sNote;
strID.Format("%d",sID);
CString sSQL="select * from GroupStructure where GroupName='"+sGroupName+"'";
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open((_bstr_t)sSQL,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
m_pRecordset->AddNew();
m_pRecordset->PutCollect("GroupName",strGroupName);
m_pRecordset->PutCollect("FatherName",strFatherName);
m_pRecordset->PutCollect("Note",strNote);
m_pRecordset->PutCollect("ID",strID);
m_pRecordset->Update();
m_pRecordset->Close();
(6)修改记录。如:
CString sGroupName,sFatherName, sNote;
_variant_t strGroupName,strFatherName,strNote;
strGroupName=sGroupName;
strFatherName=sFatherName;
strNote=sNote;
CString sSQL="select * from GroupStructure where GroupName='"+sGroupName+"'";
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open((_bstr_t)sSQL,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
m_pRecordset->PutCollect("Note",strNote);
m_pRecordset->Update();
m_pRecordset->Close();
转自:http://blog.sina.com.cn/s/blog_5f3312e90100h626.html?retcode=0