在
activex
控件中使用
ado
连接和使用
sql server
数据库
在开发
web
应用程序时有时会用到在
activex
控件中使用
ado
连接数据库的情况,网上找不到应用事例。这里结合一个简单的例子演示一下如何编程和应用。
一、在
vc
工具中利用
Atl
开发
activex
控件:
按照
VC
工具的
ATL
工程向导操作,生成工程程序框架。
选择菜单
insert
中的
new atl object
命令,选择插入
Full Control
控件,输入类名如
AtlAdoCtl
。
点击
Attributes
标签,设置
attributes
控件属性。如果控件与网页间存在交互,如控件从网页中接受产品
ID
等数据字段的值,要把
support connection points
(支持连接点)钩选。其它配置项保持默认。
配置
miscellaneous
属性。该页主要配置控件是否基于
windows
按钮等控件进行开发,如果不是就保持默认选项。这里保持默认选项。
配置
stock properties
属性,用于设置生成控件字体、背景、边框等控件固有属性页。由于例子比较简单,这里不为控件配置属性页。
点击确定按钮,让
atl
自动生成控件类及接口。
如前所述,如果控件需要与网页交互,接受如产品
ID
的值,可以如下设置自定义控件属性:在工程的类视图中右键点击
IAtlAdoCtl
控件类接口,选择“
Add Property
”添加属性,输入和设置自定义属性的数据类型、变量名、读取和写入属性值的方法等。这里定义了一个名为
JobID
(工作编号)的属性变量,对应
sql server
固有数据库
pubs
中
jobs
数据表的
job_id
字段,数据类型为短整型,只设置属性输入方法。
通过如上设置只是为控件提供了接受属性值的接口方法,为了在控件中使用该属性,还要为控件类定义一个成员变量,用于关联和使用网页传来的控件属性值。在类视图中右键点击
CAtlAdoCtl
,选择添加成员变量。设置成员变量数据类型和变量名,注意数据类型要与前面设置的控件属性一致。
在控件类的构造函数中初始化该成员变量:
CAtlAdoCtl()
{
m_JobID=0;
}
在控件类实现文件
AtlAdoCtl.cpp
文件中找到自动生成的控件属性输入方法框架,并输入如下内容,将框架类成员变量与控件属性关联:
STDMETHODIMP CAtlAdoCtl::put_JobID(short newVal)
{
// TODO: Add your implementation code here
m_JobID=newVal;
FireViewChange();//
触发重画控件事件。
return S_OK;
}
到这里,关于控件的准备工作已经完成,编译通过后工程目录中会自动生成一个测试用
html
网页文件
AtlAdoCtl.htm
,可以双击该文件测试控件的显示内容。
下面要在控件中使用
ado
连接数据库。
二、在控件中添加
ado
连接数据库:
1
、在工程的
StdAfx.h
头文件中添加如下语句,引入
Ado
控件的库文件(具体库文件位置要根据实际情况输入):
#import "C:/Program Files/Common Files/System/ADO/msado15.dll" no_namespace named_guids rename("EOF","adoEOF")
2
、创建数据库连接对象、数据记录集对象等。根据
JobID
得到
sql server
自带数据库
pubs
的
jobs
表中的对应记录,并在绘制控件时输出该记录的字段内容。为简单起见,所有任务都在控件绘制方法
OnDraw
中完成。实际应用时应单独处理数据库操作,以提高效率与安全性。
HRESULT OnDraw(ATL_DRAWINFO& di)
{
RECT& rc = *(RECT*)di.prcBounds;
Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom);
SetTextAlign(di.hdcDraw, TA_CENTER|TA_BASELINE);
_ConnectionPtr conn = NULL;
_RecordsetPtr recset = NULL;
char buf[200];
itoa(m_JobID,buf,10);//
由控件类整型成员变量得到
char
字符串。
_bstr_t jobid=_com_util::ConvertStringToBSTR(buf);//
转换成
_bstr_t
类型。
_bstr_t sqlstr="select job_desc from jobs where job_id="+jobid;
_bstr_t varOutput;
try{
::CoInitialize(NULL);
conn.CreateInstance(__uuidof(Connection));
recset.CreateInstance(__uuidof(Recordset));
conn->Open("driver={SQL Server};Server=192.168.0.20;DATABASE=pubs;UID=sa;PWD=","","",adModeUnknown);
recset->Open(sqlstr, _variant_t((IDispatch*)conn,true),adOpenStatic, adLockReadOnly, adCmdText);
if(recset->RecordCount>0)
{
long lRecCount = recset->RecordCount;
_bstr_t varTab("/t");
_bstr_t varRet("/r");
_bstr_t varNull("");
varOutput = recset->GetString(adClipString,lRecCount,
varTab,varRet,varNull);
}
}
catch(_com_error &e){
::CoUninitialize();
}
LPCTSTR jobdesc=(LPCTSTR)varOutput;
TextOut(di.hdcDraw,
(rc.left + rc.right) / 2,
(rc.top + rc.bottom) / 2,
jobdesc,
lstrlen(jobdesc));
recset->Close();
conn->Close();
return S_OK;
}
3
、编辑测试网页:
经过以上步骤,对工程进行编译后就可以在网页中测试控件了。不过,要对工程中自动生成的
AtlAdoCtl.htm
网页文件进行修改,增加向控件传递
job_id
字段值的脚本。下面代码中的
CLASSID
的值要使用你工程中的
AtlAdoCtl.htm
网页文件中的值或参考你注册表中控件类的
CLASSID
(可以在注册表中搜索
AtlAdoCtl
项):
ATL 3.0 test page for object AtlAdoCtl
你工程中
AtlAdoCtl.htm
网页文件中的值
">
三、打包控件依赖的
ado
库文件,编辑在站点中测试控件的网页文件:
以上测试只是在本地机上注册和使用控件,要在站点中使用控件还需要打包控件所依赖的
ado
库文件,并放置到
web
服务器中,以提供给客户机浏览器下载和使用。具体步骤如下:
1
、打包控件及所依赖的文件:
将工程编译生成的
AtlAdoApplication.dll
控件类库文件及所依赖的库文件
msado15.dll
(一般在
C:/Program Files/Common Files/System/ADO
目录中),拷贝到同一目录下。编辑打包定义的
inf
文件,如
testado.inf
,内容如下:
[version]
signature="$CHICAGO$"
AdvancedINF=2.0
[Add.Code]
AtlAdoApplication.dll=AtlAdoApplication.dll
msado15.dll=msado15.dll
[AtlAdoApplication.dll]
file-win32-x86=thiscab
clsid={13A3BABF-D78A-4F8C-B3DE-A205FE0421AF}
FileVersion=1,0,0,1
RegisterServer=yes
[msado15.dll]
file-win32-x86=thiscab
RegisterServer=yes
使用
CABARC.EXE
打包工具(在
windows
目录中搜索该工具文件,如果没有可以在网上下载)将上述三个文件进行打包,具体的打包命令为:
cabarc n atlado.cab AtlAdoApplication.dll msado15.dll testado.inf
将打包好的
atlado.cab
文件放到
web
服务器(如
IIS
服务器)的站点目录中。
2
、编辑网页文件:
将上面提到的工程目录中的网页文件
AtlAdoCtl.htm
拷贝到与
atlado.cab
同一站点目录下,对网页内容修改如下:
ATL 3.0 test page for object AtlAdoCtl
CODEBASE="atlado.cab#version=1,0,0,1">
3
、测试站点页面:
经过以上步骤就可以在客户机浏览器中测试服务器站点的网页文件了,在测试前要设置
IE
浏览器的安全性设置,将服务器站点
IP
地址设置为可信任站点;在
ie
安全级别设置中将“下载未签名的
activex
控件”设置为允许或提示。