📄 ado.cpp
字号:
adGUID 全局唯一的标识符 (GUID) (DBTYPE_GUID)。
adIDispatch OLE 对象上 Idispatch 接口的指针 (DBTYPE_IDISPATCH)。
adInteger 4 字节的带符号整型 (DBTYPE_I4)。
adIUnknown OLE 对象上 IUnknown 接口的指针 (DBTYPE_IUNKNOWN)。
adLongVarBinary 长二进制值。
adLongVarChar 长字符串值。
adLongVarWChar 以空结尾的长字符串值。
adNumeric 具有固定精度和范围的精确数字值 (DBTYPE_NUMERIC)。
adSingle 单精度浮点值 (DBTYPE_R4)。
adSmallInt 2 字节带符号整型 (DBTYPE_I2)。
adTinyInt 1 字节带符号整型 (DBTYPE_I1)。
adUnsignedBigInt 8 字节不带符号整型 (DBTYPE_UI8)。
adUnsignedInt 4 字节不带符号整型 (DBTYPE_UI4)。
adUnsignedSmallInt 2 字节不带符号整型 (DBTYPE_UI2)。
adUnsignedTinyInt 1 字节不带符号整型 (DBTYPE_UI1)。
adUserDefined 用户定义的变量 (DBTYPE_UDT)。
adVarBinary 二进制值。
adVarChar 字符串值。
adVariant 自动变体型 (DBTYPE_VARIANT)。
adVector 与其他类型一起加入逻辑 OR 中,指示数据是 DBVECTOR
结构(由 OLE DB 定义)。该结构含有元素的计数和其他类型
(DBTYPE_VECTOR) 数据的指针。
adVarWChar 以空结尾的 Unicode 字符串。
adWChar 以空结尾的 Unicode 字符串 (DBTYPE_WSTR)。
----------------------------------------------------------
Remarks: 返回指定列的数据类型。
==========================================================================*/
DWORD CAdoRecordSet::GetFieldType(long lIndex)
{
ASSERT(m_pRecordset != NULL);
try
{
FieldPtr field = GetFields()->GetItem(_variant_t(lIndex));
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)
{
Close();
m_pRecordset = pRecordSet;
return m_pRecordset;
}
/*########################################################################
------------------------------------------------
其他方法
------------------------------------------------
########################################################################*/
/*========================================================================
Remarks: 取得当前记录中指定字段的值并转换成字符串
==========================================================================*/
BOOL CAdoRecordSet::GetValueString(CString& strValue, long lFieldIndex,int nFieldType)
{
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,nFieldType);
return TRUE;
}
catch (_com_error e)
{
TRACE(_T(":( 字段访问失败: %s\n"), e.ErrorMessage());
return FALSE;
}
return FALSE;
}
BOOL CAdoRecordSet::GetValueString(CString &strValue, CString strFieldName,int nFieldType)
{
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,nFieldType);
return TRUE;
}
catch (_com_error e)
{
TRACE(_T(":( 字段访问失败: %s\n"), e.ErrorMessage());
return FALSE;
}
return FALSE/**/;
}
BOOL CAdoRecordSet::PutCollect(long index, const _variant_t &pver)
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset != NULL)
{
m_pRecordset->PutCollect(index, pver);
}
}
catch (_com_error e)
{
return FALSE;
}
return FALSE;
}
/*========================================================================
Remarks: 把_variant_t型变量格式化成CString型字符串.
==========================================================================*/
CString CAdoRecordSet::Format(_variant_t var,int nFieldType)
{
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: //小数
strValue.Format("%.4f", var.decVal);
break;
case VT_BOOL://布尔型
strValue = var.boolVal ? "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值
if (nFieldType == 0)
strValue = "";
else
strValue = "NULL";
break;
case VT_EMPTY://空
strValue = "";
break;
case VT_UNKNOWN://未知类型
default:
strValue = "UN_KNOW";
break;
}
return strValue;
}
/*========================================================================
Remarks: 取得当前记录中指定字段的值并转换成整数
==========================================================================*/
BOOL CAdoRecordSet::GetValueInt(int& intValue, 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));
intValue = value.lVal;
return TRUE;
}
catch (_com_error e)
{
TRACE(_T(":( 字段访问失败: %s\n"), e.ErrorMessage());
return FALSE;
}
return FALSE;
}
BOOL CAdoRecordSet::GetValueInt(int &intValue, 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)));
intValue = value.lVal;
return TRUE;
}
catch (_com_error e)
{
TRACE(_T(":( 字段访问失败: %s\n"), e.ErrorMessage());
return FALSE;
}
return FALSE/**/;
}
/*========================================================================
Remarks: 取得当前记录中指定字段的值并转换成BOOL
==========================================================================*/
BOOL CAdoRecordSet::GetValueBool(int& intValue, 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));
intValue = value.boolVal;
return TRUE;
}
catch (_com_error e)
{
TRACE(_T(":( 字段访问失败: %s\n"), e.ErrorMessage());
return FALSE;
}
return FALSE;
}
BOOL CAdoRecordSet::GetValueBool(int &intValue, 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)));
intValue = value.boolVal;
return TRUE;
}
catch (_com_error e)
{
TRACE(_T(":( 字段访问失败: %s\n"), e.ErrorMessage());
return FALSE;
}
return FALSE/**/;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -