快捷搜索:

ADO编程应用(2)

下面是一个简单的采纳了#import措施的基于ADO利用的示例代码:

#include

#importrename(“EOF”, “adoEOF”)

void main()

{

HRESULT hr = S_OK;

//由于没有在#import中指定no_namespace,以是必须采纳ADODB::这样的形式来定义变量类型

ADODB::_RecordsetPtr Rs1 = NULL;

//经由过程ODBC建立ADO连接

_bstr_t Connect( “DSN=AdoDemo;UID=sa;PWD=;” );

_bstr_t Source ( “SELECT * FROM Authors” );

CoInitialize();

//初始化Rs1工具

hr = Rs1.CreateInstance( __uuidof( ADODB::Recordset ) );

//省略对返回值hr的判断

Rs1->Open( Source,

Connect,

ADODB::adOpenForwardOnly,

ADODB::adLockReadOnly,

-1 );

//此处可以添加对记录集Rs1进行操作的代码

Rs1->Close();

Rs1 = NULL;

::MessageBox( NULL,“Success!”,“”,MB_OK );

CoUninitialize();

}

2.用MFC OLE创建ADO利用

MFC OLE同样能够封装(wrapper)一个类型库,然则与#import不合,它不能从类型库中孕育发生罗列类型。MFC类CString和COleVariant暗藏了BSTRS和Variants的细节。由MFC OLE孕育发生的类都承袭了类ColeDispatchDriver,由ADO孕育发生的掉败的HRESULTS被封装在类ColeDispatchException中。

用MFC OLE ClassWizard创建ADO利用的步骤如下:

●从Tools菜单中,选择Options选项中的Directories tab条款,在Show Directories中的Library Files中增添路径C:\program files\common files\system\ado,设置包孕ADO类型库的路径。

●从View菜单中,激活ClassWizard,点击Add Class按钮并选择“From A Type Library...”选项,然后在Type Library dialog box对话框中,从C:\program files\common files\system\ado中选择文件msado15.dll,在Confirm Classes对话框中,选择所有列出的类并按OK按钮退出ClassWizard。这样,ClassWizard便天生了两个文件msado15.h和msado15.cpp。

下面是实现ADO利用的示例代码:

//初始化COM工具

AfxOleInit();

...

//定义数据集工具

_Recordset Rs1;

COleException e;

COleVariant Connect( “DSN=AdoDemo;UID=sa;PWD=;” );

COleVariant Source ( “SELECT * FROM Authors” );

//创建数据集工具

Rs1.CreateDispatch(“ADODB.Recordset.2.0”,&e );

Rs1.Open( (VARIANT) Source,

(VARIANT) Connect,

0, 1, -1 );

//此处可以添加对结果集Rs1进行处置惩罚的代码

Rs1.Close();

Rs1.ReleaseDispatch();

AfxMessageBox(“Success!”);

3.用COM API创建ADO工程

#import和MFC OLE都环抱着一个给定的自动化工具孕育发生了一个封装类,它们分手承袭自_com_ptr_t和ColeDispatchDriver。着实也可以经由过程应用Windows API函数直接初始化ADO工具。为了直接应用ADO和COM工具,必要添加两个头文件adoid.h和adoint.h,这两个头文件定义了CLSIDs、接口定义和操作ADO类型库所必要的罗列类型。此外,还必要增添头文件INITGUID.H。

为了能够编译用COM API创建的ADO工程文件,还必要在机械中安装OLE DB SDK或者是MSDASDK对象。下面是使用API创建ADO的简单的示例代码:

#include

#include

#include “adoid.h” // ADO的GUID's

#include “adoint.h” // ADO的类、罗列等等

void main()

{

HRESULT hr = S_OK;

// ADORecordset 是在adoint.h中定义的

ADORecordset* Rs1 = NULL;

VARIANT Source;

VARIANT Connect;

VariantInit( &Source );

VariantInit( &Connect );

Source.vt = VT_BSTR;

Source.bstrVal = ::SysAllocString( L“SELECT * FROM Authors”);

Connect.vt = VT_BSTR;

Connect.bstrVal = ::SysAllocString( L“DSN=AdoDemo;UID=sa;PWD=;” );

hr = CoCreateInstance( CLSID_CADORecordset,

NULL,

CLSCTX_INPROC_SERVER,

IID_IADORecordset,

(LPVOID *) &Rs1 );

if( SUCCEEDED( hr ) ) hr = Rs1->Open

(Source,

Connect,

adOpenForwardOnly,

adLockReadOnly,

-1 );

//对记录集Rs1进行处置惩罚

if( SUCCEEDED( hr ) ) hr = Rs1->Close();

if( SUCCEEDED( hr ) ) { Rs1->Release(); Rs1 = NULL; }

if( SUCCEEDED( hr ) ) ::MessageBox( NULL, “Success!”, “”, MB_OK );

}

C++ Extensions

假如用C++进行ADO利用法度榜样开拓,应该应用ADO C++ Extensions。我们知道,用VB或者VBScript来操作ADO是异常方便的,然则假如应用C++或者是Java,就必须要处置惩罚类似Variants这样的数据布局以实现和C++数据布局的转换,而这种处置惩罚无疑是所有C++开拓职员都很头疼的工作。但假如应用C++ Extensions的话,ADO就不必要从数据供给者处获得列信息,而是在设计时候应用开拓职员供给的列信息。以下是一个简单的示例:

//创建和详细记录相对应的类

class CAuthor : public CADORecordBinding

{

BEGIN_ADO_BINDING(CCustomRs1)

ADO_VARIABLE_LENGTH_ENTRY4(1,

adVarChar, m_szau_id, sizeof(m_szau_id), FALSE)

ADO_VARIABLE_LENGTH_ENTRY4(2,

adVarChar,m_szau_fname,sizeof(m_szau_fname), FALSE)

ADO_VARIABLE_LENGTH_ENTRY4(3,

adVarChar,m_szau_lname,sizeof(m_szau_lname), FALSE)

END_ADO_BINDING()

protected:

char m_szau_id[12];

char m_szau_fname[21];

char m_szau_lname[41];

};

void FetchAuthorData()

{

CAuthor author;

//记录集工具

_RecordsetPtr pRs;

IADORecordBinding *piAdoRecordBinding;

//获取COM工具接口指针

pRs.CreateInstance(__uuidof(Recordset));

//获得必要的记录集

pRs->Open(“select au_id,au_fname,au_lname from Employees”,“Provider=SQLOLEDB;Data Source=sureshk1;Database=pubs;User Id=sa;Password=;”,

adOpenForwardOnly,

adLockReadOnly,

adCmdText);

//查询接口IADORecordBinding

pRs->QueryInterface(__uuidof(IADORecordBinding),(LPVOID*)&piAdoRecordBinding);

//绑定工具

piAdoRecordBinding->BindToRecordset(&autho

您可能还会对下面的文章感兴趣: