程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 操作ACCESS的類CADOConn

操作ACCESS的類CADOConn

編輯:C++入門知識

[cpp]
// ADOConn.h: interface for the CADOConn class.  
//  
//////////////////////////////////////////////////////////////////////  
 
#if !defined(AFX_ADOCONN_H__6FC87078_9BAB_4B1F_B205_E932FD387E09__INCLUDED_)  
#define AFX_ADOCONN_H__6FC87078_9BAB_4B1F_B205_E932FD387E09__INCLUDED_  
 
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF")  
 
#define ado_Field_Str 202  
#define ado_Field_Text 203  
#define ado_Field_Int 2  
#define ado_Field_Long 3  
#define ado_Field_Float 4  
#define ado_Field_Double 5  
#define ado_Field_Date 7  
#define ado_Field_Byte 17  
 
 
#ifdef _DEBUG  
    #define ASSERT_VALID_STRING( str ) ASSERT( !IsBadStringPtr( str, 0xfffff ) )  
#else   //  _DEBUG  
    #define ASSERT_VALID_STRING( str ) ( (void)0 )  
#endif  //  _DEBUG  
 
class CADOConn   

public: 
    _ConnectionPtr m_pConnection; 
    _RecordsetPtr m_pRecordset; 
    _bstr_t m_strDatabaseName; 
    int m_iDatabaseType; 
     
    CADOConn(); 
    CADOConn(CString m_strDatabaseName); 
    virtual ~CADOConn(); 
    CString GetAppPath(); 
    void InitCADOConn(); 
    void ExitConnect(); 
    _RecordsetPtr& GetRecordSet(CString strSQL); 
    BOOL Open(CString strSQL); 
    BOOL ExecuteSQL(CString strSQL); 
    BOOL MoveFirst(); 
    BOOL MoveNext(); 
    CString GetItemString(int index); 
    int GetItemInt(int index); 
    long GetItemLong(int index); 
    BOOL adoEOF(); 
    CString GetFieldName(int index); 
    int GetFieldsCount(); 
    long GetRecordCount(); 
    BOOL InitList(CListCtrl *listMain); 
    BOOL FillList(CListCtrl *listMain); 
}; 
 
#endif // !defined(AFX_ADOCONN_H__6FC87078_9BAB_4B1F_B205_E932FD387E09__INCLUDED_)  
 
 
 
// ADOConn.cpp: implementation of the CADOConn class.  
//  
//////////////////////////////////////////////////////////////////////  
 
#include "stdafx.h"  
#include "ADOConn.h"  
 
 
#ifdef _DEBUG  
#undef THIS_FILE  
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW  
#endif  
 
//////////////////////////////////////////////////////////////////////  
// Construction/Destruction  
//////////////////////////////////////////////////////////////////////  
 
 
CADOConn::CADOConn() 

    //數據庫類型:Access  
    m_iDatabaseType = 1; 
    m_strDatabaseName = _bstr_t("ShopSale.mdb"); 

 
CADOConn::~CADOConn() 

     

 
/************************************************************************
函數名:  CADOConn
作  者:    譚友亮(Charles Tan)
日  期:    2013-3-5
作  用:  將數據庫名稱傳遞給m_strDatabaseName,並判斷數據庫類型
形參數:  strDatabaseName 數據庫名稱
返回值:  
修改記錄:                                             
************************************************************************/ 
CADOConn::CADOConn(CString strDatabaseName) 

    CString strFormat; 
    strDatabaseName.TrimLeft(); 
    strDatabaseName.TrimRight(); 
    m_strDatabaseName = _bstr_t(strDatabaseName); 
    strFormat = strDatabaseName.Right(strDatabaseName.GetLength() - strDatabaseName.ReverseFind('.') - 1); 
 
    if(strFormat == "mdb") 
    { 
        m_iDatabaseType = 1; 
    } 
    if(strFormat == "xls" || strFormat == "xlsx") 
    { 
        m_iDatabaseType = 2; 
    } 

 
/************************************************************************
函數名:  GetAppPath
作  者:    譚友亮(Charles Tan)
日  期:    2013-3-18
作  用:  獲取當前程序的可執行文件所在的目錄
形參數:  
返回值:  
修改記錄:                                             
************************************************************************/ 
CString CADOConn::GetAppPath() 

    char lpFilePath[MAX_PATH]; 
    CString strPath; 
 
    GetModuleFileName(AfxGetInstanceHandle(), lpFilePath, MAX_PATH); 
    strPath = lpFilePath; 
    strPath = strPath.Left(strPath.ReverseFind('\\')); 
 
    return strPath; 

 
/************************************************************************
函數名:  InitCADOConn
作  者:    譚友亮(Charles Tan)
日  期:    2013-3-5
作  用:  初始化數據庫連接
形參數:  
返回值:  
修改記錄:                                             
************************************************************************/ 
void CADOConn::InitCADOConn() 

    CString toolPath = GetAppPath(); 
 
    //初始化OLE/COM庫環境  
    ::CoInitialize(NULL); 
    try 
    { 
        m_pConnection = NULL; 
        m_pRecordset = NULL; 
        //創建Connection對象  
        m_pConnection.CreateInstance("ADODB.Connection"); 
        //設置連接字符串,必須是BSTR型或者_bstr_t類型  
        _bstr_t strConnect; 
 
        switch(m_iDatabaseType) 
        { 
        case 1://ACCESS  
            strConnect = _bstr_t("Provider = Microsoft.Jet.OLEDB.4.0;Data Source = "); 
            strConnect = strConnect + _bstr_t(toolPath) + _bstr_t("\\data\\") + m_strDatabaseName; 
            break; 
        case 2://EXCEL  
            strConnect = _bstr_t("Provider = Microsoft.Jet.OLEDB.4.0;Data Source = "); 
            strConnect = strConnect + _bstr_t(toolPath) + _bstr_t("\\") + m_strDatabaseName; 
            strConnect = strConnect + ";Extended Properties=Excel 8.0";      
            break;   
        case 3://SQL SERVER  
            strConnect = _bstr_t("Provider = Microsoft.Jet.OLEDB.4.0;Data Source = "); 
            strConnect = strConnect + _bstr_t(toolPath) + _bstr_t("\\") + m_strDatabaseName; 
            strConnect = strConnect + ";Extended Properties=Excel 8.0";      
            break; 
        } 
 
        m_pConnection->Open(strConnect, _bstr_t(""), _bstr_t(""), adModeUnknown); 
        //ShellExecute(NULL, _T("open"), toolPath + "\\" + m_strDatabaseName, NULL, NULL, SW_SHOWMAXIMIZED);  
    } 
    catch(_com_error e) 
    { 
        AfxMessageBox(e.Description()); 
    } 

 
/************************************************************************
函數名:  GetRecordSet
作  者:    譚友亮(Charles Tan)
日  期:    2013-3-5
作  用:  執行查詢
形參數:  strSQL SQL語句
返回值:  m_pRecordset 字段集的指針
修改記錄:                                             
************************************************************************/ 
_RecordsetPtr& CADOConn::GetRecordSet(CString strSQL) 

    try 
    { 
        //連接數據庫,如果Connection對象為空,則重新連接數據庫  
        if(m_pConnection == NULL) 
        { 
            InitCADOConn(); 
        } 
 
        strSQL.TrimLeft(); 
        strSQL.TrimRight(); 
        //創建記錄集對象  
        m_pRecordset.CreateInstance(__uuidof(Recordset)); 
        //取得表中的記錄  
        m_pRecordset->Open(_bstr_t(strSQL), m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); 
        return m_pRecordset; 
    } 
    catch(_com_error e) 
    { 
        AfxMessageBox(e.Description()); 
    } 
     
    return m_pRecordset; 

 
/************************************************************************
函數名:  Open
作  者:    譚友亮(Charles Tan)
日  期:    2013-3-5
作  用:  打開字符集
形參數:  strSQL SQL語句
返回值:  TRUE:成功 FALSE:失敗
修改記錄:                                             
************************************************************************/ 
BOOL CADOConn::Open(CString strSQL) 

    try 
    { 
        //連接數據庫,如果Connection對象為空,則重新連接數據庫  
        if(m_pConnection == NULL) 
        { 
            InitCADOConn(); 
        } 
 
        strSQL.TrimLeft(); 
        strSQL.TrimRight(); 
        //創建記錄集對象  
        m_pRecordset.CreateInstance(__uuidof(Recordset)); 
        //取得表中的記錄  
        m_pRecordset->Open(_bstr_t(strSQL), m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); 
    } 
    catch(_com_error e) 
    { 
        AfxMessageBox(e.Description()); 
        return FALSE; 
    } 
 
    return TRUE; 

 
/************************************************************************
函數名:  ExecuteSQL
作  者:    譚友亮(Charles Tan)
日  期:    2013-3-5
作  用:  執行SQL語句(Insert Update delete)
形參數:  strSQL SQL語句
返回值:  TRUE:成功 FALSE:失敗
修改記錄:                                             
************************************************************************/ 
BOOL CADOConn::ExecuteSQL(CString strSQL) 

    try 
    { 
        //連接數據庫,如果Connection對象為空,則重新連接數據庫  
        if(m_pConnection == NULL) 
        { 
            InitCADOConn(); 
        } 
         
        strSQL.TrimLeft(); 
        strSQL.TrimRight(); 
        m_pConnection->Execute(_bstr_t(strSQL), NULL, adCmdText); 
        return TRUE; 
    } 
    catch(_com_error e) 
    { 
        AfxMessageBox(e.Description()); 
        return FALSE; 
    } 
    return TRUE; 

 
/************************************************************************
函數名:  MoveFirst
作  者:    譚友亮(Charles Tan)
日  期:    2013-3-6
作  用:  記錄集移向開頭
形參數:  
返回值:  TRUE:成功 FALSE:失敗
修改記錄:                                             
************************************************************************/ 
BOOL CADOConn::MoveFirst() 

    if(m_pRecordset == NULL) 
    { 
        return FALSE; 
    } 
    else 
    { 
        m_pRecordset->MoveFirst(); 
        return TRUE; 
    } 

 
/************************************************************************
函數名:  MoveNext
作  者:    譚友亮(Charles Tan)
日  期:    2013-3-6
作  用:  記錄集向下移動
形參數:  
返回值:  TRUE:成功 FALSE:失敗
修改記錄:                                             
************************************************************************/ 
BOOL CADOConn::MoveNext() 

    if(m_pRecordset == NULL) 
    { 
        return FALSE; 
    } 
    else 
    { 
        if(!m_pRecordset->adoEOF) 
        { 
            m_pRecordset->MoveNext(); 
            return TRUE; 
        } 
        else 
        { 
            return FALSE; 
        } 
    } 

 
/************************************************************************
函數名:  GetItemString
作  者:    譚友亮(Charles Tan)
日  期:    2013-3-6
作  用:  取得字段中的字符串
形參數:  index:字段集中的索引
返回值:  
修改記錄:                                             
************************************************************************/ 
CString CADOConn::GetItemString(int index) 

    _variant_t vValue; 
    _variant_t vIndex; 
    CString strValue, str; 
 
    if (m_pRecordset == NULL || m_pRecordset->adoEOF) 
    { 
        return ""; 
    } 
 
    vIndex.vt = VT_I2; 
    vIndex.iVal = index; 
    vValue = m_pRecordset->GetCollect(vIndex); 
//  vValue = m_pRecordset->Fields->GetItem(vIndex)->Value;  
 
    switch(vValue.vt) 
    { 
    case VT_NULL: 
        str = ""; 
        break; 
    case VT_ERROR: 
        str = ""; 
        break; 
    case VT_EMPTY: 
        str = ""; 
        break; 
    default: 
        str = (LPCTSTR)_bstr_t(vValue); 
    } 
     
    strValue.Format(_T("%s"), str); 
    strValue.TrimRight(); 
    strValue.TrimLeft(); 
     
    return strValue; 

 
/************************************************************************
函數名:  GetItemInt
作  者:    譚友亮(Charles Tan)
日  期:    2013-3-18
作  用:  取得字段中的整數
形參數:  index:字段集中的索引
返回值:  
修改記錄:                                             
************************************************************************/ 
int CADOConn::GetItemInt(int index) 

    _variant_t vValue; 
    _variant_t vIndex; 
    int iValue; 
 
    if (m_pRecordset == NULL || m_pRecordset->adoEOF) 
    { 
        exit(1); 
    } 
 
    vIndex.vt = VT_I2; 
    vIndex.iVal = index; 
    vValue = m_pRecordset->GetCollect(vIndex); 
//  vValue = m_pRecordset->Fields->GetItem(vIndex)->Value;  
 
    switch(vValue.vt) 
    { 
    case VT_NULL: 
        iValue = 0; 
        break; 
    case VT_ERROR: 
        iValue = 0; 
        break; 
    case VT_EMPTY: 
        iValue = 0; 
        break; 
    default: 
        iValue = vValue.iVal; 
    } 
     
    return iValue; 

 
/************************************************************************
函數名:  GetItemLong
作  者:    譚友亮(Charles Tan)
日  期:    2013-3-18
作  用:  取得字段中的整數
形參數:  index:字段集中的索引
返回值:  
修改記錄:                                             
************************************************************************/ 
long CADOConn::GetItemLong(int index) 

    long lValue; 
    _variant_t vIndex; 
    _variant_t vValue; 
 
    vIndex.vt = VT_I2; 
    vIndex.iVal = index; 
    vValue = m_pRecordset->Fields->GetItem(vIndex)->Value; 
 
    switch(vValue.vt) 
    { 
    case VT_NULL: 
        lValue = 0; 
        break; 
    case VT_ERROR: 
        lValue = 0; 
        break; 
    case VT_EMPTY: 
        lValue = 0; 
        break; 
    default: 
        lValue = vValue.lVal; 
    } 
     
    return lValue; 

 
/************************************************************************
函數名:  GetFieldName
作  者:    譚友亮(Charles Tan)
日  期:    2013-3-6
作  用:  取得列標題
形參數:  index:字段集中的索引,最小值為0
返回值:  
修改記錄:                                             
************************************************************************/ 
CString CADOConn::GetFieldName(int index) 

    _variant_t vIndex; 
    CString strFieldName; 
     
    if (index < m_pRecordset->Fields->Count) 
    { 
        vIndex.vt = VT_I2; 
        vIndex.iVal = index; 
        strFieldName = (LPCTSTR)m_pRecordset->Fields->GetItem(vIndex)->GetName(); 
    } 
    else 
    { 
        AfxMessageBox("Invalid index!"); 
    } 
     
    return strFieldName; 

 
/************************************************************************
函數名:  GetFieldsCount
作  者:    譚友亮(Charles Tan)
日  期:    2013-3-6
作  用:  取得列數
形參數:  
返回值:  
修改記錄:                                             
************************************************************************/ 
int CADOConn::GetFieldsCount() 

    int colNum = m_pRecordset->Fields->Count; 
    return colNum; 

 
/************************************************************************
函數名:  adoEOF
作  者:    譚友亮(Charles Tan)
日  期:    2013-3-6
作  用:  判斷字段集是否結束
形參數:  
返回值:  TRUE:結束 FALSE:未結束
修改記錄:                                             
************************************************************************/ 
BOOL CADOConn::adoEOF() 

    if(m_pRecordset->adoEOF) 
    { 
        return TRUE; 
    } 
    else 
    { 
        return FALSE; 
    } 

 
/************************************************************************
函數名:  ExitConnect
作  者:    譚友亮(Charles Tan)
日  期:    2013-3-6
作  用:  退出連接
形參數:  
返回值:  
修改記錄:                                             
************************************************************************/ 
void CADOConn::ExitConnect() 

    try 
    { 
        if (m_pRecordset != NULL) 
        { 
            m_pRecordset->Close(); 
        } 
        if (m_pConnection != NULL) 
        { 
            m_pConnection->Close(); 
        } 
 
        m_pRecordset = NULL; 
        m_pConnection = NULL; 
         
        //釋放OLE/COM庫環境  
        ::CoUninitialize(); 
    } 
    catch (_com_error e)  
    { 
        AfxMessageBox(e.Description()); 
    } 

 
/************************************************************************
函數名:  InitList
作  者:    譚友亮(Charles Tan)
日  期:    2013-3-19
作  用:  初始化列表
形參數:  
返回值:  
修改記錄:                                             
************************************************************************/ 
BOOL CADOConn::InitList(CListCtrl *listMain) 

    int iMaxCol = 0, i; 
    _variant_t vIndex; 
     
    vIndex.vt = VT_I2; 
    iMaxCol = m_pRecordset->Fields->Count; 
    listMain->SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); 
 
    for(i = 0; i < iMaxCol; i++) 
    { 
        CString strTitle; 
        vIndex.iVal = i; 
        strTitle = (LPCTSTR)m_pRecordset->Fields->GetItem(vIndex)->GetName(); 
        listMain->InsertColumn(i, strTitle, LVCFMT_CENTER, 100, 0); 
    } 
 
    int iWidth = 0; 
    for(i = 0; i < iMaxCol; i++) 
    { 
        listMain->SetColumnWidth(i, LVSCW_AUTOSIZE_USEHEADER); 
        iWidth = iWidth + listMain->GetColumnWidth(i); 
    } 
 
    RECT rectList; 
    listMain->GetWindowRect(&rectList); 
    if (iWidth < (rectList.right - rectList.left)) 
    { 
        iWidth = (rectList.right - rectList.left - iWidth) / iMaxCol; 
    } 
    else 
    { 
        return TRUE; 
    } 
 
    for(i = 0; i < iMaxCol; i++) 
    { 
        listMain->SetColumnWidth(i, listMain->GetColumnWidth(i) + iWidth); 
    } 
 
    return TRUE; 

 
/************************************************************************
函數名:  FillList
作  者:    譚友亮(Charles Tan)
日  期:    2013-3-19
作  用:  填充列表
形參數:  
返回值:  
修改記錄:                                             
************************************************************************/ 
BOOL CADOConn::FillList(CListCtrl *listMain) 

 
    int i, iType, iRow = 0, listWidth = 0;//iType:字段集的數據類型 listWidth:列表中列的寬度  
    _variant_t vIndex; 
    long lMax = 0; 
    lMax = m_pRecordset->Fields->Count; 
    vIndex.vt = VT_I2; 
    if(!m_pRecordset->adoEOF) 
    {    
        MoveFirst(); 
        while (!m_pRecordset->adoEOF) 
        { 
            for (i=0; i<lMax; i++) 
            { 
                CString strValue=""; 
                vIndex.iVal = i; 
                iType = m_pRecordset->Fields->GetItem(vIndex)->GetType(); 
                switch(iType) 
                { 
                case ado_Field_Str: 
                case ado_Field_Text: 
                    strValue = GetItemString(i); 
                    break; 
                case ado_Field_Long: 
                    strValue.Format(_T("%d"), GetItemLong(i)); 
                    break; 
                case ado_Field_Int: 
                    strValue.Format(_T("%d"), GetItemInt(i)); 
                    break; 
//              case ado_Field_Float:  
//                  strValue=GetValueFloatStr(i,0,2);  
//                  break;  
//              case ado_Field_Double:  
//                  strValue=GetValueDoubleStr(i,0,2);  
//                  break;  
//              case ado_Field_Byte:  
//                  strValue=GetValueByteStr(i,0);  
//                  break;  
                case ado_Field_Date: 
                    strValue = GetItemString(i); 
                    break; 
                default: 
                    strValue = ""; 
                    break; 
                } 
 
                if(i == 0) 
                    listMain->InsertItem(iRow, strValue, 0); 
                else 
                    listMain->SetItemText(iRow, i, strValue); 
            } 
            m_pRecordset->MoveNext(); 
        } 
        //移向開頭  
        MoveFirst(); 
    } 
 
    return TRUE; 

// ADOConn.h: interface for the CADOConn class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_ADOCONN_H__6FC87078_9BAB_4B1F_B205_E932FD387E09__INCLUDED_)
#define AFX_ADOCONN_H__6FC87078_9BAB_4B1F_B205_E932FD387E09__INCLUDED_

#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF")

#define ado_Field_Str 202
#define ado_Field_Text 203
#define ado_Field_Int 2
#define ado_Field_Long 3
#define ado_Field_Float 4
#define ado_Field_Double 5
#define ado_Field_Date 7
#define ado_Field_Byte 17


#ifdef _DEBUG
 #define ASSERT_VALID_STRING( str ) ASSERT( !IsBadStringPtr( str, 0xfffff ) )
#else // _DEBUG
 #define ASSERT_VALID_STRING( str ) ( (void)0 )
#endif // _DEBUG

class CADOConn 
{
public:
 _ConnectionPtr m_pConnection;
 _RecordsetPtr m_pRecordset;
 _bstr_t m_strDatabaseName;
 int m_iDatabaseType;
 
 CADOConn();
 CADOConn(CString m_strDatabaseName);
 virtual ~CADOConn();
 CString GetAppPath();
 void InitCADOConn();
 void ExitConnect();
 _RecordsetPtr& GetRecordSet(CString strSQL);
 BOOL Open(CString strSQL);
 BOOL ExecuteSQL(CString strSQL);
 BOOL MoveFirst();
 BOOL MoveNext();
 CString GetItemString(int index);
 int GetItemInt(int index);
 long GetItemLong(int index);
 BOOL adoEOF();
 CString GetFieldName(int index);
 int GetFieldsCount();
 long GetRecordCount();
 BOOL InitList(CListCtrl *listMain);
 BOOL FillList(CListCtrl *listMain);
};

#endif // !defined(AFX_ADOCONN_H__6FC87078_9BAB_4B1F_B205_E932FD387E09__INCLUDED_)

 

// ADOConn.cpp: implementation of the CADOConn class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ADOConn.h"


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


CADOConn::CADOConn()
{
 //數據庫類型:Access
 m_iDatabaseType = 1;
 m_strDatabaseName = _bstr_t("ShopSale.mdb");
}

CADOConn::~CADOConn()
{
 
}

/************************************************************************
函數名:  CADOConn
作  者:  譚友亮(Charles Tan)
日  期:  2013-3-5
作  用:  將數據庫名稱傳遞給m_strDatabaseName,並判斷數據庫類型
形參數:  strDatabaseName 數據庫名稱
返回值: 
修改記錄:                                            
************************************************************************/
CADOConn::CADOConn(CString strDatabaseName)
{
 CString strFormat;
 strDatabaseName.TrimLeft();
 strDatabaseName.TrimRight();
 m_strDatabaseName = _bstr_t(strDatabaseName);
 strFormat = strDatabaseName.Right(strDatabaseName.GetLength() - strDatabaseName.ReverseFind('.') - 1);

 if(strFormat == "mdb")
 {
  m_iDatabaseType = 1;
 }
 if(strFormat == "xls" || strFormat == "xlsx")
 {
  m_iDatabaseType = 2;
 }
}

/************************************************************************
函數名:  GetAppPath
作  者:  譚友亮(Charles Tan)
日  期:  2013-3-18
作  用:  獲取當前程序的可執行文件所在的目錄
形參數: 
返回值: 
修改記錄:                                            
************************************************************************/
CString CADOConn::GetAppPath()
{
 char lpFilePath[MAX_PATH];
 CString strPath;

 GetModuleFileName(AfxGetInstanceHandle(), lpFilePath, MAX_PATH);
 strPath = lpFilePath;
 strPath = strPath.Left(strPath.ReverseFind('\\'));

 return strPath;
}

/************************************************************************
函數名:  InitCADOConn
作  者:  譚友亮(Charles Tan)
日  期:  2013-3-5
作  用:  初始化數據庫連接
形參數: 
返回值: 
修改記錄:                                            
************************************************************************/
void CADOConn::InitCADOConn()
{
 CString toolPath = GetAppPath();

 //初始化OLE/COM庫環境
 ::CoInitialize(NULL);
 try
 {
  m_pConnection = NULL;
  m_pRecordset = NULL;
  //創建Connection對象
  m_pConnection.CreateInstance("ADODB.Connection");
  //設置連接字符串,必須是BSTR型或者_bstr_t類型
  _bstr_t strConnect;

  switch(m_iDatabaseType)
  {
  case 1://ACCESS
   strConnect = _bstr_t("Provider = Microsoft.Jet.OLEDB.4.0;Data Source = ");
   strConnect = strConnect + _bstr_t(toolPath) + _bstr_t("\\data\\") + m_strDatabaseName;
   break;
  case 2://EXCEL
   strConnect = _bstr_t("Provider = Microsoft.Jet.OLEDB.4.0;Data Source = ");
   strConnect = strConnect + _bstr_t(toolPath) + _bstr_t("\\") + m_strDatabaseName;
   strConnect = strConnect + ";Extended Properties=Excel 8.0";  
   break; 
  case 3://SQL SERVER
   strConnect = _bstr_t("Provider = Microsoft.Jet.OLEDB.4.0;Data Source = ");
   strConnect = strConnect + _bstr_t(toolPath) + _bstr_t("\\") + m_strDatabaseName;
   strConnect = strConnect + ";Extended Properties=Excel 8.0";  
   break;
  }

  m_pConnection->Open(strConnect, _bstr_t(""), _bstr_t(""), adModeUnknown);
  //ShellExecute(NULL, _T("open"), toolPath + "\\" + m_strDatabaseName, NULL, NULL, SW_SHOWMAXIMIZED);
 }
 catch(_com_error e)
 {
  AfxMessageBox(e.Description());
 }
}

/************************************************************************
函數名:  GetRecordSet
作  者:  譚友亮(Charles Tan)
日  期:  2013-3-5
作  用:  執行查詢
形參數:  strSQL SQL語句
返回值:  m_pRecordset 字段集的指針
修改記錄:                                            
************************************************************************/
_RecordsetPtr& CADOConn::GetRecordSet(CString strSQL)
{
 try
 {
  //連接數據庫,如果Connection對象為空,則重新連接數據庫
  if(m_pConnection == NULL)
  {
   InitCADOConn();
  }

  strSQL.TrimLeft();
  strSQL.TrimRight();
  //創建記錄集對象
  m_pRecordset.CreateInstance(__uuidof(Recordset));
  //取得表中的記錄
  m_pRecordset->Open(_bstr_t(strSQL), m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
  return m_pRecordset;
 }
 catch(_com_error e)
 {
  AfxMessageBox(e.Description());
 }
 
 return m_pRecordset;
}

/************************************************************************
函數名:  Open
作  者:  譚友亮(Charles Tan)
日  期:  2013-3-5
作  用:  打開字符集
形參數:  strSQL SQL語句
返回值:  TRUE:成功 FALSE:失敗
修改記錄:                                            
************************************************************************/
BOOL CADOConn::Open(CString strSQL)
{
 try
 {
  //連接數據庫,如果Connection對象為空,則重新連接數據庫
  if(m_pConnection == NULL)
  {
   InitCADOConn();
  }

  strSQL.TrimLeft();
  strSQL.TrimRight();
  //創建記錄集對象
  m_pRecordset.CreateInstance(__uuidof(Recordset));
  //取得表中的記錄
  m_pRecordset->Open(_bstr_t(strSQL), m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
 }
 catch(_com_error e)
 {
  AfxMessageBox(e.Description());
  return FALSE;
 }

 return TRUE;
}

/************************************************************************
函數名:  ExecuteSQL
作  者:  譚友亮(Charles Tan)
日  期:  2013-3-5
作  用:  執行SQL語句(Insert Update delete)
形參數:  strSQL SQL語句
返回值:  TRUE:成功 FALSE:失敗
修改記錄:                                            
************************************************************************/
BOOL CADOConn::ExecuteSQL(CString strSQL)
{
 try
 {
  //連接數據庫,如果Connection對象為空,則重新連接數據庫
  if(m_pConnection == NULL)
  {
   InitCADOConn();
  }
  
  strSQL.TrimLeft();
  strSQL.TrimRight();
  m_pConnection->Execute(_bstr_t(strSQL), NULL, adCmdText);
  return TRUE;
 }
 catch(_com_error e)
 {
  AfxMessageBox(e.Description());
  return FALSE;
 }
 return TRUE;
}

/************************************************************************
函數名:  MoveFirst
作  者:  譚友亮(Charles Tan)
日  期:  2013-3-6
作  用:  記錄集移向開頭
形參數: 
返回值:  TRUE:成功 FALSE:失敗
修改記錄:                                            
************************************************************************/
BOOL CADOConn::MoveFirst()
{
 if(m_pRecordset == NULL)
 {
  return FALSE;
 }
 else
 {
  m_pRecordset->MoveFirst();
  return TRUE;
 }
}

/************************************************************************
函數名:  MoveNext
作  者:  譚友亮(Charles Tan)
日  期:  2013-3-6
作  用:  記錄集向下移動
形參數: 
返回值:  TRUE:成功 FALSE:失敗
修改記錄:                                            
************************************************************************/
BOOL CADOConn::MoveNext()
{
 if(m_pRecordset == NULL)
 {
  return FALSE;
 }
 else
 {
  if(!m_pRecordset->adoEOF)
  {
   m_pRecordset->MoveNext();
   return TRUE;
  }
  else
  {
   return FALSE;
  }
 }
}

/************************************************************************
函數名:  GetItemString
作  者:  譚友亮(Charles Tan)
日  期:  2013-3-6
作  用:  取得字段中的字符串
形參數:  index:字段集中的索引
返回值: 
修改記錄:                                            
************************************************************************/
CString CADOConn::GetItemString(int index)
{
 _variant_t vValue;
 _variant_t vIndex;
 CString strValue, str;

 if (m_pRecordset == NULL || m_pRecordset->adoEOF)
 {
  return "";
 }

 vIndex.vt = VT_I2;
 vIndex.iVal = index;
 vValue = m_pRecordset->GetCollect(vIndex);
// vValue = m_pRecordset->Fields->GetItem(vIndex)->Value;

 switch(vValue.vt)
 {
 case VT_NULL:
  str = "";
  break;
 case VT_ERROR:
  str = "";
  break;
 case VT_EMPTY:
  str = "";
  break;
 default:
  str = (LPCTSTR)_bstr_t(vValue);
 }
 
 strValue.Format(_T("%s"), str);
 strValue.TrimRight();
 strValue.TrimLeft();
 
 return strValue;
}

/************************************************************************
函數名:  GetItemInt
作  者:  譚友亮(Charles Tan)
日  期:  2013-3-18
作  用:  取得字段中的整數
形參數:  index:字段集中的索引
返回值: 
修改記錄:                                            
************************************************************************/
int CADOConn::GetItemInt(int index)
{
 _variant_t vValue;
 _variant_t vIndex;
 int iValue;

 if (m_pRecordset == NULL || m_pRecordset->adoEOF)
 {
  exit(1);
 }

 vIndex.vt = VT_I2;
 vIndex.iVal = index;
 vValue = m_pRecordset->GetCollect(vIndex);
// vValue = m_pRecordset->Fields->GetItem(vIndex)->Value;

 switch(vValue.vt)
 {
 case VT_NULL:
  iValue = 0;
  break;
 case VT_ERROR:
  iValue = 0;
  break;
 case VT_EMPTY:
  iValue = 0;
  break;
 default:
  iValue = vValue.iVal;
 }
 
 return iValue;
}

/************************************************************************
函數名:  GetItemLong
作  者:  譚友亮(Charles Tan)
日  期:  2013-3-18
作  用:  取得字段中的整數
形參數:  index:字段集中的索引
返回值: 
修改記錄:                                            
************************************************************************/
long CADOConn::GetItemLong(int index)
{
 long lValue;
 _variant_t vIndex;
 _variant_t vValue;

 vIndex.vt = VT_I2;
 vIndex.iVal = index;
 vValue = m_pRecordset->Fields->GetItem(vIndex)->Value;

 switch(vValue.vt)
 {
 case VT_NULL:
  lValue = 0;
  break;
 case VT_ERROR:
  lValue = 0;
  break;
 case VT_EMPTY:
  lValue = 0;
  break;
 default:
  lValue = vValue.lVal;
 }
 
 return lValue;
}

/************************************************************************
函數名:  GetFieldName
作  者:  譚友亮(Charles Tan)
日  期:  2013-3-6
作  用:  取得列標題
形參數:  index:字段集中的索引,最小值為0
返回值: 
修改記錄:                                            
************************************************************************/
CString CADOConn::GetFieldName(int index)
{
 _variant_t vIndex;
 CString strFieldName;
 
 if (index < m_pRecordset->Fields->Count)
 {
  vIndex.vt = VT_I2;
  vIndex.iVal = index;
  strFieldName = (LPCTSTR)m_pRecordset->Fields->GetItem(vIndex)->GetName();
 }
 else
 {
  AfxMessageBox("Invalid index!");
 }
 
 return strFieldName;
}

/************************************************************************
函數名:  GetFieldsCount
作  者:  譚友亮(Charles Tan)
日  期:  2013-3-6
作  用:  取得列數
形參數: 
返回值: 
修改記錄:                                            
************************************************************************/
int CADOConn::GetFieldsCount()
{
 int colNum = m_pRecordset->Fields->Count;
 return colNum;
}

/************************************************************************
函數名:  adoEOF
作  者:  譚友亮(Charles Tan)
日  期:  2013-3-6
作  用:  判斷字段集是否結束
形參數: 
返回值:  TRUE:結束 FALSE:未結束
修改記錄:                                            
************************************************************************/
BOOL CADOConn::adoEOF()
{
 if(m_pRecordset->adoEOF)
 {
  return TRUE;
 }
 else
 {
  return FALSE;
 }
}

/************************************************************************
函數名:  ExitConnect
作  者:  譚友亮(Charles Tan)
日  期:  2013-3-6
作  用:  退出連接
形參數: 
返回值: 
修改記錄:                                            
************************************************************************/
void CADOConn::ExitConnect()
{
 try
 {
  if (m_pRecordset != NULL)
  {
   m_pRecordset->Close();
  }
  if (m_pConnection != NULL)
  {
   m_pConnection->Close();
  }

  m_pRecordset = NULL;
  m_pConnection = NULL;
  
  //釋放OLE/COM庫環境
  ::CoUninitialize();
 }
 catch (_com_error e)
 {
  AfxMessageBox(e.Description());
 }
}

/************************************************************************
函數名:  InitList
作  者:  譚友亮(Charles Tan)
日  期:  2013-3-19
作  用:  初始化列表
形參數: 
返回值: 
修改記錄:                                            
************************************************************************/
BOOL CADOConn::InitList(CListCtrl *listMain)
{
 int iMaxCol = 0, i;
 _variant_t vIndex;
 
 vIndex.vt = VT_I2;
 iMaxCol = m_pRecordset->Fields->Count;
 listMain->SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);

 for(i = 0; i < iMaxCol; i++)
 {
  CString strTitle;
  vIndex.iVal = i;
  strTitle = (LPCTSTR)m_pRecordset->Fields->GetItem(vIndex)->GetName();
  listMain->InsertColumn(i, strTitle, LVCFMT_CENTER, 100, 0);
 }

 int iWidth = 0;
 for(i = 0; i < iMaxCol; i++)
 {
  listMain->SetColumnWidth(i, LVSCW_AUTOSIZE_USEHEADER);
  iWidth = iWidth + listMain->GetColumnWidth(i);
 }

 RECT rectList;
 listMain->GetWindowRect(&rectList);
 if (iWidth < (rectList.right - rectList.left))
 {
  iWidth = (rectList.right - rectList.left - iWidth) / iMaxCol;
 }
 else
 {
  return TRUE;
 }

 for(i = 0; i < iMaxCol; i++)
 {
  listMain->SetColumnWidth(i, listMain->GetColumnWidth(i) + iWidth);
 }

 return TRUE;
}

/************************************************************************
函數名:  FillList
作  者:  譚友亮(Charles Tan)
日  期:  2013-3-19
作  用:  填充列表
形參數: 
返回值: 
修改記錄:                                            
************************************************************************/
BOOL CADOConn::FillList(CListCtrl *listMain)
{

 int i, iType, iRow = 0, listWidth = 0;//iType:字段集的數據類型 listWidth:列表中列的寬度
 _variant_t vIndex;
 long lMax = 0;
 lMax = m_pRecordset->Fields->Count;
 vIndex.vt = VT_I2;
 if(!m_pRecordset->adoEOF)
 { 
  MoveFirst();
  while (!m_pRecordset->adoEOF)
  {
   for (i=0; i<lMax; i++)
   {
    CString strValue="";
    vIndex.iVal = i;
    iType = m_pRecordset->Fields->GetItem(vIndex)->GetType();
    switch(iType)
    {
    case ado_Field_Str:
    case ado_Field_Text:
     strValue = GetItemString(i);
     break;
    case ado_Field_Long:
     strValue.Format(_T("%d"), GetItemLong(i));
     break;
    case ado_Field_Int:
     strValue.Format(_T("%d"), GetItemInt(i));
     break;
//    case ado_Field_Float:
//     strValue=GetValueFloatStr(i,0,2);
//     break;
//    case ado_Field_Double:
//     strValue=GetValueDoubleStr(i,0,2);
//     break;
//    case ado_Field_Byte:
//     strValue=GetValueByteStr(i,0);
//     break;
    case ado_Field_Date:
     strValue = GetItemString(i);
     break;
    default:
     strValue = "";
     break;
    }

    if(i == 0)
     listMain->InsertItem(iRow, strValue, 0);
    else
     listMain->SetItemText(iRow, i, strValue);
   }
   m_pRecordset->MoveNext();
  }
  //移向開頭
  MoveFirst();
 }

 return TRUE;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved