zcgtmxh
路人甲
路人甲
  • 注册日期2007-10-06
  • 发帖数1
  • QQ
  • 铜币109枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:2227回复:1

[原创]在activex控件中使用ado连接和使用sql server数据库

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

返回顶部