📄 ado 的 vc++ extensions.htm
字号:
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>
<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 <stdio.h>
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->Open(</CODE>“<CODE>pubs</CODE>”<CODE>, </CODE>“<CODE>sa</CODE>”<CODE>, </CODE>“”<CODE>);</CODE>
<CODE>pRs.CreateInstance(__uuidof(Recordset));</CODE>
<CODE>pRs->Open(</CODE>“<CODE>select FirstName, LastName, Age from Employees</CODE>”<CODE>, pCon, </CODE>
<CODE> adOpenForwardOnly, adLockReadOnly, adCmdUnknown);</CODE>
<CODE>pfldFirstName = pRs->Fields->GetItem(0);</CODE>
<CODE>pfldLastName = pRs->Fields->GetItem(1);</CODE>
<CODE>pfldAge = pRs->Fields->GetItem(2);</CODE>
<CODE>while (VARIANT_FALSE == pRs->EndOfFile)</CODE>
<CODE> {</CODE>
<CODE> vFirstName.Clear();</CODE>
<CODE> vLastName.Clear();</CODE>
<CODE> vAge.Clear();</CODE>
<CODE> vFirstName = pfldFirstName->Value;</CODE>
<CODE> WideCharToMultiByte(CP_ACP, 0, vFirstName.bstrVal, -1, </CODE>
<CODE> m_szFirstName, sizeof(m_szFirstName), NULL, NULL);</CODE>
<CODE> vLastName = pfldLastName->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->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>
<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 <stdio.h>
#include "icrsint.h"
void dump_com_error(_com_error &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->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->QueryInterface(__uuidof(IADORecordBinding), </CODE>
<CODE> (LPVOID*)&picRs)))</CODE>
<CODE> _com_issue_error(hr);</CODE>
<CODE> </CODE>
<CODE> if (FAILED(hr = picRs->BindToRecordset(&rs)))</CODE>
<CODE> _com_issue_error(hr);</CODE>
<CODE> while (VARIANT_FALSE == pRs->EndOfFile)</CODE>
<CODE> {</CODE>
<CODE> // 处理 CCustomRs C++ 实例变量中的数据。</CODE>
<CODE> printf("\a\tName = %s \t%s", </CODE>
<CODE> (lau_fnameStatus == adFldOK ? m_szau_fname : "<NULL>"), </CODE>
<CODE> (lau_lnameStatus == adFldOK ? m_szau_lname): "<NULL>"));</CODE>
<CODE> // 更改 Recordset 的当前行。</CODE>
<CODE> // 新当前行的 Recordset 数据将被</CODE>
<CODE> // 自动取出并防止在 CCustomRs C++ 实例变量中</CODE>
<CODE> </CODE>
<CODE> pRs->MoveNext();</CODE>
<CODE> }</CODE>
<CODE> }</CODE>
<CODE> catch (_com_error &e)</CODE>
<CODE> {</CODE>
<CODE> dump_com_error(e);</CODE>
<CODE> }</CODE>
<CODE> if (picRs)</CODE>
<CODE> picRs->Release();</CODE>
<CODE> CoUninitialize();</CODE>
<CODE> };</CODE>
</PRE>
<P> </P>
<P> </P>
<P> </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 + -