The IIS Internet Database Connector is an ISAPI DLL that can provide a Web application access to database information through an associated ODBC driver. This chapter expands on the knowledge you gained in previous chapters and provides the fundamental information needed to begin building Web-based applications for accessing ODBC databases.
The IDC is an Internet Server API (ISAPI) DLL used to retrieve information from ODBC databases. The IDC translates queries into SQL statements by replacing SQL statement variables with user-input data, which is then passed to the respective database driver for processing, as shown in Figure 20.1.
FIGURE 20.1. IDC access through HTTPODBC.
IDC uses simple ASCII text files with an .idc extension that contain such information as the data source, HTML extension files (.htx), SQL statements, and so on.
This section focuses on how to set up the proper IDC files and HTML extension files required to integrate database access into a WWW application.
All IDC (.idc) files must have three required fields in order to properly handle the retrieval and formatting of database information: Datasource, SQLStatement, and Template. Each of these fields is explained in this section. Datasource The Datasource field is the ODBC data source that identifies the database connection information specific to your application.
If the DSN resource for a specific database is named mydatabase, for example, the IDC Datasource entry looks like this:
Datasource: mydatabase
SQLStatement The SQLStatement field identifies the actual SQL query that will be executed by the IDC. Parameter values can be contained in SQLStatement. If used, parameter values must be enclosed in percent (%) characters. If a SQLStatement entry will span multiple lines, subsequent lines must begin with a plus (+) sign. Here's a sample SQLStatement field:
SQLStatement: + SELECT FirstName, LastName + FROM Employees, Orders + WHERE Employees.EmployeeId = Orders.EmployeeId + AND OrderId = `%orderid%'
Template The Template field is the name of the HTML extension file that contains the normal HTML code with the extended database-definition information. The main Web page for an application might use the template filename main.htx, for example. The entry in the corresponding .idc file looks like this:
Template: main.htx
Additional fields are available for inclusion in the IDC file. These fields contain information such as default parameters, caching expiration settings, maximum field sizes, maximum number of rows returned, username, password, required parameters, and content type. This section explains each of the optional fields. Content Type The Content Type field specifies the Multipurpose Internet Mail Extensions (MIME) type that the query will return. By default, the standard text/html MIME type is returned. The following code specifies the MIME type for a GIF image, for example:
Content Type: image/gif
DefaultParameters The DefaultParameters field specifies default values for designated entries. You can use this field to specify column default values for table columns that are configured as NOT NULL, for example. A sample DefaultParameters field looks like this:
DefaultParameters: payment=creditcard
Expires The Expires field specifies the number of seconds the IDC waits before refreshing a cached output page. For scenarios in which multiple identical queries are executed, the IDC can return the cached values without having to access the database.
To have a document cached for one hour, for example, you can specify the following Expires field in the .idc file:
Expires: 3600
MaxFieldSize The MaxFieldSize field specifies the maximum number of bytes allocated by the IDC for each field in the .idc file.
To specify a MaxFieldSize of 64,000 bytes, use the following syntax in the MaxFieldSize field entry:
MaxFieldSize: 64000
MaxRecords The MaxRecords field specifies the maximum number of records the IDC returns for each user query.
Take a look at a sample MaxRecords field entry that returns no more than 500 records:
MaxRecords: 500
ODBCOptions The ODBCOptions field specifies any advanced options to be passed to the database-specific ODBC driver. When multiple options are specified, they are separated by a comma. Table 20.1 lists the advanced ODBC options available. A sample ODBCOptions entry looks like this:
ODBCOptions: SQL_ACCESS_MODE=1, SQL_MAX_ROWS=100, SQL_QUERY_TIMEOUT=60
Table 20.1. Advanced ODBC Options.
Option | Value(s) | Description |
SQL_ACCESS_MODE | 0=read/write | Determines whether updates to the database are allowed. Default=0 |
1=read only | ||
SQL_LOGIN_TIMEOUT | Integer | Specifies the number of seconds to wait for a response before returning an error message. If set to 0, HTTPODBC waits indefinitely. When the ODBC data source also has a specified time-out, the lesser value is used. Default=0 |
SQL_MAX_LENGTH | Integer | Specifies the maximum number of bytes returned from a binary or character column. Note that this option is available only with drivers that support it. |
SQL_MAX_ROWS | Integer | Specifies the maximum number of rows returned from a single SQL query. A value of 0 returns all rows. Default=0 |
SQL_NOSCAN | 0=search for and convert escape clauses in curly braces ({}). |
Specifies whether escape clauses in the SQL string are searched for and converted. Escape clauses are enclosed in the SQL string |
1=do not search for and convert escapeclauses in the SQL string | Searching for escape clauses can degrade query performance. Default=0 | |
SQL_OPT_TRACE | 0=trace off | Specifies whether ODBC function calls are written to a trace file. A value of 1 causes all ODBC function calls to be written to a trace file. A value of 0 specifies that no calls should be written to a trace file. |
1=trace on | ||
Default=0 | ||
SQL_OPT_TRACEFILE | Filename | Specifies the filename in which trace information should be written. Used with the SQL_OPT_TRACE option. Default=SQL.LOG |
SQL_PACKET_SIZE | Integer | Specifies the number of bytes of the network packet size in which the data-base driver and IIS will communicate. |
SQL_QUERY_TIMEOUT | Integer | Specifies the number of seconds to wait for the SQL statement to execute and return results. If the SQL_QUERY_ TIMEOUT number of seconds is reached, an error message is returned. A value of 0 results in no time-out. |
SQL_TRANSLATE_DLL | Filename | Specifies the name of the DLL file that contains the SQLDriverToDataSource and SQLDataSourceToDriver functions, which are used by the database driver to complete tasks such as character translation. |
SQL_TRANSLATE_OPTION | Integer | Used with the SQL_TRANSLATE_DLL option. Consult the specific translator documentation for option values. |
SQL_TXN_ISOLATION | 1=read uncommitted | Specifies the transaction isolation level. For more information on thisoption, see the SQL documentation. |
2=read committed | ||
4=repeatable read | ||
16=versioning | ||
Integer | Driver-specific | Enables you to specify special options supported by some drivers. You can specify these by using the option number, as in number=value. |
Password: webpassword
RequiredParameters The RequiredParameters field specifies those parameters that must contain data when returned from the client browser. If a required parameter is not returned, the IDC returns an error to the client browser. A sample RequiredParameters field looks like this:
RequiredParameters: logon, password
Username The Username field specifies the user account name to use when connecting to the ODBC resource.
A sample Username field entry specifying the logon webaccess looks like this:
Username: webaccess
Hypertext extension files are used by Microsoft IIS to identify specially formatted HTML documents, including the special tags used to handle such items as looping constructs for multidocument result sets and if-then-else control blocks.
In addition to standard HTML tags and data, .htx files can consist of special HTML-like tags that permit the result-set documents to be processed and output to be generated based on the conditions that the tags validate. In this section, you learn how to use these tags to identify the block of HTML code that will be processed for each result-set document, to perform if-then-else test conditions, and to identify special formatting of output. <%begindetail%> and <%enddetail%> Tags The <%begindetail%> and <%enddetail%> tags surround the portion of the HTML extension file in which the query result-set documents will be merged. Each record returned in the result set is processed against the HTML code contained in the Detail section. From a programmer's point of view, the <%begindetail%> and <%enddetail%> tags act much like a for each looping construct because, if no records are returned, the Detail section is ignored. You reference column names (results data) in the Detail section by enclosing them between <% and %> symbols.
Suppose that the following SQLStatement is specified in the associated .idc file:
SQLStatement: + SELECT FirstName, LastName, Address, City, State, ZipCode + FROM Employees + ORDER BY LastName ASC
The following .htx file code shows how the <%begindetail%> and <%enddetail%> tags are used, as well as how column results are referenced in the Detail section:
<!-- Process returned record set data and display the abstract and other associated record data. --> <%begindetail%> <p><b> <i>Record #:</i> <%CurrentRecord%><br>. <i>Name:</i> <%FirstName%> <%LastName%><br> <i>Address:</i><%Address%><br> <i>City:</i> <%City%><br> <i>State:</i> <%State%><br> <i>Zip Code:</i> <%ZipCode%><br> </b> <%enddetail%>
<%if%>, <%else%>, and <%endif%> Tags The <%if%>, <%else%>, and <%endif%> tags form a conditional logic control flow that can be used to determine how records are processed. The most common use of the if-then-else statement is to determine whether any records were returned by the query. If no records are returned, a standard reply can be generated, such as No records found to match query. Please try again.
The .htx file code that uses the built-in variable CurrentRecord to determine whether no records were returned from the query follows:
<!-- Example htx file code to check the status of the built-in variable CurrentRecord to verify when no records were returned from the query. --> <%begindetail%> <%if CurrentRecord EQ 0%> Query results: <%endif%> <p><b> <i>Record #:</i> <%CurrentRecord%><br>. <i>Name:</i> <%FirstName%> <%LastName%><br> <i>Address:</i><%Address%><br> <i>City:</i> <%City%><br> <i>State:</i> <%State%><br> <i>Zip Code:</i> <%ZipCode%><br> </b> <%enddetail%> <P> <%if CurrentRecord EQ 0%> <I><B> No records found to match query. Please try again.</B></I> <P <%endif%>
The syntax for using the <%if%>, <%else%>, and <%endif%> tags follows:
<%if condition%> HTML code <%else%> HTML code <%endif%>
where condition has the following form:
valueX operator valueY
Table 20.2 displays the list of valid condition operators. Table 20.2. Valid condition operators. Operator Condition (True If) EQ valueX is equal to valueY
LT valueX is less than valueY
GT valueX is greater than valueY CONTAINS Any part of valueX contains the string valueY X and Y may be in the form of built-in variables, column names, an HTTP environment variable name (see the next section for a complete listing of HTTP variables), or a constant.
A very interesting and powerful aspect of IDC is its capability and flexibility to be integrated with other applications. Microsoft Index Server is just such an application.
For example, consider an application in which you want your IDC query results to be used to create customized, dynamic, on-the-fly HTML query forms and query restrictions for an Index Server application. Likewise, results from Index Server queries can be manipulated to create dynamic forms for other applications as well. For example, results from an Index Server query could be used to dynamically create SQL statements used to extract information from a database. The possibilities are endless. With some imagination and creativity, you can easily develop applications that integrate Index Server with legacy databases, spreadsheets, statistical packages, and so on.
This section presents a simple example of how an IDC application can be used to dynamically create query forms for subsequent use with Index Server. This example uses the IIS Internet Database Connector to extract names of authors of specific types of books from a publisher's database. These names are then used to create a query form that allows users to select an author and provide additional query restrictions. This form is submitted to Index Server, which searches the corpus for documents referencing the author and matching other restrictions entered by the user.
http://www.microsoft.com/intdev/dbweb/dbweb.htm.
Invoking the .idc File .idc files can be invoked by specifying the path to an .idc file in the action URL for an HTML form or in an href anchor for an HTML hyperlink. For this example, we have created a link in the frames-based utility illustrated in Figure 20.2. The following code creates the link to the Database Integration example.
<a href="/scripts/test_web/idcexample.idc?">
FIGURE 20.2.A frames-based query tool that provides links to a variety of query examples developed for this book, including an example of an IDC-Index Server integration.
Clicking the Database Integration link invokes the idcexample.idc file, which is used by IIS to perform a query against a database. Notice that no parameters were appended to the URL in this case. However, like .idq files, IDC files can accept and perform substitutions of parameters passed as appended query strings or from HTML forms. Contents of the .idc File The .idc file is used to specify a SQL Statement or statements to be used for querying a database. There are also several optional parameters and ODBC fields that can be set in .idc files, but Listing 20.1 illustrates the use of the three required fields (Datasource, Template, and SQLStatement).
Listing 20.1. Contents of the idcexample.idc file.
Datasource: Web SQL Username: sa Template: idcexample.htx SQLStatement: +SELECT au_lname, au_fname, type, title +FROM pubs.dbo.authors a, pubs.dbo.titleauthor ta, pubs.dbo.titles t +WHERE a.au_id = ta.au_id and ta.title_id = t.title_id and Â(t.type like `%%comp%%' or t.type like `%%bus%%' or t.title like `%%comp%%') +ORDER BY au_lname
Datasource refers to the System DSN specified using ODBC application under Control Panel. In this case, we associated Web SQL with the local Microsoft SQL Server database on our server.
Template refers to the .htx file used to format the results from the database query.
SQLStatement refers to the SQL query submitted to the database. The +
signs simply indicate a continuation to the next line in the file. In this example,
the SQL statement queries the publisher's database for all authors of all computer
and business books as well as all books that have a word like computer in the title.
Contents of the .htx File .htx files used with IDC applications
are very similar to those used for Index Server applications. Basically, they specify
how database results are to be formatted as HTML and displayed to the user. Because
they specify HTML output, they can also be used to dynamically create HTML forms
based on the results of the database query. This means that static query forms are
a thing of the past. Instead, forms can be dynamically created and tailored to a
user's functional and informational requirements. Figure 20.3 illustrates the results
of the database query, which were formatted to create a secondary HTML form used
to make an Index Server query.
FIGURE
20.3. Results of a database query
can be formatted in an .htx file to dynamically create an HTML form for
use with Index Server.
Listing 20.2 provides the content of the .htx file used to format the results of the database query performed by the .idc file in the previous section. This listing demonstrates how results of an IDC query can be formatted for use as another HTML form that is in turn used to make queries to Index Server.
Listing 20.2. Contents of the idcexample.htx file.
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Microsoft FrontPage 2.0"> <title>Authors</title> </head> <body bgcolor="#E8E8E8"> <form action="/scripts/test_web/author_queryhit.idq" method="GET"> <center> <strong>Select an Author From Our Database of Computer-Related Books:</strong> <BR> <select name="UserAuthor" size="5"> <%begindetail%> <option value="<%au_lname%>"><%au_lname%>, <%au_fname%> </option> <%enddetail%> </select> <B><EM>OR</EM></B> </center> <center> <strong>Enter an Author's Last Name:</strong><BR> <input type="text" size="60" maxlength="100" name="UserAuthor2"> <P> <input type="hidden" name="CiMaxRecordsPerPage" value="10"> <input type="hidden" name="CiScope" value="/"> <input type="hidden" name="TemplateName" value="basic_queryhit"> <input type="hidden" name="CiSort" value="rank[d]"> <p align="center"> <font size="2" face="Arial"><strong>Enter an optional query restriction </strong></font>:</p> <div align="center"><center><table border="1" cellspacing="1" width="50%" bgcolor="#A4B0BD" bordercolor="#008080" bordercolordark="#008080" bordercolorlight="#008080"> <tr> <td align="center" colspan="2" width="80%"><input type="text" size="60" maxlength="100" name="CiRestriction"></td> </tr> <tr> <td align="center"><input type="submit" value="Execute Query"> <input type="reset" name="1" value="Clear"></td> </tr> </table> </center></div> </form> </body> </html>
A few notes about this file are as follows:
When the user submits the form, parameters are substituted in the .idq
file referenced, Index Server performs the query, and an .htx report template
file is used to format the results. Figure 20.4 illustrates the output for such a
query.
FIGURE
20.4.The final results of a two-stage query IDC-Index Server application.
The first stage pulled author information from a database and created a form. The
second stage used inputs to the form to perform an Index Server query.
The IIS Internet Database Connector provides a standardized solution through the use of ODBC connectivity for accessing databases via Web-based applications. IDC files (.idc) work with HTML extension files (.htx) to identify the key components required by IIS to access a database and format query results based on special tags inserted into the .htx file.