5,427,303 members and growing! (19,419 online)
Email Password   helpLost your password?
Web Development » ISAPI » ISAPI Extensions     Intermediate

Discover ISAPI: ADO Data access from ISAPI

By Adrian Bacaianu

That article presents a way to build HTML pages in ISAPI using OLE DB database access.
VC6, VC7, C++Windows, Win2K, WinXP, MFC, VS6, Visual Studio, Dev

Posted: 13 Jul 2002
Updated: 13 Jul 2002
Views: 40,383
Bookmarked: 21 times
Announcements
Want a new Job?



Search    
Advanced Search
Sitemap
15 votes for this Article.
Popularity: 4.86 Rating: 4.13 out of 5
1 vote, 12.5%
1
0 votes, 0.0%
2
0 votes, 0.0%
3
1 vote, 12.5%
4
6 votes, 75.0%
5

Sample Image

Introduction

That article present a way to build HTML pages in ISAPI using OLE DB database access. The sample database is an Access database.

Functionality

When you open the page in a client browser (WriteLayout.dll in the URL), the default page is opened:

Here are 2 links, WritePageDB2Web and WritePageDemo. Both links load the same HTML page.

The first link load the page using dynamic data from an access database and piece of data from HTML resource. The second link load the page using a HTML string resource. The advantages are clear: the entire HTML page will be fastest loaded because the only dynamic data will be coming from the Database using the CAdoDatabase and CAdoRecordset classes. Large HTML parts of the page are hard coded in resource strings and will be loaded only on the first call.

Developing the pieces of HTML code inside of Visual Studio project are very easy. The HTML string resources from a C++ project will be linked exactly to the correspondent external files. If you will work with Macromedia or InterDev on that's HTML's files, just recompile the C++ project and the changes will be updated !

To link the external HTML files to HTML resources strings follow these steps:
   

Open the Resource tab of the project. Right click inside this tab and choose Import, like in picture.


After the previous step will see the Import Resource control dialog. Choose an appropriate directory for your project directory where you work on that HTML files. In this example we have the C++ project under the /MFC/WriteForm and the HTML hard coded files under /MFC/Web/HTML.



After this step we will obtain a new tag in our resources, called HTML.

Under that tag will see the new added html file with a resource ID such as IDR_HTML1. Right click on IDR_HTML1, click properties and change the ID to your custom name (like in picture). It is very important to change the properties the FileName location and check the ExternalFile (see the picture). In that way your resource inside the c project will be linked exactly to the external file ("..\web\HTML\Form.html").

You now have the HTML file in your C++ project! To see it just double click the imported resource


Double click the resource in the right panel to open the HTML file with syntax coloring. Right click on the right panel to obtain an option with browser preview of that resource HTML file

Using the HTML resources in your project


How do you use these string resources into your Visual Studio project? Just use the LoadLongResource private function:

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;
}

Coding

The WritePageDB2Web method builds the entire page. The HTML page is construct from 4 piece of hard coded HTML data inter correlated with dynamic string data.

The hard coded strings are loaded from resources using the LoadLongResource private function.

// first piece of hardcoded page

LoadLongResource(strPagePart1, IDR_HTML_PAGE_PART1);
The dynamic HTML string parts are loaded from the database using customized functions.
//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)
Outputting the mix of hardcoded and dynamic HTML to the page is done as follows:
    //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

The dynamic data is built in private functions using the CAdoRecordset and CAdoDatabase classes. The connection string is hosted in the CWriteLayoutExtension() constructor string. I chose an Access database for database support. It is possible to use a direct connection string:

m_bstrConnectionString = L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Projects\\DB\\Db2Isapi.mdb";

or a file connection string (double click the udl file to link it to access DB):

m_bstrConnectionString = L"File Name=C:\\DataLinks\\ConnectionArticleDB2Isapi.udl";

The database is accessed very easily:

//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

To Install

  • Copy the folder Web under your web site.
  • Provide "Scripts and Executables" Execute Permision to the Web application. This will allow the IIS web server to execute the WriteLayout.dll.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Adrian Bacaianu


I make programming for over 4 years and extensive experience in C++, ASP, Pascal, MFC, COM+, ATL, TCP/IP, HTTP protocols, XML, XSL, SOAP and SQL.
For the last 2 years i working extensively at the background of financial sites (databases, n tier architecture).

I’m available for contracts and/or outsourcing (adrian_bacaianu@yahoo.com).
Occupation: Web Developer
Location: Romania Romania

Other popular ISAPI articles:

Article Top
Sign Up to vote for this article
You must Sign In to use this message board.
FAQ FAQ Noise ToleranceSearch Search Messages 
 Layout  Per page   
 Msgs 1 to 5 of 5 (Total in Forum: 5) (Refresh)FirstPrevNext
Subject  Author Date 
GeneralThe best articlememberwatt11:28 1 Aug '02  
GeneralRe: The best articlememberAdrian Bacaianu12:47 10 Jan '06  
GeneralGoodmemberNorm Almond21:52 14 Jul '02  
GeneralExcellent JobmemberWhiteKnight13:11 14 Jul '02  
GeneralRe: Excellent JobmemberAdrian Bacaianu14:16 14 Jul '02  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 13 Jul 2002
Editor: Chris Maunder
Copyright 2002 by Adrian Bacaianu
Everything else Copyright © CodeProject, 1999-2008
Web16 | Advertise on the Code Project