探索 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。
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。