Vc++(MFC)
实现
SQL
Server
的远程连接(
ADO
实现)
一
、
ADO
概
述
ADO
是
Microsoft
为
最
新
和
最
强
大
的
数
据
访
问
范
例
OLE DB
而
设
计
的
,
是
一
个
便
于
使
用
的
应
用
程
序
层
接
口
OLE.DB
提
供
者
访
问
和
操
作
数
据
库
服
务
器
中
的
数
据
。
ADO
最
主
要
的
优
点
是
易
于
使
用
、速
度
快
、内
存
支
出
少
和
磁
最
少
的
网
络
流
量
,
并
且
在
前
端
和
数
据
源
之
间
使
用
最
少
的
层
数
,
所
有
这
些
都
是
为
了
提
供
轻
量
、
高
性
能
的
接
口
。
之
所
喻
,
OLE
自
动
化
接
口
。
二
、
利
用
ADO
来
实
现
对
SQL Server
的
远
程
连
接
1
、
首
先
是
引
入
ADO
库
文
件
使
用
ADO
前
必
须
在
你
的
工
程
中
的
stdafx.h
文
件
里
直
接
引
入
符
号
#import
引
入
A
如
下
内
容
:
#include <comdef.h>
#include <icrsint.h>
#import "C:\program files\common files\system\ado\msado15.dll" \
no_namespace rename("EOF", "ADOEOF")
这
行
语
句
声
明
在
工
程
中
使
用
ADO
,但
不
使
用
ADO
的
名
字
改
名
为
"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.SetColumnW
idth(0,rect3.W
idth()/3);
m_list.SetColumnW
idth(1,rect3.W
idth()/3);
m_list.SetColumnW
idth(2,rect3.W
idth()/3);
下
面
是
查
询
实
现
代
码
:
int intm;
try
{
_variant_t
RecordsAffected;
m_pRecordset =
m_pConnection->Execute
("
SELECT
id
,
name
,
ip
from
winfo",&RecordsAffected,adC
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
对
COM
对
象
和
C++
类
型
的
数
据
。
_vatiant_t
和
_bstr_t
就
是
这
样
两
种
对
象
。
它
们
提
供
了
通
用
的
方
法
转
换
COM
对