C++ 的数据库操作类ListControl显示
基于ADO
DBHelper.h
#pragma once #include <string> using namespace std; class DBHelper { public: DBHelper(); ~DBHelper(); protected: //数据库连接指针 _ConnectionPtr m_pConnection; _RecordsetPtr m_pResultset; _CommandPtr m_pCommand; public: CString getConnect();//获得连接字符串 bool OpenCon();//打开数据库连接 int ExecuteQuery(_bstr_t sql);//查询数据 string GetString(int index);//获取某条记录 bool ExecuteUpdate(_bstr_t sql);//更新数据 bool CloseRecordSet();//关闭记录集 bool CloseConnection();//关闭连接 _RecordsetPtr getRecordset(_bstr_t sql);//记录集 };
DBHelper.CPP
#include "stdafx.h" #include "DBHelper.h" #include <iostream> using namespace std; DBHelper::DBHelper() { CoInitialize(NULL);//构造函数里面初始化组件 m_pConnection = NULL; } DBHelper::~DBHelper() { CloseRecordSet();//关闭记录集 CloseConnection();//关闭连接 } CString DBHelper::getConnect() { CString strCon; CString des = _T(""); ::GetCurrentDirectory(MAX_PATH, des.GetBuffer(MAX_PATH)); des.ReleaseBuffer(); des += "\\config.ini";//根目录下配置文件 GetPrivateProfileString(_T("DataBaseInfo"), _T("数据库连接字符串"), _T(""), strCon.GetBuffer(MAX_PATH), MAX_PATH, des);//读取配置文件 strCon.ReleaseBuffer(); return strCon; } bool DBHelper::OpenCon() { if (m_pConnection != NULL && m_pConnection->State) //如果已经打开,直接返回 return true; try { HRESULT hr = m_pConnection.CreateInstance(__uuidof(Connection)); if (FAILED(hr)) { MessageBox(NULL, _T("ConnectionPtr对象指针实例化失败!"), _T("提示"), MB_OK); } _bstr_t connStr = DBHelper::getConnect();//将配置文件字符串赋值 m_pConnection->Open(connStr, "", "", adModeUnknown);//打开数据库连接 } catch (_com_error e) { MessageBox(NULL, _T("数据库连接失败,确认数据库配置正确!"), _T("提示"), MB_OK); return false; } return true; } int DBHelper::ExecuteQuery(_bstr_t sql)//查询数据 { try { if (DBHelper::OpenCon()) { //m_pCommand.CreateInstance(__uuidof(Command)); _variant_t RecordsAffected;//查询返回值 m_pConnection->Execute(sql, &RecordsAffected, adCmdText); return RecordsAffected.intVal;//返回值类型转换int } else return false; } catch (_com_error e) { MessageBox(NULL, e.ErrorMessage(), _T("提示"), MB_OK);//捕捉错误信息 return -1; //cout << "统计记录数出错:" << e.ErrorMessage() << endl; } } bool DBHelper::CloseRecordSet() { try { if (m_pResultset != NULL && m_pResultset->State != adStateClosed) { m_pResultset->Close(); m_pResultset.Release(); } } catch (_com_error e) { return false; } return true; } bool DBHelper::CloseConnection() { try { if (m_pConnection->State != adStateClosed) { m_pConnection->Close(); m_pConnection.Release(); } } catch (_com_error e) { return false; } return true; } _RecordsetPtr DBHelper::getRecordset(_bstr_t sql) { if (DBHelper::OpenCon()) { m_pResultset.CreateInstance(__uuidof(Recordset)); m_pResultset->Open(sql, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); return m_pResultset; } }
下面介绍一下如何调用这个类
工程根目录下新建一个config.ini文件(Debug目录下也可以),文件内容
DataBaseInfo] 数据库连接字符串=Provider=SQLOLEDB;Server=WIN-1R70VSM9;Database=AIS2017064138; uid=sa; pwd=123
stdafx.h 里面最后一个#endif 前面添加
#import "c:\program files\common files\system\ado\msado15.dll" \no_namespace \ rename ("EOF", "adoEOF")
所在下面testDlg.h 包含头文件
#include "DBHelper.h"
testDlg.h(cpp文件里面也可以,看你是定义局部变量还是全局)
声明刚才的类和变量
_RecordsetPtr pSet;//记录集指针 DBHelper db;//数据库操作类
CListCtrl m_list; 添加一个ListControl控件并定义控件变量为m_list
K3Item k3;//类
_variant_t vFItemID,vItemId, vItemName, vItemModel, vTiepian, vShoudong;
int Rows;//行记录
定义一个K3Item 的类
#pragma once class K3Item { public: K3Item(void); CString ItemId; //物料代码 CString ItemName;//物料名称 CString ItemModel; //规格型号 CString tiepian; //贴片焊点 CString shougong; //手工焊点 CString FItemId; //物料顺序号 ~K3Item(void); };
K3Item.cpp
#include "StdAfx.h" #include "K3Item.h" K3Item::K3Item(void) { } K3Item::~K3Item(void) { }
Testdlg.CPP文件调用
m_list.InsertColumn(0,_T("物料代码"), LVCFMT_LEFT, 110 );//定义列头
m_list.InsertColumn(1,_T("物料名称"), LVCFMT_LEFT, 180 );
m_list.InsertColumn(2,_T("规格型号"), LVCFMT_LEFT, 355 );//
m_list.InsertColumn(3,_T("贴片焊点"), LVCFMT_LEFT, 90 );
m_list.InsertColumn(4,_T("手工焊点"), LVCFMT_LEFT, 90 );//
m_list.InsertColumn(5, _T("唯一标识"), LVCFMT_LEFT, 0);//设置列宽为0,视为隐藏
m_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FLATSB | LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER );
//记得要设置ListControl 属性栏中View 设置为Report
_bstr_t bstrSQL("select FItemID,FNumber,FName,FModel,FStandardManHour,FStandardCost from t_ICItem where FDeleted='0'"); try{ m_list.DeleteAllItems();//清除所有内容 pSet = db.getRecordset(sql); while (!pSet->adoEOF) { Rows = m_list.GetItemCount();//获取当前行号 vItemId = pSet->GetCollect("FNumber"); vItemName = pSet->GetCollect("FName"); vItemModel = pSet->GetCollect("FModel"); vTiepian = pSet->GetCollect("FStandardManHour"); vShoudong = pSet->GetCollect("FStandardCost"); vFItemID = pSet->GetCollect("FItemID"); if (vItemId.vt != VT_NULL)//物料代码 { k3.ItemId = (LPCSTR)_bstr_t(vItemId); m_list.InsertItem(Rows, k3.ItemId); } if (vItemName.vt != VT_NULL)//物料名称 { k3.ItemName = (LPCSTR)_bstr_t(vItemName); m_list.SetItemText(Rows, 1, k3.ItemName); } if (vItemModel.vt != VT_NULL)//规格型号 { k3.ItemModel = (LPCSTR)_bstr_t(vItemModel); m_list.SetItemText(Rows, 2, k3.ItemModel); } if (vTiepian.vt != VT_NULL)//贴片焊点 { k3.tiepian = (LPCSTR)_bstr_t(vTiepian); m_list.SetItemText(Rows, 3, k3.tiepian); } if (vShoudong.vt != VT_NULL)//手工焊点 { k3.shougong = (LPCSTR)_bstr_t(vShoudong); m_list.SetItemText(Rows, 4, k3.shougong); } if (vFItemID.vt != VT_NULL)//物料唯一标识 { k3.FItemId = (LPCSTR)_bstr_t(vFItemID); m_list.SetItemText(Rows, 5, k3.FItemId); } pSet->MoveNext(); } } catch (_com_error e) { MessageBox(e.ErrorMessage(), _T("提示"), MB_OK);//捕捉错误信息 } db.CloseRecordSet(); db.CloseConnection();