📄 ado.cpp
字号:
// ado.cpp : implementation file
//
#include "stdafx.h"
#include "ado.h"
#include <afxdisp.h>
/////////////////////////////////////////////////////////////////////////////
// CADODatabase class
BOOL CADODatabase::Open(LPCTSTR lpstrConnection)
{
HRESULT hr = S_OK;
if(IsOpen())
Close();
if(strcmp(lpstrConnection, _T("")) != 0)
m_strConnection = lpstrConnection;
ASSERT(!m_strConnection.IsEmpty());
try
{
hr = m_pConnection->Open(_bstr_t(m_strConnection), "", "", NULL);
return hr == S_OK;
}
catch(_com_error &e)
{
dump_com_error(e);
}
return FALSE;
}
BOOL CADODatabase::Execute(LPCTSTR lpstrExec)
{
ASSERT(m_pConnection != NULL);
ASSERT(strcmp(lpstrExec, _T("")) != 0);
try
{
m_pConnection->Execute(_bstr_t(lpstrExec), NULL, adExecuteNoRecords);
}
catch(_com_error &e)
{
dump_com_error(e);
}
return TRUE;
}
void CADODatabase::dump_com_error(_com_error &e)
{
CString ErrorStr;
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
ErrorStr.Format( "CADODataBase Error\n\tCode = %08lx\n\tCode meaning = %s\n\tSource = %s\n\tDescription = %s\n",
e.Error(), e.ErrorMessage(), (LPCSTR)bstrSource, (LPCSTR)bstrDescription );
m_strLastError = _T("Connection String = " + GetConnectionString() + '\n' + ErrorStr);
#ifdef _DEBUG
AfxMessageBox( ErrorStr, MB_OK | MB_ICONERROR );
#endif
}
BOOL CADODatabase::IsOpen()
{ try
{
return (m_pConnection != NULL && (m_pConnection->State & adStateOpen));
}
catch (_com_error e)
{
dump_com_error(e);
return FALSE;
}
return FALSE;
}
void CADODatabase::Close()
{
try
{ if (IsOpen())
m_pConnection->Close();
}
catch (_com_error e)
{
dump_com_error(e);
}
}
long CADODatabase::BeginTransaction()
{
ASSERT(m_pConnection != NULL);
try
{
return m_pConnection->BeginTrans();
}
catch (_com_error e)
{
dump_com_error(e);
return -1;
}
return -1;
}
BOOL CADODatabase::CommitTransaction()
{
ASSERT(m_pConnection != NULL);
try
{
return SUCCEEDED(m_pConnection->CommitTrans());
}
catch (_com_error e)
{
dump_com_error(e);
return FALSE;
}
return FALSE;
}
BOOL CADODatabase::RollbackTransaction()
{
ASSERT(m_pConnection != NULL);
try
{
return SUCCEEDED(m_pConnection->RollbackTrans());
}
catch (_com_error e)
{
dump_com_error(e);
return FALSE;
}
return FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// CADORecordset class
/////////////////////////////////////////////////////////////////////////////
//构造函数
CADORecordset::CADORecordset(CADODatabase* pAdoDatabase)
{
m_pRecordset = NULL;
m_strQuery = _T("");
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_nSearchDirection = CADORecordset::searchForward;
m_pConnection = pAdoDatabase->GetActiveConnection();
}
/////////////////////////////////////////////////////////////////////////////
//打开记录集
BOOL CADORecordset::Open(_ConnectionPtr mpdb, LPCTSTR lpstrExec, int nOption)
{
if (IsOpen()) Close();
if(strcmp(lpstrExec, _T("")) != 0)
m_strQuery = lpstrExec;
ASSERT(!m_strQuery.IsEmpty());
m_strQuery.TrimLeft();
BOOL bIsSelect = m_strQuery.Mid(0, strlen("Select ")).CompareNoCase("select ") == 0;
try
{
m_pRecordset->CursorLocation = adUseClient;
if(bIsSelect || nOption == openQuery)
m_pRecordset->Open((LPCSTR)m_strQuery, _variant_t((IDispatch*)mpdb, TRUE),
adOpenStatic, adLockOptimistic, adCmdText);
else if(nOption == openTable)
m_pRecordset->Open((LPCSTR)m_strQuery, _variant_t((IDispatch*)mpdb, TRUE),
adOpenDynamic, adLockOptimistic, adCmdTable);
else if(nOption == openStoredProc)
{
m_pRecordset->Open((LPCSTR)m_strQuery, _variant_t((IDispatch*)mpdb, TRUE),
adOpenStatic, adLockOptimistic, adCmdStoredProc);
}
else
{
TRACE( "Unknown parameter. %d", nOption);
return FALSE;
}
}
catch(_com_error &e)
{
dump_com_error(e);
return FALSE;
}
return m_pRecordset != NULL;
}
BOOL CADORecordset::Open(LPCTSTR lpstrExec, int nOption)
{
ASSERT(m_pConnection != NULL);
return Open(m_pConnection, lpstrExec, nOption);
}
BOOL CADORecordset::GetFieldValue(LPCTSTR lpFieldName, double& dbValue)
{
double val = (double)NULL;
_variant_t vtFld;
try
{
vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;
if(vtFld.vt != VT_NULL)
val = vtFld.dblVal;
dbValue = val;
return TRUE;
}
catch(_com_error &e)
{
dump_com_error(e);
dbValue=0;
return FALSE;
}
}
BOOL CADORecordset::GetFieldValue(int nIndex, double& dbValue)
{
double val = (double)NULL;
_variant_t vtFld;
_variant_t vtIndex;
vtIndex.vt = VT_I2;
vtIndex.iVal = nIndex;
try
{
vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;
if(vtFld.vt != VT_NULL)
val = vtFld.dblVal;
dbValue = val;
return TRUE;
}
catch(_com_error &e)
{
dump_com_error(e);
dbValue=0;
return FALSE;
}
}
BOOL CADORecordset::GetFieldValue(LPCTSTR lpFieldName, long& lValue)
{
long val = (long)NULL;
_variant_t vtFld;
try
{
vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;
if(vtFld.vt != VT_NULL)
val = vtFld.lVal;
lValue = val;
return TRUE;
}
catch(_com_error &e)
{
dump_com_error(e);
lValue=0;
return FALSE;
}
}
BOOL CADORecordset::GetFieldValue(int nIndex, long& lValue)
{
long val = (long)NULL;
_variant_t vtFld;
_variant_t vtIndex;
vtIndex.vt = VT_I2;
vtIndex.iVal = nIndex;
try
{
vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;
if(vtFld.vt != VT_NULL)
val = vtFld.lVal;
lValue = val;
return TRUE;
}
catch(_com_error &e)
{
dump_com_error(e);
lValue=0;
return FALSE;
}
}
BOOL CADORecordset::GetFieldValue(LPCTSTR lpFieldName, int& nValue)
{
int val = NULL;
_variant_t vtFld;
try
{
vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;
switch(vtFld.vt)
{
case VT_I2:
val = vtFld.iVal;
break;
case VT_BOOL:
val = vtFld.boolVal;
case VT_NULL:
case VT_EMPTY:
break;
default:
nValue = 0;
return FALSE;
}
nValue = val;
return TRUE;
}
catch(_com_error &e)
{
dump_com_error(e);
nValue=0;
return FALSE;
}
}
BOOL CADORecordset::GetFieldValue(int nIndex, int& nValue)
{
int val = (int)NULL;
_variant_t vtFld;
_variant_t vtIndex;
vtIndex.vt = VT_I2;
vtIndex.iVal = nIndex;
try
{
vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;
switch(vtFld.vt)
{
case VT_I2:
val = vtFld.iVal;
break;
case VT_NULL:
case VT_EMPTY:
val = 0;
break;
default:
return FALSE;
}
nValue = val;
return TRUE;
}
catch(_com_error &e)
{
dump_com_error(e);
nValue=0;
return FALSE;
}
}
BOOL CADORecordset::GetFieldValue(LPCTSTR lpFieldName, CString& strValue)
{
CString str = _T("");
_variant_t vtFld;
try
{
vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;
switch(vtFld.vt)
{
case VT_BSTR:
str = vtFld.bstrVal;
break;
case VT_I4:
str = IntToStr(vtFld.iVal);
break;
case VT_DATE:
{
COleDateTime dt(vtFld);
str = dt.Format("%Y-%m-%d %H:%M:%S");
}
break;
case VT_EMPTY:
case VT_NULL:
break;
default:
strValue.Empty();
return FALSE;
}
strValue = str;
return TRUE;
}
catch(_com_error &e)
{
dump_com_error(e);
strValue= _T("");
return FALSE;
}
}
BOOL CADORecordset::GetFieldValue(int nIndex, CString& strValue)
{
CString str = _T("");
_variant_t vtFld;
_variant_t vtIndex;
vtIndex.vt = VT_I2;
vtIndex.iVal = nIndex;
try
{
vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;
switch(vtFld.vt)
{
case VT_BSTR:
str = vtFld.bstrVal;
break;
case VT_DATE:
{
COleDateTime dt(vtFld);
str = dt.Format("%Y-%m-%d %H:%M:%S");
}
break;
case VT_EMPTY:
case VT_NULL:
break;
default:
strValue.Empty();
return FALSE;
}
strValue = str;
return TRUE;
}
catch(_com_error &e)
{
dump_com_error(e);
strValue= _T("");
return FALSE;
}
}
BOOL CADORecordset::GetFieldValue(LPCTSTR lpFieldName, COleDateTime& time)
{
_variant_t vtFld;
try
{
vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;
switch(vtFld.vt)
{
case VT_DATE:
{
COleDateTime dt(vtFld);
time = dt;
}
break;
case VT_EMPTY:
case VT_NULL:
break;
default:
return FALSE;
}
return TRUE;
}
catch(_com_error &e)
{
dump_com_error(e);
return FALSE;
}
}
BOOL CADORecordset::GetFieldValue(int nIndex, COleDateTime& time)
{
_variant_t vtFld;
_variant_t vtIndex;
vtIndex.vt = VT_I2;
vtIndex.iVal = nIndex;
try
{
vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;
switch(vtFld.vt)
{
case VT_DATE:
{
COleDateTime dt(vtFld);
time = dt;
}
break;
case VT_EMPTY:
case VT_NULL:
break;
default:
return FALSE;
}
return TRUE;
}
catch(_com_error &e)
{
dump_com_error(e);
return FALSE;
}
}
/*
BOOL CADORecordset::IsFieldNull(LPCTSTR lpFieldName)
{
_variant_t vtFld;
vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;
return vtFld.vt == VT_NULL;
}
BOOL CADORecordset::IsFieldNull(int nIndex)
{
_variant_t vtFld;
_variant_t vtIndex;
vtIndex.vt = VT_I2;
vtIndex.iVal = nIndex;
vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;
return vtFld.vt == VT_NULL;
}
BOOL CADORecordset::IsFieldEmpty(LPCTSTR lpFieldName)
{
_variant_t vtFld;
vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;
return vtFld.vt == VT_EMPTY || vtFld.vt == VT_NULL;
}
BOOL CADORecordset::IsFieldEmpty(int nIndex)
{
_variant_t vtFld;
_variant_t vtIndex;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -