65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.87/5 (8投票s)

2002年7月14日

3分钟阅读

viewsIcon

71851

downloadIcon

979

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

Sample Image

引言

本文介绍了一种使用 OLE DB 数据库访问在 ISAPI 中构建 HTML 页面的方法。示例数据库是 Access 数据库。

功能

当您在客户端浏览器中打开页面时(URL 中为WriteLayout.dll),默认页面会被打开。

这里有 2 个链接,WritePageDB2WebWritePageDemo。这两个链接都加载同一个 HTML 页面。

第一个链接使用来自 Access 数据库的动态数据和来自 HTML 资源的少量数据来加载页面。第二个链接使用 HTML string 资源来加载页面。显而易见的优点是:整个 HTML 页面将以最快的速度加载,因为唯一动态的数据将通过 CAdoDatabaseCAdoRecordset 类从数据库获取。页面中大量的 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

动态数据使用 CAdoRecordsetCAdoDatabase 类在 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

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.