📄 ado.cpp
字号:
{
FieldPtr field = GetFields()->GetItem(_variant_t(lIndex));
field->get_Attributes(&dwAttributes);
return dwAttributes;
}
catch (_com_error e)
{
TRACE(_T(":( GetFieldAttributes发生错误: %s\n"), e.ErrorMessage());
return -1;
}
}
/*========================================================================
Name: 指示 Field 对象所定义的长度。
----------------------------------------------------------
returns: 返回某个字段定义的长度(按字节数)的长整型值。
----------------------------------------------------------
Remarks: 使用 DefinedSize 属性可确定 Field 对象的数据容量。
==========================================================================*/
long CAdoRecordSet::GetFieldDefineSize(long lIndex)
{
ASSERT(m_pRecordset != NULL);
try
{
FieldPtr field = GetFields()->GetItem(_variant_t(lIndex));
return field->GetDefinedSize();
}
catch (_com_error e)
{
TRACE(_T(":( GetDefineSize发生错误: %s\n"), e.ErrorMessage());
return -1;
}
}
/*========================================================================
Name: 取得字段的值的实际长度。
----------------------------------------------------------
returns: 返回长整型值。某些提供者允许设置该属性以便为 BLOB 数据预留
空间,在此情况下默认值为 0。
----------------------------------------------------------
Remarks: 使用 ActualSize 属性可返回 Field 对象值的实际长度.对于所有
字段,ActualSize 属性为只读。如果 ADO 无法确定 Field 对象值的实
际长度,ActualSize 属性将返回 adUnknown。
如以下范例所示,ActualSize 和 DefinedSize 属性有所不同:
adVarChar 声明类型且最大长度为 50 个字符的 Field 对象将返回为
50 的 DefinedSize 属性值,但是返回的 ActualSize 属性值是当前记
录的字段中存储的数据的长度。
==========================================================================*/
long CAdoRecordSet::GetFieldActualSize(long lIndex)
{
ASSERT(m_pRecordset != NULL);
try
{
FieldPtr field = GetFields()->GetItem(_variant_t(lIndex));
return field->GetActualSize();
}
catch (_com_error e)
{
TRACE(_T(":( GetFieldActualSize发生错误: %s\n"), e.ErrorMessage());
return -1;
}
}
/*========================================================================
returns: 返回下列 DataTypeEnum 值之一。相应的 OLE DB 类型标识符在下表的说明栏的括号中给出。
常量 说明
---------------------------------------------------------
adArray 与其他类型一起加入逻辑 OR 以指示该数据是那种类型的
安全数组 (DBTYPE_ARRAY)。
adBigInt 8 字节带符号的整数 (DBTYPE_I8)。
adBinary 二进制值 (DBTYPE_BYTES)。
adBoolean 布尔型值 (DBTYPE_BOOL)。
adByRef 与其他类型一起加入逻辑 OR 以指示该数据是其他类型数
据的指针 (DBTYPE_BYREF)。
adBSTR 以空结尾的字符串 (Unicode) (DBTYPE_BSTR)。
adChar 字符串值 (DBTYPE_STR)。
adCurrency 货币值 (DBTYPE_CY)。货币数字的小数点位置固定、小数
点右侧有四位数字。该值保存为 8 字节范围为10,000 的带符
号整型值。
adDate 日期值 (DBTYPE_DATE)。日期按双精度型数值来保存,数
字全部表示从 1899 年 12 月 30 开始的日期数。小数部分是
一天当中的片段时间。
adDBDate 日期值 (yyyymmdd) (DBTYPE_DBDATE)。
adDBTime 时间值 (hhmmss) (DBTYPE_DBTIME)。
adDBTimeStamp 时间戳 (yyyymmddhhmmss 加 10 亿分之一的小数)(DBTYPE_DBTIMESTAMP).
adDecimal 具有固定精度和范围的精确数字值 (DBTYPE_DECIMAL)。
adDouble 双精度浮点值 (DBTYPE_R8)。
adEmpty 未指定值 (DBTYPE_EMPTY)。
adError 32 - 位错误代码 (DBTYPE_ERROR)。
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)
{
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/**/;
}
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)
{
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.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 = "";
break;
case VT_UNKNOWN://未知类型
default:
strValue = "UN_KNOW";
break;
}
return strValue;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -