📄 dhdbado.cpp
字号:
// DHDBAdo.cpp: implementation of the CDHDBAdo class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "DHDBAdo.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDHDBAdo::CDHDBAdo()
{
m_nPageSize = 10;
m_bHasSQL = FALSE;
m_CursorType = adOpenUnspecified;
m_LockType = adLockUnspecified;
m_Options = adCmdUnspecified;
HRESULT hr = NULL;
m_mapNameIdx.RemoveAll();
m_pFields.RemoveAll();
m_nField = 0;
m_Rst = NULL;
m_Con = NULL;
m_strLastError.Empty();
m_strCmd.Empty();
m_strCon.Empty();
try
{
hr = ::CoInitialize(NULL);
if(FAILED(hr))
{
OnSQLErr("[初始化COM环境失败!]");
}
hr = m_Con.CreateInstance(__uuidof(Connection));
if (FAILED(hr))
{
OnSQLErr("[创建数据库连接对象失败!]");
}
HRESULT hr = NULL;
hr = m_Rst.CreateInstance(__uuidof(Recordset));
if (FAILED(hr))
{
OnSQLErr("[创建数据集对象失败!]");
}
}
catch(_com_error& e)
{
OnSQLErr("[初始话数据库对象失败]", &e);
}
}
CDHDBAdo::~CDHDBAdo()
{
if(IsOpen()) Close();
if(m_Con->GetState() == adStateOpen)
{
m_Con->Close();
}
}
BOOL CDHDBAdo::AddNew()
{
ASSERT( IsOpen() );
if(!m_Rst->Supports(adAddNew))
{
OnSQLErr("[不能增加新记录!]");
return FALSE;
}
try
{
HRESULT hr = NULL;
hr = m_Rst->AddNew();
if (FAILED(hr))
{
OnSQLErr("[删除记录失败!]");
return FALSE;
}
//m_Rst->PutFilter(
}
catch(_com_error& e)
{
OnSQLErr("[新增记录失败]", &e);
return FALSE;
}
return TRUE;
}
int CDHDBAdo::OnSQLErr(char *pNote, _com_error* e)
{
CString str;
if(pNote!=NULL && strlen(pNote)>0)
str=pNote;
else
str="SQL错误:";
if(e!=NULL)
{
str+=" %s\n";
m_strLastError.Format(str.GetBuffer(0), (char*)e->Description());
}
else
{
m_strLastError.Format("%s\n", str);
}
TRACE1(str.GetBuffer(0), m_strLastError);
return 0;
}
long CDHDBAdo::CalcCount()
{
if(!IsOpen())
{
OnSQLErr("[记录录集没有打开!]");
return -1;
}
try
{
return m_Rst->GetRecordCount();
}
catch(_com_error& e)
{
OnSQLErr("[获取记录的条数失败!]", &e);
return -1;
}
}
BOOL CDHDBAdo::Close()
{
if(IsOpen())
{
m_Rst->Close();
}
ResetField();
m_CursorType = adOpenUnspecified;
m_LockType = adLockUnspecified;
m_Options = adCmdUnspecified;
m_nField = 0;
m_bHasSQL = FALSE;
m_strCmd.Empty();
m_strLastError.Empty();
return TRUE;
}
BOOL CDHDBAdo::IsOpen()
{
if(m_Rst == NULL)
{
OnSQLErr("[记录录集并不存在!]");
return FALSE;
}
return (adStateOpen==m_Rst->GetState());
}
long CDHDBAdo::DBExcuteSQL(LPCTSTR lpszSql)
{
try
{
if(m_Con->GetState() != adStateOpen)
if(!OpenConnection())
return -1;
VARIANT v;
HRESULT hr = NULL;
v.vt = VT_I4;
m_Con->Execute(_bstr_t(lpszSql), &v ,adCmdText);
return v.intVal;
}
catch(_com_error& e)
{
CString strErr;
strErr.Format("[直接执行SQL语句:%s失败]", lpszSql);
OnSQLErr(strErr.GetBuffer(0), &e);
return -1;
}
return -1;
}
BOOL CDHDBAdo::Delete()
{
ASSERT( IsOpen() );
if(!m_Rst->Supports(adDelete))
{
OnSQLErr("[不能删除记录!]");
return FALSE;
}
if(m_Rst->BOF||m_Rst->adoEOF)
{
OnSQLErr("[当前游标未指向记录!]");
return FALSE;
}
try
{
HRESULT hr = NULL;
hr = m_Rst->Delete(adAffectCurrent);
if (FAILED(hr))
{
OnSQLErr("[删除记录失败失败!]");
return FALSE;
}
}
catch(_com_error& e)
{
OnSQLErr("[删除记录失败]", &e);
return FALSE;
}
return TRUE;
}
BOOL CDHDBAdo::Update()
{
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->Update();
if (FAILED(hr))
{
OnSQLErr("[更新记录失败失败!]");
return FALSE;
}
}
catch(_com_error& e)
{
OnSQLErr("[更新记录集失败]", &e);
return FALSE;
}
return TRUE;
}
inline CDHAdoField& CDHDBAdo::Field(LPCTSTR szField)
{
int fid;
fid=GetFieldID(szField);
if(fid<0)
{
CString str;
str.Format("字段(%s)不存在!\n", szField);
AfxMessageBox(str);
OnSQLErr(str.GetBuffer(0));
}
return Field(fid);
}
CDHAdoField& CDHDBAdo::Field(int nField)
{
ASSERT( m_pFields.GetSize() > 0 );
ASSERT( nField >= 0 );
ASSERT( nField < GetFieldNum() );
//如果是第一次ADDNEW,则会出诊断错误,应该不要判断IsEOF或IsBOF
//ASSERT( IsOpen() && (! IsEOF()) && (! IsBOF()) ); //原代码
ASSERT( IsOpen() );
CDHAdoField* pField = (CDHAdoField*)m_pFields.GetAt(nField);
if(pField != NULL)
delete pField;
pField = NULL;
pField = new CDHAdoField(m_Rst->GetFields()->GetItem((long)nField));
m_pFields.SetAt(nField, (void*)pField);
return *pField;
}
long CDHDBAdo::GetFieldNum()
{
if(!IsOpen())
{
OnSQLErr("[记录录集没有打开!]");
return 0;
}
try
{
return m_Rst->GetFields()->GetCount();
}
catch(_com_error& e)
{
OnSQLErr("[获取记录集列数失败!]", &e);
return 0;
}
}
BOOL CDHDBAdo::GetBinFieldData(LPCTSTR szField, void *pData)
{
ASSERT( IsOpen() );
try
{
return Field(szField).GetBinData(pData);
}
catch(_com_error& e)
{
CString str;
str.Format("[获取二进制字段%s数据失败]!", szField);
OnSQLErr(str.GetBuffer(0), &e);
return FALSE;
}
}
BOOL CDHDBAdo::GetBinFieldData(int nField, void *pData)
{
ASSERT( IsOpen() );
try
{
return Field(nField).GetBinData(pData);
}
catch(_com_error& e)
{
CString str;
str.Format("[获取二进制字段 %d 数据失败]!", nField);
OnSQLErr(str.GetBuffer(0), &e);
return FALSE;
}
}
DWORD CDHDBAdo::GetBinFieldLen(LPCTSTR szField)
{
ASSERT( IsOpen() );
CLongBinary *pBin;
try
{
pBin = Field(szField).AsBinary();
return pBin->m_dwDataLength;
}
catch(_com_error& e)
{
CString str;
str.Format("[获取二进制字段%s长度失败]!", szField);
OnSQLErr(str.GetBuffer(0), &e);
return FALSE;
}
}
DWORD CDHDBAdo::GetBinFieldLen(int nField)
{
ASSERT( IsOpen() );
CLongBinary *pBin;
try
{
pBin = Field(nField).AsBinary();
return pBin->m_dwDataLength;
}
catch(_com_error& e)
{
CString str;
str.Format("[获取二进制字段 %d 长度失败]!", nField);
OnSQLErr(str.GetBuffer(0), &e);
return FALSE;
}
}
BOOL CDHDBAdo::IsAddNew()
{
ASSERT( IsOpen() );
if(m_Rst->adoEOF||m_Rst->BOF)
{
return FALSE;
}
return (m_Rst->GetEditMode()&adEditAdd);
}
BOOL CDHDBAdo::IsBOF()
{
ASSERT( IsOpen() );
return m_Rst->BOF;
}
BOOL CDHDBAdo::IsEdit()
{
ASSERT( IsOpen() );
if(m_Rst->adoEOF||m_Rst->BOF)
{
return FALSE;
}
return m_Rst->GetEditMode()&adEditInProgress;
}
BOOL CDHDBAdo::IsEOF()
{
ASSERT( IsOpen() );
return m_Rst->adoEOF;
}
BOOL CDHDBAdo::Move(long nRows)
{
ASSERT( IsOpen() );
try
{
return m_Rst->Move(nRows,long(adBookmarkCurrent))==0;
}
catch(_com_error& e)
{
OnSQLErr("移动超出范围",&e);
return FALSE;
}
}
BOOL CDHDBAdo::MoveAbsolute(long nRows)
{
ASSERT( IsOpen() );
try
{
return m_Rst->Move(nRows, long(adBookmarkFirst))==0;
}
catch(_com_error& e)
{
OnSQLErr("移动超出范围",&e);
return FALSE;
}
}
BOOL CDHDBAdo::MoveFirst()
{
ASSERT( IsOpen() );
if(!m_Rst->BOF)
{
m_Rst->MoveFirst();
return TRUE;
}
OnSQLErr("已经到第一条记录\n");
return FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -