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

 

posted @ 2017-10-19 21:01  AfterFive  阅读(1852)  评论(0编辑  收藏  举报