c++利用ado访问sqlserver数据库

学自<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;
}


实现部分代码在OnInit

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();
	}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值