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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM