探索 ISAPI:来自 ISAPI 的 ADO 数据访问






3.87/5 (8投票s)
2002年7月14日
3分钟阅读

71851

979
一种使用 OLE DB 数据库访问在 ISAPI 中构建 HTML 页面的方法。

引言
本文介绍了一种使用 OLE DB 数据库访问在 ISAPI 中构建 HTML 页面的方法。示例数据库是 Access 数据库。
功能
当您在客户端浏览器中打开页面时(URL 中为WriteLayout.dll),默认页面会被打开。

这里有 2 个链接,WritePageDB2Web 和 WritePageDemo。这两个链接都加载同一个 HTML 页面。
第一个链接使用来自 Access 数据库的动态数据和来自 HTML 资源的少量数据来加载页面。第二个链接使用 HTML string 资源来加载页面。显而易见的优点是:整个 HTML 页面将以最快的速度加载,因为唯一动态的数据将通过 CAdoDatabase 和 CAdoRecordset 类从数据库获取。页面中大量的 HTML 部分被硬编码在资源字符串中,并且只在第一次调用时加载。
在 Visual Studio 项目中开发 HTML 代码片段非常容易。C++ 项目中的 HTML string 资源将与相应的外部文件精确链接。如果您使用 Macromedia 或 InterDev 处理这些 HTML 文件,只需重新编译 C++ 项目即可更新更改!
要将外部 HTML 文件链接到 HTML 资源字符串,请遵循以下步骤:

打开项目的“资源”选项卡。在此选项卡内右键单击并选择“导入”,如图所示。

完成上一步后,您将看到“导入资源”控件对话框。为您的项目目录选择一个合适的目录,您将在其中处理这些 HTML 文件。在此示例中,我们的 C++ 项目位于 /MFC/WriteForm 下,而硬编码的 HTML 文件位于 /MFC/Web/HTML 下。

完成此步骤后,我们将在资源中获得一个新标签,称为 HTML。
在该标签下,我们将看到新添加的 HTML 文件,其资源 ID 为 IDR_HTML1。右键单击 IDR_HTML1,单击“属性”,然后将 ID 更改为您自定义的名称(如图所示)。更改 FileName 位置并勾选 ExternalFile(见图)属性非常重要。这样,您的 C++ 项目中的资源将与外部文件(“..\web\HTML\Form.html”)精确链接。
现在您的 C++ 项目中就有这个 HTML 文件了!要查看它,只需双击导入的资源即可。

双击右面板中的资源以使用语法着色打开 HTML 文件。右键单击右面板以获得该资源 HTML 文件的浏览器预览选项。
在项目中使用的 HTML 资源
如何在 Visual Studio 项目中使用这些 string 资源?只需使用 LoadLongResource private 函数即可。
BOOL CWriteLayoutExtension::LoadLongResource(CString& str, UINT nID)
{
    HRSRC       hRes;
    HINSTANCE   hInst   = AfxGetResourceHandle();
    BOOL        bResult = FALSE;
    //if you want standard html type
    hRes = FindResource(hInst, MAKEINTRESOURCE(nID), RT_HTML);
    if (hRes == NULL)
        ISAPITRACE1("Error: Resource %d could not be found\r\n", nID);
    else
    {   
        DWORD dwSize = SizeofResource(hInst, hRes);
        if (dwSize == 0)
        {   str.Empty();
            bResult = TRUE;
        }
        else
        {   
            LPTSTR  pszStorage = str.GetBufferSetLength(dwSize);
            HGLOBAL hGlob      = LoadResource(hInst, hRes);
            if (hGlob != NULL)
            {
                LPVOID lpData = LockResource(hGlob);
                if (lpData != NULL)
                {    
                    memcpy(pszStorage, lpData, dwSize);
                    bResult = TRUE;
                }
                FreeResource(hGlob);
            }
        }    
    }
    return bResult;
}
编码
WritePageDB2Web 方法构建了整个页面。HTML 页面由 4 部分硬编码的 HTML 数据组成,这些数据与动态 string 数据相互关联。
硬编码的 string 使用 LoadLongResource private 函数从资源中加载。
// first piece of hardcoded page
LoadLongResource(strPagePart1, IDR_HTML_PAGE_PART1);
动态 HTML string 部分使用自定义函数从数据库加载。
//The output page will be:
*pCtxt << strPagePart1 + GetArticlesFeature +  // some HTML built from DB
          strPagePart2 + GetArticlesTopRated + //some HTML built from DB 
          strPagePart3 + GetArticlesLast10 +   //some HTML built from DB  
          strPagePart4.
// (will have 3 fixed parts and 2 parts dynamically, from DB)
将硬编码和动态 HTML 的混合输出到页面的方法如下:
    //1, fixed part:
    *pCtxt << strPagePart1;           // output hardcoded HTML part 1
    
    //2, dynamic part:                // GetArticlesFeature
    if ( ! GetArticlesFeature(AdoDB, &bstrOutput, &bstrError) )
    {
        *pCtxt << bstrError;          // if its an error display it
        return;
    }
    *pCtxt << bstrOutput;             // write part 1
动态数据使用 CAdoRecordset 和 CAdoDatabase 类在 private 函数中构建。连接 string 托管在 CWriteLayoutExtension() 构造函数字符串中。我选择了 Access 数据库来支持数据库。可以使用直接连接 string
m_bstrConnectionString = L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Projects\\DB\\Db2Isapi.mdb";
或文件连接 string(双击 udl 文件以将其链接到 Access DB)。
m_bstrConnectionString = L"File Name=C:\\DataLinks\\ConnectionArticleDB2Isapi.udl";
访问数据库非常方便。
//the sql stmt string
_bstr_t  bstrSTMT(L"SELECT * from tblArticles where type=1");    
MACRO_BEGIN                          //here the begin code from macro
        
_bstr_t  bstrValue_link, bstrValue_title,
bstrValue_author, bstrValue_headline;    
        
while ( !AdoRS->IsEof() )            //if we have records
{
    AdoRS->GetFieldValue("link",    &bstrValue_link );
    AdoRS->GetFieldValue("title",    &bstrValue_title );
    AdoRS->GetFieldValue("author",    &bstrValue_author );
    AdoRS->GetFieldValue("headline",&bstrValue_headline );
            
    wsprintf(wcOut,     "TR"\
         "TD width=100%% FONT class=links size=1 A href=%s %s/A BR "\
         "by B%s/B BR"\
         "FONT color=black%s/FONT"\
         "/TD"\
         "/TR",
         (LPCTSTR)bstrValue_link, (LPCTSTR)bstrValue_title, 
         (LPCTSTR)bstrValue_author, (LPCTSTR)bstrValue_headline
           );
    AdoRS->MoveNext();
    *bstrOutput = (LPCTSTR)wcOut;    //the output here
}
MACRO_END                            //here the end code from macro
安装说明
- 将 Web 文件夹复制到您的网站下。
- 为 Web 应用程序提供“脚本和可执行文件”执行权限。这将允许 IIS Web 服务器执行 WriteLayout.dll。
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。
