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