📄 dhdbado.cpp
字号:
}
BOOL CDHDBAdo::MoveLast()
{
ASSERT( IsOpen() );
if(!m_Rst->adoEOF)
{
m_Rst->MoveLast();
return TRUE;
}
OnSQLErr("已经到最后一条记录\n");
return FALSE;
}
BOOL CDHDBAdo::MoveNext()
{
ASSERT( IsOpen() );
if(!m_Rst->adoEOF)
{
m_Rst->MoveNext();
return TRUE;
}
OnSQLErr("已经到最后一条记录\n");
return FALSE;
}
BOOL CDHDBAdo::MovePrev()
{
ASSERT( IsOpen() );
if(!m_Rst->BOF)
{
m_Rst->MovePrevious();
return TRUE;
}
OnSQLErr("已经到第一条记录\n");
return FALSE;
}
BOOL CDHDBAdo::Open(LPCTSTR lpszSQL, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long Options)
{
if(m_Con->GetState() != adStateOpen)
if(!OpenConnection())
return FALSE;
if(m_Rst == NULL || m_Con == NULL)
{
OnSQLErr("数据库对象未建立成功!");
return FALSE;
}
else
{
if(IsOpen())
Close();
}
if(lpszSQL)
{
m_strCmd.Format("%s", lpszSQL);
}
else
{
if(!m_bHasSQL)
{
OnSQLErr("还未设置SQL语句");
return FALSE;
}
}
OnSQLErr(m_strCmd.GetBuffer(0));
HRESULT hr = NULL;
CString str;
try
{
if(m_Con->GetState() != adStateOpen)
{
OnSQLErr("数据库连接未打开!");
}
m_Rst->PutPageSize(m_nPageSize);
hr = m_Rst->Open(_variant_t(m_strCmd), _variant_t((IDispatch *)m_Con,true),CursorType, LockType, Options);
if (FAILED(hr))
{
str.Format("[打开数据集失败,ConString:%s]!", lpszSQL);
OnSQLErr(str.GetBuffer(0));
return FALSE;
}
m_CursorType = CursorType;
m_LockType = LockType;
m_Options = Options;
return LoadFieldNamesMap();
}
catch(_com_error& e)
{
str.Format("[打开数据集失败,ConString:%s]!", lpszSQL);
OnSQLErr(str.GetBuffer(0), &e);
return FALSE;
}
}
BOOL CDHDBAdo::SetConnectString(LPCTSTR lpszCon)
{
if(IsOpen())
{
OnSQLErr("必须先关闭数据集");
return FALSE;
}
if(m_Con->GetState() == adStateOpen)
{
m_Con->Close();
}
if(!lpszCon)
{
return FALSE;
}
m_strCon.Format("%s",lpszCon);
return TRUE;
}
BOOL CDHDBAdo::LoadFieldNamesMap()
{
try
{
m_mapNameIdx.RemoveAll();
int nFields = m_nField = (int)GetFieldNum();
if( m_pFields.GetSize() > 0 )
ResetField();
CString cName;
for(long i=0;i<nFields;i++)
{
m_pFields.Add(NULL);
cName = Field(i).GetName();
cName.MakeUpper();
m_mapNameIdx.SetAt( cName, (void*)i );
}
return TRUE;
}
catch(_com_error& e)
{
OnSQLErr("[获取数据库字段信息失败]!", &e);
return FALSE;
}
}
int CDHDBAdo::GetFieldID(LPCTSTR szField)
{
void* idx = (void*)-1;
CString cName( szField );
cName.MakeUpper();
if( ! m_mapNameIdx.Lookup( cName, idx ) )
return -1;
return (int)idx;
}
CString CDHDBAdo::GetFieldName(int nField)
{
ASSERT( nField >= 0 );
ASSERT( nField < GetFieldNum() );
CString cName;
void* idx;
POSITION pos = m_mapNameIdx.GetStartPosition();
while( pos != NULL ) {
m_mapNameIdx.GetNextAssoc( pos, cName, idx );
if( (int)idx == nField )
return cName;
}
cName.Empty();
return cName;
}
void CDHDBAdo::SetFieldNull(LPCTSTR szField)
{
Field(szField).SetNull();
}
void CDHDBAdo::SetFieldNull(int nField)
{
Field(nField).SetNull();
}
BOOL CDHDBAdo::Requery()
{
ASSERT( IsOpen() );
return m_Rst->Requery(m_Options);
}
BOOL CDHDBAdo::UpdateBatch(enum AffectEnum AffectRecords)
{
ASSERT( IsOpen() );
if(!m_Rst->Supports(adUpdateBatch))
{
OnSQLErr("[不能批量更新记录!]");
return FALSE;
}
if(m_Rst->BOF||m_Rst->adoEOF)
{
OnSQLErr("[当前游标未指向记录!]");
return FALSE;
}
try
{
HRESULT hr = NULL;
hr = m_Rst->UpdateBatch(AffectRecords);
if (FAILED(hr))
{
OnSQLErr("[批量更新记录失败失败!]");
return FALSE;
}
}
catch(_com_error& e)
{
OnSQLErr("[批量更新记录集失败]", &e);
return FALSE;
}
return TRUE;
}
void CDHDBAdo::ResetField()
{
int count = m_pFields.GetSize();
CDHAdoField* pField ;
for(int i=0;i<count;i++)
{
pField = (CDHAdoField*)m_pFields.GetAt(i);
if(pField != NULL)
delete pField;
}
m_pFields.RemoveAll();
}
BOOL CDHDBAdo::SetBinField(LPCTSTR szField, void *pData, DWORD dwLen)
{
try
{
return Field(szField).SetBinData(pData, dwLen);
}
catch(CException* e)
{
OnSQLErr("[更新记录集二进制字段失败]",e);
return FALSE;
}
}
BOOL CDHDBAdo::SetBinField(int nField, void *pData, DWORD dwLen)
{
try
{
return Field(nField).SetBinData(pData, dwLen);
}
catch(CException* e)
{
OnSQLErr("[更新记录集二进制字段失败]",e);
return FALSE;
}
}
int CDHDBAdo::OnSQLErr(char *pNote, CException *e)
{
CString str;
if(pNote!=NULL && strlen(pNote)>0)
str=pNote;
else
str="SQL错误:";
if(e!=NULL)
{
str+=" %s\n";
e->GetErrorMessage(m_strLastError.GetBuffer(0), 100);
}
else
{
m_strLastError.Format("%s\n", str);
}
TRACE1(str.GetBuffer(0), m_strLastError);
return 0;
}
int CDHDBAdo::GetCursorType()
{
return m_CursorType;
}
int CDHDBAdo::GetLockType()
{
return m_LockType;
}
long CDHDBAdo::GetOptions()
{
return m_Options;
}
BOOL CDHDBAdo::OpenConnection()
{
ASSERT(m_Con!=NULL);
m_strCon.TrimRight();
if(m_strCon.IsEmpty())
{
OnSQLErr("[打开数据库失败,ConString 为空]!");
return FALSE;
}
HRESULT hr = NULL;
CString str;
try
{
hr = m_Con->Open(_bstr_t(m_strCon), "", "", adModeUnknown);
if (FAILED(hr))
{
str.Format("[打开数据库失败,ConString:%s]!", m_strCon);
OnSQLErr(str.GetBuffer(0));
return FALSE;
}
return TRUE;
}
catch(_com_error& e)
{
str.Format("[打开数据库失败,ConString:%s]!", m_strCon);
OnSQLErr(str.GetBuffer(0), &e);
return FALSE;
}
}
CString CDHDBAdo::GetLastError()
{
return m_strLastError;
}
BOOL CDHDBAdo::CancelUpdate()
{
ASSERT( IsOpen() );
if(!m_Rst->Supports(adUpdate))
{
OnSQLErr("[不能更新记录!]");
return FALSE;
}
if(m_Rst->BOF||m_Rst->adoEOF)
{
OnSQLErr("[当前游标未指向记录!]");
return FALSE;
}
try
{
HRESULT hr = NULL;
hr = m_Rst->CancelUpdate();
if (FAILED(hr))
{
OnSQLErr("[取消更新记录失败失败!]");
return FALSE;
}
}
catch(_com_error& e)
{
OnSQLErr("[取消更新记录失败失败]", &e);
return FALSE;
}
return TRUE;
}
void CDHDBAdo::SetPageSize(long nPageSize)
{
ASSERT(nPageSize>0);
m_nPageSize = nPageSize;
if(IsOpen())
{
m_Rst->PutPageSize(nPageSize);
}
}
long CDHDBAdo::GetPageSize()
{
if(IsOpen())
return m_Rst->GetPageSize();
else
return -1;
}
long CDHDBAdo::GetPageCount()
{
if(IsOpen())
return m_Rst->GetPageCount();
else
return -1;
}
BOOL CDHDBAdo::SetCurPage(long nCurPage)
{
if(IsOpen()&&nCurPage<=GetPageCount()&&nCurPage>0)
{
m_Rst->PutAbsolutePage((enum PositionEnum)nCurPage);
return TRUE;
}
else
{
return FALSE;
}
}
long CDHDBAdo::GetMaxValue(char *pszTableName, char *pszFieldName)
{
CString strCmd;
_RecordsetPtr rst;
strCmd.Format(_T("SELECT MAX(%s) AS MAXVALUE FROM %s"), pszFieldName, pszTableName);
try
{
if(m_Con->GetState() != adStateOpen)
if(!OpenConnection())
return -1;
VARIANT v;
HRESULT hr = NULL;
v.vt = VT_I4;
rst = m_Con->Execute(_bstr_t(strCmd), &v ,adCmdText);
if(rst == NULL)
return -1;
CDHAdoField field(rst->GetFields()->GetItem("MAXVALUE"));
long MaxValue = field.AsLong();
rst->Close();
return MaxValue;
}
catch(_com_error& e)
{
OnSQLErr("[直接执行SQL语句失败]", &e);
return -1;
}
return -1;
}
void CDHDBAdo::Reset()
{
m_nPageSize = 10;
Close();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -