⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dhdbado.cpp

📁 ADO查看数据库工具的原码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}

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 + -