mfc 远程访问 mysql_VC++(MFC)实现SQL Server的远程连接(ADO实现)

本文介绍了如何使用MFC和ADO在VC++中实现对SQL Server的远程连接。通过引入ADO库文件,初始化OLE/COM库环境,定义并使用_ConnectionPtr和_RecordsetPtr接口进行数据库连接和查询,最终将查询结果展示在listctrl控件中。文章强调了类型转换的重要性,如使用_variant_t和_bstr_t进行数据兼容处理。
摘要由CSDN通过智能技术生成

一、ADO概述

ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口。ADO

使您能够编写应用程序以通过 OLE.DB 提供者访问和操作数据库服务器中的数据。ADO

最主要的优点是易于使用、速度快、内存支出少和磁盘遗迹小。ADO

在关键的应用方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所有这些都是为了提供轻量、高性能的接口。之所以称为

ADO,是用了一个比较熟悉的暗喻,OLE 自动化接口。

二、利用ADO来实现对SQL Server的远程连接

1、首先是引入ADO库文件      使用ADO前必须在你的工程中的stdafx.h文件里直接引入符号#import引入ADO库。 具体方法如下: 在头文件下添加如下内容:

#include #include #import "C:\program files\common files\system\ado\msado15.dll" \

no_namespace rename("EOF", "ADOEOF")

这行语句声明在工程中使用ADO,但不使用ADO的名字空间,并且为了避免常数冲突,将常数EOF改名为"ADOEOF"。现在不需添加另外的头文件,就

可以使用ADO接口了。

2、初始化OLE/COM库环境

在InitInstance()函数下面初始化OLE/COM库

BOOL ****** ::InitInstance()

{

//下面是需要添加的代码:

if (!AfxOleInit())//初始化OLE/COM库环境

{

AfxMessageBox("OLE初始化出错!");

return FALSE;

}

................

}

3、下面是连接数据库代码:

定义_ConnectionPtr接口和_RecordsetPtr接口。如下:

_ConnectionPtr m_pConnection;

_RecordsetPtr m_pRecordset;

实现代码:

HRESULT hr;

try

{

hr = m_pConnection.CreateInstance("ADODB.Connection");

if (SUCCEEDED(hr))

{

//connect database

_bstr_t strConnect="Provider=SQLOLEDB.1;Initial Catalog=“数据库名称”;Data Source=远程IP";

hr = m_pConnection->Open(strConnect,"用户名","密码",adModeUnknown);

AfxMessageBox("连接成功");

}

}

catch (_com_error e)

{

CString errormessage;

errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());

AfxMessageBox(errormessage);

return ;

}

4、查询数据库信息:

添加listctrl控件,并定义为m_list ;在winfo表中查询id,name,ip信息。

并初始化listctrl控件各列值:代码如下:

m_list.InsertColumn(0,"ID");

m_list.InsertColumn(1,"Name");

m_list.InsertColumn(1,"IP");

CRect rect3;

m_list.GetClientRect(rect3);

m_list.SetColumnWidth(0,rect3.Width()/3);

m_list.SetColumnWidth(1,rect3.Width()/3);

m_list.SetColumnWidth(2,rect3.Width()/3);

下面是查询实现代码:

int intm;

try

{

_variant_t RecordsAffected;

m_pRecordset = m_pConnection->Execute("SELECT id,name,ip from   winfo",&RecordsAffected,adCmdText);

while(!m_pRecordset->ADOEOF)

{

_variant_t ID, Name, IP;

ID= m_pRecordset->GetCollect("id");

Name=m_pRecordset->GetCollect("name");

IP=m_pRecordset->GetCollect("ip");

intm=m_list.InsertItem(0,(_bstr_t)ID);

m_list.SetItem(intm,1,1,(_bstr_t)IP,NULL,0,0,0);

m_list.SetItem(intm,2,1,(_bstr_t)Name,NULL,0,0,0);

m_pRecordset->MoveNext();

}

m_pRecordset->Close();

}

catch (_com_error e)

{

CString errormessage;

errormessage.Format("查询失败!\r\n错误信息:%s",e.ErrorMessage());

AfxMessageBox(errormessage);

return ;

}

通过上述语句将id ,name ,ip信息显示在listctr控件中。

5、注意

由于COM对象是跨平台的,它使用了一种通用的方法来处理各种类型的数据,因此CString

类和COM对象是不兼容的,我们需要一组API来转换COM对象和C++类型的数据。_vatiant_t和_bstr_t就是这样两种对象。它们提供了

通用的方法转换COM对象和C++类型的数据。在使用过程中一定要注意类型的转化。

转载地址:http://liulinqi206.blog.163.com/blog/static/134604766201211134819909/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值