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

来源:互联网 发布:java开发必备技能 编辑:程序博客网 时间:2024/06/13 01:59

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



0 0