📄 ado.cpp
字号:
{
FieldPtr field = GetFields()->GetItem(_variant_t(lIndex));
return field->GetType();
}
catch (_com_error e)
{
TRACE(_T(":( GetField发生异常: %s\n"), e.ErrorMessage());
return NULL;
}
}
DWORD CAdoRecordSet::GetFieldType(LPCTSTR strfield)
{
ASSERT(m_pRecordset != NULL);
try
{
FieldPtr field = GetFields()->GetItem(strfield);
return field->GetType();
}
catch (_com_error e)
{
TRACE(_T(":( GetField发生异常: %s\n"), e.ErrorMessage());
return NULL;
}
}
/*========================================================================
Name: 取得指定列的字段对象的指针.
==========================================================================*/
FieldPtr CAdoRecordSet::GetField(long lIndex)
{
try
{
return GetFields()->GetItem(_variant_t(lIndex));
}
catch (_com_error e)
{
TRACE(_T(":( GetField发生异常: %s\n"), e.ErrorMessage());
return NULL;
}
}
const _RecordsetPtr& CAdoRecordSet::GetRecordset()
{
return m_pRecordset;
}
CString CAdoRecordSet::GetLastError()
{
ASSERT(m_pConnection != NULL);
return m_pConnection->GetLastError();
}
/*========================================================================
Name: 取消执行挂起的异步 Execute 或 Open 方法的调用.
-----------------------------------------------------
Remarks: 使用 Cancel 方法终止执行异步 Execute 或 Open 方法调用(即通
过 adAsyncConnect、adAsyncExecute 或 adAsyncFetch 参数调用的方法).
如果在试图终止的方法中没有使用 adAsyncExecute,则 Cancel 将返回运行
时错误.
下表显示在特定类型对象上使用 Cancel 方法时将终止的任务.
如果对象为 将终止对该方法的上一次异步调用
-------------------------------------------------
Command Execute
Connection Execute 或 Open
Recordset Open
==========================================================================*/
BOOL CAdoRecordSet::Cancel()
{
ASSERT(m_pRecordset != NULL);
try
{
return m_pRecordset->Cancel();
}
catch (_com_error e)
{
TRACE(_T(":( Cancel发生异常: %s\n"), e.ErrorMessage());
return FALSE;
}
return FALSE;
}
_RecordsetPtr CAdoRecordSet::operator =(_RecordsetPtr &pRecordSet)
{
Release();
m_pRecordset = pRecordSet;
return m_pRecordset;
}
/*########################################################################
------------------------------------------------
其他方法
------------------------------------------------
########################################################################*/
/*========================================================================
Remarks: 取得当前记录中指定字段的值并转换成字符串
==========================================================================*/
BOOL CAdoRecordSet::GetValueString(CString& strValue, long lFieldIndex)
{
ASSERT(m_pRecordset != NULL);
if (lFieldIndex < 0 || lFieldIndex >= GetFieldsCount())
{
return FALSE;
}
try
{
if (m_pRecordset == NULL || m_pRecordset->State == adStateClosed)
{
MessageBox(NULL,"数据库可能已经断开,\r\n请重新连接、然后重试.","提示",MB_ICONINFORMATION);
return FALSE;
}
if (m_pRecordset->adoEOF)
{
return FALSE;
}
_variant_t value = m_pRecordset->GetCollect(_variant_t(lFieldIndex));
strValue = Format(value);
return TRUE;
}
catch (_com_error e)
{
TRACE(_T(":( 字段访问失败: %s\n"), e.ErrorMessage());
return FALSE;
}
return FALSE;
}
BOOL CAdoRecordSet::GetValueString(CString &strValue, CString strFieldName)
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset == NULL || m_pRecordset->State == adStateClosed)
{
MessageBox(NULL,"数据库可能已经断开,\r\n请重新连接、然后重试.","提示",MB_ICONINFORMATION);
return FALSE;
}
if (m_pRecordset->adoEOF)
{
return FALSE;
}
_variant_t value = m_pRecordset->GetCollect(_variant_t(LPCTSTR(strFieldName)));
strValue = Format(value);
return TRUE;
}
catch (_com_error e)
{
TRACE(_T(":( 字段访问失败: %s\n"), e.ErrorMessage());
return FALSE;
}
return FALSE/**/;
}
/*========================================================================
Remarks: 把_variant_t型变量格式化成CString型字符串.
==========================================================================*/
CString CAdoRecordSet::Format(_variant_t var)
{
DATE dt;
COleDateTime da;
CString strValue;
switch (var.vt)
{
case VT_BSTR://字符串
case VT_LPSTR://字符串
case VT_LPWSTR://字符串
strValue = (LPCTSTR)(_bstr_t)var;
break;
case VT_I2://短整型
strValue.Format("%d", var.iVal);
break;
case VT_UI2://无符号短整型
strValue.Format("%d", var.uiVal);
break;
case VT_VOID://
case VT_INT://整型
case VT_I4://整型
strValue.Format("%d", var.intVal);
break;
case VT_I8://长整型
strValue.Format("%d", var.lVal);
break;
case VT_UINT://无符号整型
case VT_UI4://无符号整型
strValue.Format("%d", var.uintVal);
break;
case VT_UI8://无符号长整型
strValue.Format("%d", var.ulVal);
break;
case VT_R4://浮点型
strValue.Format("%.4f", var.fltVal);
break;
case VT_R8://双精度型
strValue.Format("%.8f", var.dblVal);
break;
case VT_DECIMAL: //小数
{
double val = var.decVal.Lo32;
val *= (var.decVal.sign == 128)? -1 : 1;
val /= pow(10, var.decVal.scale);
strValue.Format("%.4f", val);
}
break;
case VT_BOOL://布尔型
strValue = var.lVal ? "TRUE" : "FALSE";
break;
case VT_DATE: //日期型
dt = var.date;
da = COleDateTime(dt);
strValue = da.Format("%Y-%m-%d %H:%M:%S");
break;
case VT_NULL://NULL值
strValue = "NULL";
break;
case VT_EMPTY://空
strValue = "EMPTY";
break;
case VT_UNKNOWN://未知类型
default:
strValue = "UN_KNOW";
break;
}
return strValue;
}
BOOL CAdoRecordSet::SetCacheSize(const long &lCacheSize)
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset != NULL && !(GetState() & adStateExecuting))
{
return SUCCEEDED(m_pRecordset->put_CacheSize(lCacheSize));
}
}
catch (const _com_error& e)
{
TRACE(_T(":( SetCacheSize方法发生异常: %s\n"), e.ErrorMessage());
return FALSE;
}
return FALSE;
}
/*========================================================================
Name: 确定指定的 Recordset 对象是否支持特定类型的功能。
----------------------------------------------------------
Params: CursorOptions 长整型,包括一个或多个下列 CursorOptionEnum 值。
常量 说明
adAddNew 可使用 AddNew 方法添加新记录。
adApproxPosition 可读取并设置 AbsolutePosition 和 AbsolutePage 的属性。
adBookmark 可使用 Bookmark 属性获得对特定记录的访问。
adDelete 可以使用 Delete 方法删除记录。
AdHoldRecords 可以检索多个记录或者更改下一个检索位置而不必提交所有挂起的更改。
AdMovePrevious 可使用 MoveFirst 和 MovePrevious 方法,以及 Move 或
GetRows 方法将当前记录位置向后移动而不必使用书签。
AdResync 通过 Resync 方法,使用在基本的数据库中可见的数据更新游标。
AdUpdate 可使用 Update 方法修改现有的数据。
AdUpdateBatch 可以使用批更新(UpdateBatch 和 CancelBatch 方法)将更改组传输给提供者。
AdIndex 可以使用 Index 属性命名索引。
AdSeek 可以使用 Seek 方法定位 Recordset 中的行。
----------------------------------------------------------
returns: 返回布尔型值,指示是否支持 CursorOptions 参数所标识的所有功能。
----------------------------------------------------------
Remarks: 使用 Supports 方法确定 Recordset 对象所支持的功能类型。如果
Recordset 对象支持其相应常量在 CursorOptions 中的功能,那么 Supports
方法返回 True。否则返回 False。
注意 尽管 Supports 方法可对给定的功能返回 True,但它不能保证提供者可
以使功能在所有环境下均有效。Supports 方法只返回提供者是否支持指定的功能
(假定符合某些条件)。例如,Supports 方法可能指示 Recordset 对象支持更新
(即使游标基于多个表的合并),但并且某些列仍然无法更新。
==========================================================================*/
BOOL CAdoRecordSet::Supports(CursorOptionEnum CursorOptions)
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset != NULL)
{
BOOL bSupports = m_pRecordset->Supports(CursorOptions);
return bSupports;
}
}
catch (const _com_error& e)
{
TRACE(_T(":( Supports方法发生异常: %s\n"), e.ErrorMessage());
return FALSE;
}
return FALSE;
}
/*########################################################################
------------------------------------------------
数据存取
------------------------------------------------
########################################################################*/
BOOL CAdoRecordSet::PutCollect(long index, const _variant_t &value)
{
ASSERT(m_pRecordset != NULL);
ASSERT(index < GetFieldsCount());
try
{
if (m_pRecordset != NULL && index < GetFieldsCount())
{
m_pRecordset->PutCollect(_variant_t(index), value);
}
}
catch (_com_error e)
{
return FALSE;
}
return FALSE;
}
BOOL CAdoRecordSet::PutCollect(LPCSTR strFieldName, _variant_t &value)
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset != NULL)
{
m_pRecordset->put_Collect(_variant_t(strFieldName), value);
}
}
catch (_com_error e)
{
return FALSE;
}
return FALSE;
}
BOOL CAdoRecordSet::PutCollect(long index, const LPCTSTR &value)
{
ASSERT(m_pRecordset != NULL);
#ifdef _DEBUG
if (! (GetFieldType(index) == adVarChar
|| GetFieldType(index) == adChar
|| GetFieldType(index) == adLongVarChar))
AfxMessageBox("你要存储的字段与变量的数据类型不符");
#endif
ASSERT(GetFieldType(index) == adVarChar
|| GetFieldType(index) == adChar
|| GetFieldType(index) == adLongVarChar);
return PutCollect(index, _variant_t(value));
}
BOOL CAdoRecordSet::PutCollect(long index, const BYTE &value)
{
ASSERT(m_pRecordset != NULL);
#ifdef _DEBUG
if (GetFieldType(index) != adUnsignedTinyInt)
AfxMessageBox("你要存储的字段与变量的数据类型不符");
#endif
ASSERT(GetFieldType(index) == adUnsignedTinyInt);
return PutCollect(index, _variant_t(value));
}
BOOL CAdoRecordSet::PutCollect(long index, const short &value)
{
ASSERT(m_pRecordset != NULL);
#ifdef _DEBUG
if (GetFieldType(index) != adSmallInt)
AfxMessageBox("你要存储的字段与变量的数据类型不符");
#endif
ASSERT(GetFieldType(index) == adSmallInt);
return PutCollect(index, _variant_t(value));
}
BOOL CAdoRecordSet::PutCollect(long index, const int &value)
{
ASSERT(m_pRecordset != NULL);
#ifdef _DEBUG
if (GetFieldType(index) != adInteger)
AfxMessageBox("你要存储的字段与变量的数据类型不符");
#endif
ASSERT(GetFieldType(index) == adInteger);
return PutCollect(index, _variant_t(long(value)));
}
BOOL CAdoRecordSet::PutCollect(long index, const long &value)
{
ASSERT(m_pRecordset != NULL);
#ifdef _DEBUG
if (GetFieldType(index) != adBigInt)
AfxMessageBox("你要存储的字段与变量的数据类型不符");
#endif
ASSERT(GetFieldType(index) == adBigInt);
return PutCollect(index, _variant_t(value));
}
BOOL CAdoRecordSet::PutCollect(long index, const float &value)
{
ASSERT(m_pRecordset != NULL);
#ifdef _DEBUG
if (GetFieldType(index) != adSingle)
AfxMessageBox("你要存储的字段与变量的数据类型不符");
#endif
ASSERT(GetFieldType(index) == adSingle);
return PutCollect(index, _variant_t(value));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -