设为首页 加入收藏

TOP

VC++程序员如何阅读ADO文档(六)
2012-11-04 15:24:23 来源: 作者: 【 】 浏览:1443
Tags:程序员 如何 阅读 ADO 文档
  使用VC++(www.cppentry.com)对ADO的扩展的示例

  在这个例子中,还使用了COM专有的"智能指针"功能,它能自动处理IADORecordBinding接口的QueryInterface和引用计数。如果没有智能指针,你得这样编码:

IADORecordBinding *picRs = NULL;
...
TESTHR(pRs->QueryInterface(
__uuidof(IADORecordBinding), (LPVOID*)&picRs));
...
if (picRs) picRs->Release();

  使用智能指针,你可以用这样的语句从IADORecordBinding接口派生IADORecordBindingPtr类型:

_COM_SMARTPTR_TYPEDEF(IADORecordBinding, __uuidof(IADORecordBinding));

  然后这样实例化指针:

IADORecordBindingPtr picRs(pRs);

  因为VC++(www.cppentry.com)的扩展由Recordset对象实现,因此智能指针picRs的构造函数使用了_RecordsetPtr类指针pRs。构造函数利用pRs调用QueryInterface来获得IADORecordBinding接口。

// 以下即是示例程序
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <icrsint.h>
_COM_SMARTPTR_TYPEDEF(IADORecordBinding, __uuidof(IADORecordBinding));

inline void TESTHR(HRESULT _hr) { if FAILED(_hr) _com_issue_error(_hr); }

class CCustomRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CCustomRs)
ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_ch_fname,
sizeof(m_ch_fname), m_ul_fnameStatus, false)
ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_ch_lname,
sizeof(m_ch_lname), m_ul_lnameStatus, false)
END_ADO_BINDING()
public:
CHAR m_ch_fname[22];
CHAR m_ch_lname[32];
ULONG m_ul_fnameStatus;
ULONG m_ul_lnameStatus;
};

void main(void)
{
::CoInitialize(NULL);
try
{
_RecordsetPtr pRs("ADODB.Recordset");
CCustomRs rs;
IADORecordBindingPtr picRs(pRs);

pRs->Open("SELECT * FROM Employee ORDER BY lname",
"dsn=pubs;uid=sa;pwd=;",
adOpenStatic, adLockOptimistic, adCmdText);

TESTHR(picRs->BindToRecordset(&rs));

while (!pRs->EndOfFile)
{
// 处理CCustomRs中的数据
printf("Name = %s %s\n",
(rs.m_ul_fnameStatus == adFldOK rs.m_ch_fname: "<Error>"),
(rs.m_ul_lnameStatus == adFldOK rs.m_ch_lname: "<Error>"));

// 移动到下一行,新行的值会被自动填充到对应的CCustomRs的变量中
pRs->MoveNext();
}
}
catch (_com_error &e )
{
printf("Error:\n");
printf("Code = %08lx\n", e.Error());
printf("Meaning = %s\n", e.ErrorMessage());
printf("Source = %s\n", (LPCSTR) e.Source());
printf("Description = %s\n", (LPCSTR) e.Description());
}
::CoUninitialize();
}
首页 上一页 3 4 5 6 7 8 下一页 尾页 6/8/8
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇用VC++实现连续播放多媒体软件 下一篇用Visual C++打造IE浏览器

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: