📄 adorecordset.cpp
字号:
// ADORecordset.cpp: implementation of the CADORecordset class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ADORecordset.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CADORecordset::CADORecordset()
{
m_pRecordset = NULL;
m_pCmd = NULL;
m_strQuery = _T("");
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pCmd.CreateInstance(__uuidof(Command));
m_nEditStatus = CADORecordset::dbEditNone;
m_nSearchDirection = CADORecordset::searchForward;
}
CADORecordset::~CADORecordset()
{
Close();
m_pRecordset.Release();
m_pCmd.Release();
m_pRecordset = NULL;
m_pCmd = NULL;
m_strQuery = _T("");
m_nEditStatus = dbEditNone;
}
BOOL CADORecordset::AddNew()
{
m_nEditStatus = dbEditNone;
if(m_pRecordset->AddNew() != S_OK)
return false;
m_nEditStatus = dbEditNew;
return true;
}
CADORecordset::CADORecordset(CADODatabase *pAdoDatabase)
{
m_pRecordset = NULL;
m_pCmd = NULL;
m_strQuery = _T("");
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pCmd.CreateInstance(__uuidof(Command));
m_nEditStatus = CADORecordset::dbEditNone;
m_nSearchDirection = CADORecordset::searchForward;
m_pConnection = pAdoDatabase->GetActiveConnection();
}
void CADORecordset::CancelUpdate()
{
m_pRecordset->CancelUpdate();
m_nEditStatus = dbEditNone;
}
void CADORecordset::Close()
{
if(IsOpen())
m_pRecordset->Close();
}
BOOL CADORecordset::Delete()
{
if(m_pRecordset->Delete(adAffectCurrent) != S_OK)
return false;
if(m_pRecordset->Update() != S_OK)
return false;
return true;
}
void CADORecordset::dump_com_error(_com_error &e)
{
CString ErrorStr;
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
ErrorStr.Format(_T("数据库读写失败\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("Query = " + GetQuery() + '\n' + ErrorStr);
#ifdef _DEBUG
AfxMessageBox( ErrorStr, MB_OK | MB_ICONERROR );
#endif
}
void CADORecordset::Edit()
{
m_nEditStatus = dbEdit;
}
bool CADORecordset::Find(CString lpFind, int nSearchDirection)
{
m_strFind = lpFind;
m_nSearchDirection = nSearchDirection;
ASSERT(!m_strFind.IsEmpty());
if(m_nSearchDirection == searchForward)
{
m_pRecordset->Find(_bstr_t(m_strFind), 0, adSearchForward, "");
if(!IsEof())
{
m_varBookFind = m_pRecordset->Bookmark;
return true;
}
}
else if(m_nSearchDirection == searchBackward)
{
m_pRecordset->Find(_bstr_t(m_strFind), 0, adSearchBackward, "");
if(!IsBof())
{
m_varBookFind = m_pRecordset->Bookmark;
return true;
}
}
else
{
m_nSearchDirection = searchForward;
}
return false;
}
BOOL CADORecordset::FindFirst(CString lpFind)
{
m_pRecordset->MoveFirst();
return Find(lpFind);
}
BOOL CADORecordset::FindNext()
{
if(m_nSearchDirection == searchForward)
{
m_pRecordset->Find(_bstr_t(m_strFind), 1, adSearchForward, m_varBookFind);
if(!IsEof())
{
m_varBookFind = m_pRecordset->Bookmark;
return true;
}
}
else
{
m_pRecordset->Find(_bstr_t(m_strFind), 1, adSearchBackward, m_varBookFind);
if(!IsBof())
{
m_varBookFind = m_pRecordset->Bookmark;
return true;
}
}
return false;
}
long CADORecordset::GetAbsolutePage()
{
return m_pRecordset->GetAbsolutePage();
}
long CADORecordset::GetAbsolutePosition()
{
return m_pRecordset->GetAbsolutePosition();
}
void CADORecordset::GetBookmark()
{
m_varBookmark = m_pRecordset->Bookmark;
}
BOOL CADORecordset::GetChunk(CString lpFieldName, CString &strValue)
{
CString str = _T("");
long lngSize, lngOffSet = 0;
_variant_t varChunk;
int ChunkSize = 100;
lngSize = m_pRecordset->Fields->GetItem(_variant_t(lpFieldName))->ActualSize;
str.Empty();
while(lngOffSet < lngSize)
{
varChunk = m_pRecordset->Fields->GetItem(_variant_t(lpFieldName))->GetChunk(ChunkSize);
str += varChunk.bstrVal;
lngOffSet += ChunkSize;
}
lngOffSet = 0;
strValue = str;
return TRUE;
}
BOOL CADORecordset::GetFieldInfo(int nIndex, CADOFieldInfo *fldInfo)
{
_variant_t vtFld;
_variant_t vtIndex;
vtIndex.vt = VT_I2;
vtIndex.iVal = nIndex;
// wcscpy strcpy
strcpy(fldInfo->m_strName, m_pRecordset->Fields->GetItem(vtIndex)->GetName());
fldInfo->m_lSize = m_pRecordset->Fields->GetItem(vtIndex)->GetActualSize();
fldInfo->m_lDefinedSize = m_pRecordset->Fields->GetItem(vtIndex)->GetDefinedSize();
fldInfo->m_nType = m_pRecordset->Fields->GetItem(vtIndex)->GetType();
fldInfo->m_lAttributes = m_pRecordset->Fields->GetItem(vtIndex)->GetAttributes();
fldInfo->m_bRequired = fldInfo->m_lAttributes & adFldIsNullable;
return true;
}
BOOL CADORecordset::GetFieldInfo(CString lpFieldName, CADOFieldInfo *fldInfo)
{
_variant_t vtFld;
//wcscpy strcpy
strcpy(fldInfo->m_strName, m_pRecordset->Fields->GetItem(_variant_t(lpFieldName))->GetName());
fldInfo->m_lSize = m_pRecordset->Fields->GetItem(_variant_t(lpFieldName))->GetActualSize();
fldInfo->m_lDefinedSize = m_pRecordset->Fields->GetItem(_variant_t(lpFieldName))->GetDefinedSize();
fldInfo->m_nType = m_pRecordset->Fields->GetItem(_variant_t(lpFieldName))->GetType();
fldInfo->m_lAttributes = m_pRecordset->Fields->GetItem(_variant_t(lpFieldName))->GetAttributes();
fldInfo->m_bRequired = fldInfo->m_lAttributes & adFldIsNullable;
return true;
}
BOOL CADORecordset::GetFieldValue(CString lpFieldName, int &nValue)
{
int val = NULL;
_variant_t vtFld;
vtFld = m_pRecordset->Fields->GetItem(_variant_t(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;
}
BOOL CADORecordset::GetFieldValue(int nIndex, double &dbValue)
{
double val = (double)NULL;
_variant_t vtFld;
_variant_t vtIndex;
vtIndex.vt = VT_R8;
vtIndex.iVal = nIndex;
vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;
if(vtFld.vt != VT_NULL)
val = vtFld.dblVal;
dbValue = val;
return true;
}
bool CADORecordset::GetFieldValue(CString lpFieldName, long &lValue)
{
long val = (long)NULL;
_variant_t vtFld;
vtFld = m_pRecordset->Fields->GetItem(_variant_t(lpFieldName))->Value;
if(vtFld.vt != VT_NULL)
val = vtFld.lVal;
lValue = val;
return true;
}
bool CADORecordset::GetFieldValue(int nIndex, COleDateTime &time)
{
_variant_t vtFld;
_variant_t vtIndex;
vtIndex.vt = VT_I2;
vtIndex.iVal = nIndex;
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;
}
bool CADORecordset::GetFieldValue(int nIndex, long &lValue)
{
long val = (long)NULL;
_variant_t vtFld;
_variant_t vtIndex;
vtIndex.vt = VT_I2;
vtIndex.iVal = nIndex;
vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;
if(vtFld.vt != VT_NULL)
val = vtFld.lVal;
lValue = val;
return true;
}
bool CADORecordset::GetFieldValue(CString lpFieldName, double &dbValue)
{
double val = (double)NULL;
_variant_t vtFld;
vtFld = m_pRecordset->Fields->GetItem(_variant_t(lpFieldName))->Value;
if(vtFld.vt != VT_NULL)
val = vtFld.dblVal;
dbValue = val;
return true;
}
bool CADORecordset::GetFieldValue(int nIndex, int &nValue)
{
int val = (int)NULL;
_variant_t vtFld;
_variant_t vtIndex;
vtIndex.vt = VT_I2;
vtIndex.iVal = nIndex;
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;
}
bool CADORecordset::GetFieldValue(CString lpFieldName, CString &strValue)
{
CString str = _T("");
_variant_t vtFld;
vtFld = m_pRecordset->Fields->GetItem(_variant_t(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(_T("%Y-%m-%d %H:%M:%S"));
}
break;
case VT_EMPTY:
case VT_NULL:
break;
default:
strValue.Empty();
return false;
}
strValue = str;
return true;
}
bool CADORecordset::GetFieldValue(int nIndex, CString &strValue)
{
CString str = _T("");
_variant_t vtFld;
_variant_t vtIndex;
vtIndex.vt = VT_I2;
vtIndex.iVal = nIndex;
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(_T("%Y-%m-%d %H:%M:%S"));
}
break;
case VT_EMPTY:
case VT_NULL:
break;
default:
strValue.Empty();
return false;
}
strValue = str;
return true;
}
bool CADORecordset::GetFieldValue(CString lpFieldName, COleDateTime &time)
{
_variant_t vtFld;
vtFld = m_pRecordset->Fields->GetItem(_variant_t(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;
}
CString CADORecordset::GetLastError()
{
return m_strLastError;
}
long CADORecordset::GetPageCount()
{
return m_pRecordset->GetPageCount();
}
long CADORecordset::GetPageSize()
{
return m_pRecordset->GetPageSize();
}
CString CADORecordset::GetQuery()
{
return m_strQuery;
}
DWORD CADORecordset::GetRecordCount()
{
DWORD nRows = 0;
nRows = m_pRecordset->GetRecordCount();
if(nRows == -1)
{
nRows = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -