学自<vc++开发技术大全>
ADOConn.h
#pragma once
#import "c:\Program Files\Common Files\System\ado\msado15.dll"no_namespace \
rename("EOF", "adoEOF")rename("BOF", "adoBOF")
class ADOConn
{
private:
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
public:
ADOConn(void);
~ADOConn(void);
void OnInitADOConn(void);
void ExitConnect(void);
_RecordsetPtr GetRecordSet(_bstr_t bstrSql);
bool ExecuteSQL(_bstr_t bstrSql);
};
ADOConn.cpp
#include "StdAfx.h"
#include "ADOConn.h"
ADOConn::ADOConn(void)
{
}
ADOConn::~ADOConn(void)
{
}
void ADOConn::OnInitADOConn(void)
{
//初始化ole/com库环境
::CoInitialize(NULL);
try
{
//创建connection对象
m_pConnection.CreateInstance("ADODB.Connection");
//设置连接字符串
_bstr_t strConnect="uid=;pwd=;Server=;Provider=SQLOLEDB;Database=;";
m_pConnection->Open(strConnect, "", "", adModeUnknown);
}
//捕捉异常
catch(_com_error e)
{
//显示错误信息
AfxMessageBox(e.Description());
}
}
void ADOConn::ExitConnect(void)
{
//关闭记录集和连接
if (m_pRecordset != NULL)
m_pRecordset->Close();
m_pConnection->Close();
//释放环境
::CoUninitialize();
}
_RecordsetPtr ADOConn::GetRecordSet(_bstr_t bstrSql)
{
try
{
//连接数据库,如果connection是空,则重新连接数据库
if (m_pConnection == NULL)
OnInitADOConn();
//创建记录对象
m_pRecordset.CreateInstance(__uuidof(Recordset));
//取得表中的记录
m_pRecordset->Open(bstrSql, m_pConnection.GetInterfacePtr(), adOpenDynamic,
adLockOptimistic, adCmdText);
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
}
//返回记录集
return m_pRecordset;
}
bool ADOConn::ExecuteSQL(_bstr_t bstrSql)
{
_variant_t recordsAffected;
try
{
//数据库是否已连接
if (m_pConnection == NULL)
OnInitADOConn();
m_pConnection->Execute(bstrSql, NULL, adCmdText);
return true;
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
return false;
}
return false;
}
list<int> nodeList;
HTREEITEM hRoot;
HTREEITEM hChild;
ADOConn m_adoConn;
m_adoConn.OnInitADOConn();
CString sql("select * from tb_node where nodestatus=0 order by nodeleft asc");
_RecordsetPtr m_pRecordset;
m_pRecordset = m_adoConn.GetRecordSet((_bstr_t)sql);
///遍历
NODE node;
while (m_pRecordset->adoEOF == 0)
{
strcpy_s(node.nodeName, (char*)(_bstr_t)m_pRecordset->GetCollect("nodeName"));
node.nodeLeft = m_pRecordset->GetCollect("nodeLeft");
node.nodeRight = m_pRecordset->GetCollect("nodeRight");
vecNode.push_back(node);
//CString s(node.nodeName);
//AfxMessageBox(s);
m_pRecordset->MoveNext();
}
//断开数据库
m_adoConn.ExitConnect();
//建立根节点
CString sTemp(vecNode[0].nodeName);
hRoot = m_nodeTree.InsertItem(sTemp);
vecNode[0].nodeTreeItem = hRoot;
nodeList.push_back(0);
while (!nodeList.empty())
{
//1、读取
int front = nodeList.front();
int childNum = (vecNode[front].nodeRight - vecNode[front].nodeLeft - 1) / 2;
//2、宽度遍历
int i = front + 1;
while (i <= front + childNum)
{
//插入队列
CString sTemp(vecNode[i].nodeName);
hChild = m_nodeTree.InsertItem(sTemp, vecNode[front].nodeTreeItem);
vecNode[i].nodeTreeItem = hChild;
nodeList.push_back(i);
//下标跳跃
i = i + 1 + (vecNode[i].nodeRight - vecNode[i].nodeLeft - 1) / 2;
}
//最后弹出
nodeList.pop_front();
}