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

 

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 网页文件中的值 ">
  
     AtlAdoCtl.JobID=1;
三、打包控件依赖的 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 控件”设置为允许或提示。
 

你可能感兴趣的:(sql,server,数据库,attributes,测试,javascript,jobs)