Some time ago, I implemented a data feed system from SQL database to some graphical applets. At the beginning, we decided a normal ASP script which read data and gave it to that applets would be useful. Unfortunately, it wasn't! The web server was crashed every time the number of simultaneous users on the site was more than 80-100 users and when a user tried to get larger data in an applet. For those reasons, we decided to move the feed to ISAPI DLL.
- The ASP server is freed by the calls from clients applets. In that way, the ASP will respond only to the normal site calls; the ASP will not produce any timeouts caused by applets calls.
- Keeping the connection to the DB in the ISAPI cache, in that way all requests against DB don't lose time opening a connection, and will use the public open connection variable (
- The ISAPI extension DLL is the best choice if you want to obtain the maximum number of simultaneous connections to the IIS web server or to provide huge quantities of HTML data.
The ASP script loads the
applet class and gives it some parameters, like colors, time interval of http's requests, web application URL, etc.
height="20" VIEWASTEXT id="Scroller">
param name="speed" value="3"
param name="bgcolor" value="696969"
param name="Font" value="Arial|1|16"
param name="changeFontSize" value="11"
param name="feedURL" value="
param name="updateInterval" value="20000"</applet>
The Java applet will make requests from the client's side to the web server HTTP using the
received web URL parameter. The requests are made at equal intervals of time given in milliseconds by the
updateInterval parameter. If you open the Java console on the client, you will see some messages like:
Loading data from
The ISAPI module responds to the HTTP hit with a format known by the applet, HTML stream:
For each HTTP hit, the ISAPI module makes a request again to the SQL database, using the
CAdoRecordset classes from CodeProject site :). A minor modification was to keep the database connection as
public variable. In each method, the record sets needed are opened and closed. An optimization is the use of
GetString method of the
AdoRecordset class, which returns formatted data text. Because the ISAPI DLL is harder to debug, more attention must be given to capturing errors, handled with
CAdoRecordset* AdoRS = new CAdoRecordset;
if ( DBConnectionOpen( m_bstrConnectionString ) )
if ( AdoRS->Open(m_AdoDB.GetActiveConnection(), bstrSTMT, adOpenForwardOnly,
adLockReadOnly, adUseClient ) )
varOutput = AdoRS->GetString("|", "\n", 0 );
varOutput = "0 0 0 0 0 ";
(LPCTSTR)m_AdoDB.GetLastError(), "RS isnt open", bstrSTMT );
*pCtxt << wcOut ;
wsprintf(wcOut, "Encountered Error:<br>%s<br>
(LPCTSTR)m_AdoDB.GetLastError(), "DB isn't open", bstrSTMT );
*pCtxt << wcOut ;
wsprintf(wcOut, "Encountered Error :<br>
err.Error(), (LPSTR)err.ErrorMessage() );
*pCtxt << wcOut ;
*pCtxt << varOutput;
IMPORTANT: To test the feed, you must make updates on the values of the
tblOnline* tables. The updates will be reflectied online instantaneously in the Online tables and scrolling applets. To see how it works with Intraday charts applets make inserts in
tblIntraday* tables. Those applets look permanently at those tables and update the values in cells and points on the charts.
ASP connection string are located in the Includes\_incConnectionOn.asp file.
cnx.Provider = "sqloledb"
cnx.Open "Data Source=andi;Initial Catalog=ArticlesIsapiFeed;", "sa", ""
ISAPI connection string is located in IsapiDemoFeed.cpp file, on the constructor:
m_bstrConnectionString="Provider=SQLOLEDB;Data Source=andi;Initial Catalog=ArticlesIsapiFeed;
- Copy the folder "AspDemoFeed" under your web site and make it ASP application, to work the session and
application ASP objects.
- Give "Scripts and Executables" Execute Permission to "cgi-bin" directory of "
AspDemoFeed" web application.
In that way, the ISS web server will be able to execute the IsapiDemoFeed.dll.
- To install the database on your SQL server, select restore database option on SQL Server Enterprise Manager and choose the "DB/ArticlesIsapiFeed.bak" file backup. The name of database is
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.