📄 ado 的 vc++ extensions.htm
字号:
<HTML>
<HEAD>
<meta http-equiv='Content-Type' content='text/html; charset=gb2312'>
<meta HTTP-EQUIV='Expires' CONTENT=0>
<link rel='stylesheet' href='../../../../news.css'>
<style type='text/css'>
.fst{padding:0px 15px;width:770px;background:#eeeecc;border-left:1px solid #000000;border-right:1px solid #000000}
.fstdiv3 img{border:0px;border-right:8px solid #eeeecc;border-top:6px solid #eeeecc}
</style>
<title>
ADO 的 VC++ Extensions(简化VARIANT 与C++ 数据类型的烦琐转化,附源代码)
</title>
</HEAD>
<BODY aLink=#990000 bgColor=#ffffff bottomMargin=0 leftMargin=0 rightMargin=0 topMargin=0 marginwidth=0 marginheight=0>
<center>
<TABLE align=center bgColor=#cccc99 border=0 cellPadding=2 cellSpacing=0 width=770>
<TBODY>
<TR>
<TH align=left >
ADO 的 VC++ Extensions(简化VARIANT 与C++ 数据类型的烦琐转化,附源代码)
</TH>
</TD></TR>
</TBODY></TABLE>
<TABLE align=center bgColor=#eeeecc border=1 cellPadding=1 cellSpacing=0 width=770>
<TBODY>
<TR><TD colSpan=5 >
<a href='http://www.csdn.net'>中国软件开发网络</a>
-->
<a href='http://www.csdn.net/develop'>开发图书馆</a>
-->
<a href='http://www.csdn.net\develop\list_article.asp?lib=1&bigclassid=
1
'>
Visual C++
</a>
-->
<a href='http://www.csdn.net\develop\list_article.asp?lib=1&bigclassid=
1
&smallclassid=
107
'>
数据库操作
</a>
-->
<a href='
http://www.csdn.net/develop/library/vc/datebase/6504.shtm
'>
ADO 的 VC++ Extensions(简化VARIANT 与C++ 数据类型的烦琐转化,附源代码)
</a>
</TD></tr>
<TR>
<TD align=left width=300>
<B>关键字:</B><BR>
ADO,数据库,Visual C++
</TD>
<TD align=middle width=120>
<B>贴文时间</B><br>
2001-4-23 17:09:58
</TD>
<TD align=middle width=80>
<B>文章类型: </B><BR>
收藏
</TD>
<TD align=middle width=100>
<B>给贴子投票 </B>
<BR><a href='http://www.csdn.net/develop/addscore.asp?id=
6504
'>投票</a>
</TD></TR>
<TR>
<TD >
ajun21cn
收藏
</TD>
<TD colSpan=3 vAlign=top>
<B>出处: </B><A href='
'>
</A></TD></TR>
<TR><TD colSpan=5 bgcolor=#cccc99> </TD></TR>
</TD></TR></TBODY></TABLE>
<div align=center><div class=fst align=left><div class=fstdiv3 id=print2>
<br><br><P> <FONT size=5><STRONG>ADO 的 VC++ Extensions</STRONG></FONT></P>
<P> 当用 ADO 检索数据时,Visual C++ 程序员所面对的一个最冗长而乏味的工作是必须将以 VARIANT 数据类型返回的数据转换为 C++ 数据类型,然后将转换后的数据存入类或结构中。此外,通过 VARIANT 数据类型检索 C++ 数据的过程繁琐并有损性能。</P>
<P>ADO 2.0 版本提供的接口支持不通过 VARIANT 便可将数据检索到本地 C/C++ 数据类型。此外,ADO 提供的预处理宏简化了接口的使用。由此获得了这样一个灵活、易用和高性能的工具。</P>
<UL type=disc>
<LI>ADO 2.0 提供接口方法和预处理宏以简化将 <B>Recordset</B> 字段值转化为 C/C++ 变量的过程。<BR><BR>
<LI>这些扩展程序使用简便并且性能良好。<BR><BR>
<LI>总结介绍了所提供的预处理宏和接口方法。<BR><BR>
<LI>代码范例描述了 VC++ Extensions 头文件的详细内容。<BR><BR>
<LI>范例说明了在使用和不使用 ADO VC++ Extensions 的情况下如何转换字段值。</LI></UL>
<P> 普通的 C/C++ 客户端方案将 <B>Recordset</B> 中的记录绑定到包含本地 C/C++ 类型的 C/C++ 结构/类上。使用 VARIANT 时,将涉及编写从 VARIANT 到 C/C++ 本地类型的转换代码。ADO VC++ Extensions 的目的是便于 VC++ 程序员使用上述方案。</P>
<P>ADO VC++ Extensions 可将 <B>Recordset</B> 对象的字段映射到 C/C++ 变量,字段与变量的映射称为<B>绑定条目</B>。预处理宏用来定义数值、定长和变长变量的绑定条目。</P>
<P>将 <B>BEGIN_ADO_BINDING</B> 和 <B>END_ADO_BINDING</B> 宏之间的绑定条目用括号括起。不要在绑定条目结尾使用逗号或分号,这些定界符仅限在宏中使用。</P>
<P>为每个将被转换为 C/C++ 变量的字段指定一个绑定条目。使用适当的 <B>ADO_FIXED_LENGTH_BINDING_ENTRY</B>,<B>ADO_NUMERIC_BINDING_ENTRY </B>或 <B>ADO_VARIABLE_LENGTH_BINDING_ENTRY</B> 宏。</P>
<P>在宏的参数中,用序数指定将被提出的 <B>Recordset</B> 字段 — 0 标识第一字段,1 标识第二字段,依此类推。</P>
<P>使用数据类型声明 C/C++ 变量。如果变量为数值,也可指定精度和范围。如果变量为变长变量(如字符串),则必须以字节指定变量的最大尺寸。如果需要,<B>Recordset</B> 字段值可被强制为该数据类型。</P>
<P>指定临时的工作缓冲区,用来将字段值从 VARIANT 转换为 C/C++ 变量。缓冲区应至少与此 C/C++ 变量一样大。</P>
<P>将布尔型修改参数设置为 TRUE 使 ADO 可更新绑定的字段,如只检查字段而不将其更改,可设置为 FALSE。VC++ Extensions 不保留有关字段的状态信息,因此必须指定 ADO 是否更改字段值(例如,由数据源保留的自动增值字段的值)。因此该字段的修改参数应设置为 FALSE。</P>
<P>状态参数可告诉您从 <B>Recordset</B> 字段到 C 或 C++ 变量的转换是否成功以及变量的内容是否有效。该参数的两个最重要的值是 <B>adFldOK </B>(意味着转换成功)和 <B>adFldNull</B> (意味着字段是 NULL—无值可供转换)。</P>
<P>首先检测该参数以决定 C 或 C++ 变量是否有效。例如,如果字段具有有效的行内容,状态将会是 <B>adFldOK</B>;如果移动到另一个字段为 NULL 的行,状态则将是 <B>adFldNull</B>。然而,C 或 C++ 变量的内容将不被更改 — 该变量将仍然包含上一行的字段值。</P>
<P class=label><B>将 Recordset 绑定到变量</B></P>
<P>在应用程序中,调用 <B>BindToRecordset</B> 接口方法可使 <B>Recordset</B> 字段关联(或绑定)到 C/C++ 变量,无论何时更改 <B>Recordset</B> 对象的当前行,C/C++ 变量都将自动更新。</P>
<P class=label><B>头文件</B></P>
<P>要使用 VC++ Extensions,请在应用程序中包含如下文件:
<UL type=disc>
<LI>#include <icrsint.h> </LI></UL>
<P class=label><B>接口方法</B></P>
<P><B>IADORecordBinding</B> 接口具有使 <B>Recordset</B> 字段与 C/C++ 变量关联、添加新行和执行更新的方法。所有这三个方法都可使指针指向来自 <B>CADORecordBinding</B> 的类,该 <B>CADORecordBinding</B> 定义每个字段和变量之间的绑定。</P>
<P>接口方法是:
<UL type=disc>
<LI><B>BindToRecordset</B>(<I>&binding</I>) </LI></UL>
<P>调用该方法可关联变量与字段。
<UL type=disc>
<LI><B>AddNew</B>(&<I>binding</I>) </LI></UL>
<P>调用该方法可直接调用 ADO <B>AddNew</B> 方法。
<UL type=disc>
<LI><B>Update</B>(&<I>binding</I>) </LI></UL>
<P>调用该方法可直接调用 ADO <B>Update</B> 方法。</P>
<P class=label><B>预处理宏</B>
<UL type=disc>
<LI>BEGIN_ADO_BINDING(<I>cls</I>)<BR><BR>
<LI>ADO_FIXED_LENGTH_BINDING_ENTRY(<I>Ordinal</I>, <I>DataType</I>, <I>Buffer</I>, <I>Status</I>, <I>Modify</I>)<BR><BR>
<LI>ADO_NUMERIC_BINDING_ENTRY(<I>Ordinal</I>, <I>DataType</I>, <I>Buffer</I>, <I>Precision</I>, <I>Scale</I>, <BR><I>Status</I>, <I>Modify</I>)<BR><BR>
<LI>ADO_VARIABLE_LENGTH_BINDING_ENTRY(<I>Ordinal</I>, <I>DataType</I>, <I>Buffer</I>, <I>Size</I>, <BR><I>Status</I>, <I>Modify</I>)<BR><BR>
<LI>END_ADO_BINDING() </LI></UL>
<P>
<TABLE border=1 cellPadding=5 cols=2 frame=below rules=rows style="FONT-SIZE: 10.5pt">
<TBODY>
<TR vAlign=top>
<TD class=label width=288><B>参数</B></TD>
<TD class=label width=308><B>说明</B></TD></TR>
<TR vAlign=top>
<TD width=288><I>Cls</I></TD>
<TD width=308>类,定义绑定条目,缓冲区,和<B> Recordset</B> 对象。</TD></TR>
<TR vAlign=top>
<TD width=288><I>Ordinal</I></TD>
<TD width=308>按顺序的字段号码,0 标识第一字段,1 标识第二字段,依此类推。</TD></TR>
<TR vAlign=top>
<TD width=288><I>DataType</I></TD>
<TD width=308>储存已转换字段的变量的数据类型。</TD></TR>
<TR vAlign=top>
<TD width=288><I>Buffer</I></TD>
<TD width=308>缓冲区,用于将字段转换为变量。</TD></TR>
<TR vAlign=top>
<TD width=288><I>Status</I></TD>
<TD width=308>指示字段转换是否成功。</TD></TR>
<TR vAlign=top>
<TD width=288><I>Modify</I></TD>
<TD width=308>布尔标志;如果为 TRUE,则表明 ADO 可以更新关联的字段。</TD></TR>
<TR vAlign=top>
<TD width=288><I>Precision</I></TD>
<TD width=308>在数值变量中可被表现出的数字位数。</TD></TR>
<TR vAlign=top>
<TD width=288><I>Scale</I></TD>
<TD width=308>位于数值变量中的小数点后的位数。</TD></TR>
<TR vAlign=top>
<TD width=289><I>Size</I></TD>
<TD width=306>变长变量所需的字节数,诸如:字符串。</TD></TR></TBODY></TABLE><BR>
<TABLE border=1 cellPadding=5 cols=2 frame=below rules=rows style="FONT-SIZE: 10.5pt">
<TBODY>
<TR vAlign=top>
<TD class=label width=286><B><I>status</I> 参数值</B></TD>
<TD class=label width=309><B>说明</B></TD></TR>
<TR vAlign=top>
<TD width=286><B>AdFldOK</B></TD>
<TD width=309>返回非 NULL 字段值。</TD></TR>
<TR vAlign=top>
<TD width=286><B>AdFldBadAccessor</B></TD>
<TD width=309>绑定无效。</TD></TR>
<TR vAlign=top>
<TD width=286><B>AdFldCantConvertValue</B></TD>
<TD width=309>由于符号不匹配和数据溢出以外的原因,值不能转换。</TD></TR>
<TR vAlign=top>
<TD width=286><B>AdFldNull</B></TD>
<TD width=309>返回 NULL。</TD></TR>
<TR vAlign=top>
<TD width=286><B>AdFldTruncated</B></TD>
<TD width=309>变长数据或数值型数字被截短。</TD></TR>
<TR vAlign=top>
<TD width=286><B>AdFldSignMismatch</B></TD>
<TD width=309>值带有符号而变量数据类型不带符号。</TD></TR>
<TR vAlign=top>
<TD width=286><B>AdFldDataOverFlow</B></TD>
<TD width=309>值大于在变量数据类型中的存储大小。</TD></TR>
<TR vAlign=top>
<TD width=286><B>AdFldCantCreate</B></TD>
<TD width=309>列类型未知并且字段已被打开。</TD></TR>
<TR vAlign=top>
<TD width=286><B>AdFldUnavailable</B></TD>
<TD width=309>不能决定字段值 — 例如在无默认值的新建、未指定的字段中。</TD></TR>
<TR vAlign=top>
<TD width=286><B>AdFldPermissionDenied</B></TD>
<TD width=309>更新时,不允许写入数据。</TD></TR>
<TR vAlign=top>
<TD width=286><B>AdFldIntegrityViolation</B></TD>
<TD width=309>更新时,字段值将破坏列的完整性。</TD></TR>
<TR vAlign=top>
<TD width=286><B>AdFldSchemaViolation</B></TD>
<TD width=309>更新时,字段值将破坏列方案。</TD></TR>
<TR vAlign=top>
<TD width=286><B>AdFldBadStatus</B></TD>
<TD width=309>更新时,无效的状态参数。</TD></TR>
<TR vAlign=top>
<TD width=286><B>AdFldDefault</B></TD>
<TD width=310>更新时,使用默认值。</TD></TR></TBODY></TABLE></P>
<H1><A name=mdmscvcextensionsheaderindetail></A>VC++ Extensions 头文件的详细资料</H1>
<P>
<OBJECT classid=clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11 height=12 id=alink_1 style="HEIGHT: 12px; LEFT: 10px; TOP: 58px; WIDTH: 36px" type=application/x-oleobject width=36><PARAM NAME="Width" VALUE="1005"><PARAM NAME="Height" VALUE="688"><PARAM NAME="Command" VALUE="ALink,MENU"><PARAM NAME="Item1" VALUE=""><PARAM NAME="Item2" VALUE="mdmscVCExtensionsHeaderInDetail_C"><PARAM NAME="Button" VALUE="请参阅"></OBJECT>
<OBJECT classid=clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11 height=12 id=alink_2 style="HEIGHT: 12px; LEFT: 69px; TOP: 58px; WIDTH: 36px" type=application/x-oleobject width=36><PARAM NAME="Width" VALUE="1005"><PARAM NAME="Height" VALUE="688"><PARAM NAME="Command" VALUE="ALink,MENU"><PARAM NAME="Item1" VALUE=""><PARAM NAME="Item2" VALUE="mdmscVCExtensionsHeaderInDetail_S"><PARAM NAME="Button" VALUE="指定项"></OBJECT></P>
<P>下列头文件 (icrsint.h) 详细说明了允许客户提取一行数据并直接送至类数据成员的接口。客户程序需要在其类中包含绑定条目,以指定 <B>Recordset Field</B> 对象和类数据成员之间的关联。</P><PRE><CODE>#ifndef _ICRSINT_H_
#define _ICRSINT_H_
#include <olectl.h>
#include <stddef.h>
// forwards
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -