⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ado 的 vc++ extensions.htm

📁 数据库编程技巧文章
💻 HTM
📖 第 1 页 / 共 2 页
字号:
class CADORecordBinding;

#define classoffset(base, derived)    ((DWORD)(static_cast<base*>((derived*)8))-8)

enum FieldStatusEnum
{   
   adFldOK = 0,
   adFldBadAccessor = 1,
   adFldCantConvertValue = 2,
   adFldNull = 3,
   adFldTruncated = 4,
   adFldSignMismatch = 5,
   adFldDataOverFlow = 6,
   adFldCantCreate = 7,
   adFldUnavailable = 8,
   adFldPermissionDenied = 9,
   adFldIntegrityViolation = 10,
   adFldSchemaViolation = 11,
   adFldBadStatus = 12,
   adFldDefault = 13
};

typedef struct stADO_BINDING_ENTRY
{
   ULONG         ulOrdinal;
    WORD         wDataType;
   BYTE         bPrecision;
   BYTE         bScale;
   ULONG         ulSize;
   ULONG         ulOffSet;
   ULONG         ulIADOBindingEntriesOffSet;
   ULONG         ulFldStatusOffset;
   BOOL         fModify;
} ADO_BINDING_ENTRY;

#define BEGIN_ADO_BINDING(cls) public:    typedef cls ADORowClass;    const ADO_BINDING_ENTRY* STDMETHODCALLTYPE GetADOBindingEntries() {    static const ADO_BINDING_ENTRY rgADOBindingEntries[] = { 

#define ADO_FIXED_LENGTH_BINDING_ENTRY(Ordinal, DataType, Buffer, \   Status, Modify)   {Ordinal,    DataType,    0,    0,    0,    offsetof(ADORowClass, Buffer),    classoffset(CADORecordBinding, ADORowClass),    offsetof(ADORowClass, Status),    Modify},

#define ADO_NUMERIC_BINDING_ENTRY(Ordinal, DataType,    Buffer, Precision, Scale, Status, Modify)   {Ordinal,    DataType,    Precision,    Scale,    0,    offsetof(ADORowClass, Buffer),    classoffset(CADORecordBinding, ADORowClass),    offsetof(ADORowClass, Status),    Modify},

#define ADO_VARIABLE_LENGTH_BINDING_ENTRY(Ordinal, DataType,    Buffer, Size, Status, Modify)   {Ordinal,    DataType,    0,    0,    Size,    offsetof(ADORowClass, Buffer),    classoffset(CADORecordBinding, ADORowClass),    offsetof(ADORowClass, Status),    Modify},

#define END_ADO_BINDING() {0, adEmpty, 0, 0, 0, 0, 0, adFldOK, FALSE}};   return rgADOBindingEntries;}

//
// 客户端“记录”类需要支持的接口。
// ADO 绑定条目提供执行该接口。
//
class CADORecordBinding
{
public:
   STDMETHOD_(const ADO_BINDING_ENTRY*, GetADOBindingEntries) 
   (VOID) PURE;
};

//
// 接口允许客户程序获取数据记录并传递给类数据成员。
//
DEFINE_GUID(IID_IADORecordBinding, 
            0x00000544, 0, 0x10, 0x80,0,0,0xAA,0,0x6D,0x2E,0xA4);
DECLARE_INTERFACE_(IADORecordBinding, IUnknown)
{
public:
   STDMETHOD(BindToRecordset)(CADORecordBinding *pAdoRecordBinding)PURE;
   STDMETHOD(AddNew)(CADORecordBinding *pAdoRecordBinding) PURE;
   STDMETHOD(Update)(CADORecordBinding *pAdoRecordBinding) PURE;
};

#endif // !_ICRSINT_H_</CODE></PRE>
<H1><A name=mdmscexampleadowithoutextensions></A>范例: 无 Extensions 的 ADO</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="mdmscExampleADOWithoutExtensions_C"><PARAM NAME="Button" VALUE="请参阅"></OBJECT>&nbsp;&nbsp;&nbsp;
<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="mdmscExampleADOWithoutExtensions_S"><PARAM NAME="Button" VALUE="指定项"></OBJECT></P>
<P>该程序段说明了如何从字段检索数值并将数值转换为 C++ 变量。</P><PRE><CODE>#import "c:\Program Files\Common Files\System\ADO\msado15.dll" 
   no_namespace rename("EOF", "EndOfFile")
#include &lt;stdio.h&gt;

Class CEmployee
{
public:
   FetchEmployeeData();

   char m_szFirstName[30];
   char m_szLastName[30];
   int nAge;
};

CEmployee::FetchEmployeeData()
{
_ConnectionPtr   pCon();
_RecordsetPtr    pRs();
FieldPtr         pfldFirstName, pfldLastName, pfldAge;
_variant_t      vFirstName, vLastName, vAge;

pCon.CreateInstance(__uuidof(Connection));
pCon-&gt;Open(</CODE>“<CODE>pubs</CODE>”<CODE>, </CODE>“<CODE>sa</CODE>”<CODE>, </CODE>“”<CODE>);</CODE>

<CODE>pRs.CreateInstance(__uuidof(Recordset));</CODE>
<CODE>pRs-&gt;Open(</CODE>“<CODE>select FirstName, LastName, Age from Employees</CODE>”<CODE>, pCon, </CODE>
<CODE>   adOpenForwardOnly, adLockReadOnly, adCmdUnknown);</CODE>

<CODE>pfldFirstName = pRs-&gt;Fields-&gt;GetItem(0);</CODE>
<CODE>pfldLastName = pRs-&gt;Fields-&gt;GetItem(1);</CODE>
<CODE>pfldAge = pRs-&gt;Fields-&gt;GetItem(2);</CODE>

<CODE>while (VARIANT_FALSE == pRs-&gt;EndOfFile)</CODE>
<CODE>   {</CODE>
<CODE>   vFirstName.Clear();</CODE>
<CODE>   vLastName.Clear();</CODE>
<CODE>   vAge.Clear();</CODE>

<CODE>   vFirstName = pfldFirstName-&gt;Value;</CODE>
<CODE>   WideCharToMultiByte(CP_ACP, 0, vFirstName.bstrVal, -1, </CODE>
<CODE>      m_szFirstName, sizeof(m_szFirstName), NULL, NULL);</CODE>

<CODE>   vLastName = pfldLastName-&gt;Value;</CODE>
<CODE>   WideCharToMultiByte(CP_ACP, 0, vLastName.bstrVal, -1, </CODE>
<CODE>      m_szLastName, sizeof(m_szLastName), NULL, NULL);</CODE>

<CODE>   nAge = vAge.iVal;</CODE>

<CODE>   pRs-&gt;MoveNext();</CODE>
<CODE>   }</CODE>
<CODE>}</CODE>
</PRE>
<H1><A name=mdmscexampleadowithextensions></A>范例: 带 Extensions 的 ADO</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="mdmscExampleADOWithExtensions_C"><PARAM NAME="Button" VALUE="请参阅"></OBJECT>&nbsp;&nbsp;&nbsp;
<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="mdmscExampleADOWithExtensions_S"><PARAM NAME="Button" VALUE="指定项"></OBJECT></P>
<P>该程序说明了如何从字段检索数值并将数值转换为 C++ 变量。它包括了在程序段(<A href="mk:@MSITStore:E:\MSDN98\98VS\2052\ADO200.CHM::/mdvcppextensions_4flf.htm">范例:无 Extensions 的 ADO</A>)中所描述的功能。</P><PRE><CODE>#define INITGUID
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" 
   no_namespace rename("EOF", "EndOfFile")
#include &lt;stdio.h&gt;
#include "icrsint.h"

void dump_com_error(_com_error &amp;e)
   {
printf("Error\n");
printf("\a\tCode = %08lx\n", e.Error());
printf("\a\tCode meaning = %s", e.ErrorMessage());
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
printf("\a\tSource = %s\n", (LPCSTR) bstrSource);
printf("\a\tDescription = %s\n", (LPCSTR) bstrDescription);
</CODE>   }

<CODE>class CCustomRs : </CODE>
<CODE>   public CADORecordBinding</CODE>
<CODE>{</CODE>
<CODE>BEGIN_ADO_BINDING(CCustomRs)</CODE>
<CODE>   ADO_VARIABLE_LENGTH_BINDING_ENTRY(1, adVarChar, m_szau_lname, </CODE>
<CODE>         sizeof(m_szau_lname), lau_lnameStatus, FALSE)</CODE>
<CODE>   ADO_VARIABLE_LENGTH_BINDING_ENTRY(2, adVarChar, m_szau_fname, </CODE>
<CODE>         sizeof(m_szau_fname), lau_fnameStatus, TRUE)</CODE>
<CODE>END_ADO_BINDING()</CODE>

<CODE>public:</CODE>
<CODE>   CHAR   m_szau_lname[41];</CODE>
<CODE>   ULONG   lau_lnameStatus;</CODE>
<CODE>   CHAR   m_szau_fname[41];</CODE>
<CODE>   ULONG   lau_fnameStatus;</CODE>
<CODE>};</CODE>

<CODE>VOID   main()</CODE>
<CODE>   {</CODE>
<CODE>   HRESULT hr;</CODE>
<CODE>   IADORecordBinding   *picRs = NULL;</CODE>
<CODE>   </CODE>
<CODE>   ::CoInitialize(NULL);</CODE>

<CODE>   try </CODE>
<CODE>      {</CODE>
<CODE>      _RecordsetPtr pRs.CreateInstance(__uuidof(Recordset));      CCustomRs rs;</CODE>
<CODE>      </CODE>
<CODE>      pRs-&gt;Open("select FirstName, LastName, Age from Employees", </CODE>
<CODE>         "dsn=pubs;uid=sa;pwd=;", </CODE>
<CODE>         adOpenStatic, adLockOptimistic, adCmdUnknown);</CODE>
<CODE>      </CODE>
<CODE>      if (FAILED(hr = pRs-&gt;QueryInterface(__uuidof(IADORecordBinding), </CODE>
<CODE>            (LPVOID*)&amp;picRs)))</CODE>
<CODE>         _com_issue_error(hr);</CODE>
<CODE>      </CODE>
<CODE>      if (FAILED(hr = picRs-&gt;BindToRecordset(&amp;rs)))</CODE>
<CODE>         _com_issue_error(hr);</CODE>

<CODE>      while (VARIANT_FALSE == pRs-&gt;EndOfFile)</CODE>
<CODE>         {</CODE>
<CODE>      // 处理 CCustomRs C++ 实例变量中的数据。</CODE>

<CODE>         printf("\a\tName = %s \t%s", </CODE>
<CODE>            (lau_fnameStatus == adFldOK ? m_szau_fname : "&lt;NULL&gt;"), </CODE>
<CODE>            (lau_lnameStatus == adFldOK ? m_szau_lname): "&lt;NULL&gt;"));</CODE>

<CODE>      // 更改 Recordset 的当前行。</CODE>
<CODE>      // 新当前行的 Recordset 数据将被</CODE>
<CODE>      // 自动取出并防止在 CCustomRs C++ 实例变量中</CODE>
<CODE>   </CODE>
<CODE>         pRs-&gt;MoveNext();</CODE>
<CODE>         }</CODE>
<CODE>      }</CODE>
<CODE>   catch (_com_error &amp;e)</CODE>
<CODE>      {</CODE>
<CODE>      dump_com_error(e);</CODE>
<CODE>      }</CODE>

<CODE>   if (picRs)</CODE>
<CODE>      picRs-&gt;Release();</CODE>

<CODE>   CoUninitialize();</CODE>
<CODE>   };</CODE>
</PRE>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P><br><br>
</DIV></div></div>
<script src='../../../get_readnum.asp?id=
6504
'></script>
</center></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -