[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;
}