第一部分:如何建立连接
1. stdafx.h中添加:
#import "c:\Program Files\\Common Files\\System\\ado\\msado15.dll" re_namespace ADODB \
rename("EOF","ADOEOF")
using namespace ADODB;
2. 在当前应用的cpp里定义(和theApp的定义放一起):
_ConnectionPtr m_pCon;
_RecordsetPtr m_pRecord;
3. 在当前应用的cpp里的InitInstance()里:
AfxOleInit(); //初始化COM
m_pCon.CreateInstance("ADODB.Connection");
m_pRecord.CreateInstance("ADBDB.Recordset");
try
{
m_pCon->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=医药管理.mdb;Persist Security Info=False"; //这里表示当前目录下的“医药管理.mdb“
m_pCon->Open("","","",-1);
}
catch(...)
{
AfxMessageBox("数据库连接失败.",0,0);
}
第二部分:如何使用连接
这里会用到m_pCon和m_pRecord两个变量,设置为外部引用
1. 在使用的类中(如:dialog类中)先定义一个方法FindNode
/*************************************************************
功能描述: 利用递归遍历父节点下的所有子节点
参数说明: h_parent标识父节点句柄,str标识父节点文本
*************************************************************/
void CConnAccessDBDlg::FindNode(HTREEITEM h_parent, CString str)
{
_ConnectionPtr tempcon;
_RecordsetPtr temprecord;
tempcon.CreateInstance("ADODB.connection");
temprecord.CreateInstance("ADODB.recordset");
tempcon->ConnectionString = m_pCon->ConnectionString;
tempcon->Open("","","",-1);
CString sql;
sql.Format("select * from leechdomkind where parenttype = '%s'",str);
temprecord = tempcon->Execute((_bstr_t)sql,0,adCmdText);
CString name;
HTREEITEM h_temp;
while (! temprecord->ADOEOF)
{
name =(TCHAR*)(_bstr_t) temprecord->GetFields()->GetItem("leechdomtype")->Value;
h_temp = m_treectrl.InsertItem(name,0,1,h_parent);
FindNode(h_temp,name);
temprecord->MoveNext();
}
}
2. 使用
h_root = m_treectrl.InsertItem("医药管理",0,1);
CString str;
//查询父类药品名称
m_pRecord = m_pCon->Execute("select * from leechdomkind where parenttype is null",0,adCmdText); //m_pRecord为多个记录,下面的while就是遍历出所有的记录
HTREEITEM h_parent;
while (! m_pRecord->ADOEOF)
{
str = (TCHAR*)(_bstr_t)m_pRecord->GetFields()->GetItem("leechdomtype")->Value;
h_parent = m_treectrl.InsertItem(str,0,1,h_root);
//将所有子节点添加到父节点下
FindNode(h_parent,str); //找出当前节点下的所有字段
m_pRecord->MoveNext();
}