Internet数据库连接器(IDC)技术
IDC简介
Internet数据库连接器(IDC,Internet Database Connector)技术最早出现于Microsoft Internet
Information Server 2.0版本中,Web客户通过IDC访问Web服务器上的数据。IDC使用户通过浏览器可以浏
览服务器上的信息和访问后台数据库。IDC是ISAPI的一个具体实现,利用IDC生成一个从客户端HTML页面
到服务器端IIS的数据库操作。它是一个HTTPODBC.DLL(动态连接库)。
与传统的CGI技术相比,IDC在一定程度上解决了CGI脚本较慢的访问速度和使用维护复杂的问题。在CGI技
术中,客户提出请求,服务器把请求写入初始化文件,进程从初始化文件中读取查询并对后台数据库执行
查询。进程将后台数据库返回数据形式化为HTML字符串,并传送给服务器。服务器再把HTML串传送给客户
。可以看出,这样的流程是复杂缓慢的。特别在网络拥塞时,CGI的速度会另人难以忍受。
IDC工作需求
IDC要求客户端有Web浏览器。服务器端需安装各种数据源的ODBC(Open Database Connectivity)驱动,
IDC调用相应的ODBC驱动程序来访问数据库。在服务器上运行IIS /IDC。
IDC工作原理
IDC使用Internet数据库连接器(.idc)文件访问数据库,用HTML扩展文件(.htx)文件构造输出Web页面。
Internet数据库连接器文件指定所要连接的ODBC数据源,HTML扩展文件的名称和位置,以及要执行SQL语
句。HTML扩展文件是服务器对SQL执行结果进行格式化而形成的HTML文件,它将最终结果传送给用户。
以下为一个典型的工作流程。客户端通过浏览器向服务器发出请求,同时通过HTTP请求一个IDC文件。服
务器接收请求,并调用HTTPODBC.DLL接收该请求的所有参数。HTTPODBC.DLL用IDC文件中的SQL语句对数据
源进行各种数据操作,再将结果通过IDC文件中指定的HTX文件传回给客户端。
IDC执行实例
IDC执行需要三个ASCII文本文件,HTML文件,IDC文件和HTX文件。HTML文件需保存在INETPUB/WWWROOT/子
目录下,IDC文件和HTX文件需保存在INETPUB/SCRIPTS/子目录下。可以使用任何文本编辑器对这三种文件
进行编辑。服务器中要内装Windows NT Server 4.0和SQL Server 6.5或以上版本。
下面将通过讲解一个实例来说明IDC的程序设计和执行。该实例使用IDC技术完成对服务器后台数据库的查
询、添加、修改和删除。
1 建立后台数据库
* 启动Microsoft SQL Server 6.5中的SQL Enterprise Manager。
* 建设备。在Database Devices上击右键,选New Device。
1. 出现New Database Device框。输入设备名、设备存储地址、设备大小等信息,如设备名为stu95
,设备存储地址为c:\stu95.DAT(缺省),设备大小为1M(缺省)。单击Create Now。
2. 出现内容为“The database device was successfully created.”的提示框。单击确定。在
Database Devices下多了一个新建的设备stu95。
* 建数据库。在Databases上击右键,选New Database。
出现New Database框。输入数据库名、数据库所在设备名、数据库大小等信息,如数据库名为stu,数据
库所在设备名为stu95,数据库大小为1M(缺省)。单击Create Now。在Databases下多了一个新建的数据库
stu。
* 建表。
1. 单击新建数据库stu前的“+”号,出现Groups/Users和Objects两个子目录。
2. 单击Objects前的“+”号,在Tables上击右键,选New Table。
3. 出现Manage Tables框。输入所需的字段。如:
Column Name Datatype Size
name char 8
age int 4(缺省,无法改变)
sex char 2
phone char 12
email char 50
4. 单击保存图标,出现Specify Table Name框,在New Table Name栏中输入表名,如people。单击OK
。
2 增加ODBC数据源
* 启动Windows NT 4.0。
* 开始──设置──控制面板──双击ODBC图标。
* 出现“ODBC数据源”对话框。单击“系统DSN”按钮。
* 出现“系统数据源”对话框。单击“添加”按钮。
* 出现“添加数据源”对话框。框中选定ODBC驱动程序,如SQL Server,并单击“确定”。
* 出现专用于驱动程序的对话框,如ODBC SQL Server Setup,输入数据源的名称,如CLASS。在
Options中输入后台数据库的名称,如stu。单击“OK”按钮,再次显示“系统数据源”对话框,可以看到
新建的数据源CLASS在框内。
* 单击“确定”按钮关闭“数据源”对话框。
3 编写HTML文件
HTML文件通常保存在INETPUB/WWWROOT/子目录下,本例保存了三个HTML文件,class.htm、add.htm和
search.htm。其中class.htm为访问入口,add.htm用于向后台数据库stu的people表中添加记录,
search.htm用于查询后台数据库stu的people表中满足条件的记录。本例使用Microsoft FrontPage 98设
计。下面分别是这三张主页的HTML代码。
class.htm文件:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<meta name="Microsoft Theme" content="none">
<meta name="Microsoft Border" content="none">
<title>同学通讯录</title>
</head>
<body bgcolor="#FFFFFF">
<p><big>同学通讯录:</big></p>
<p> </p>
<p><big><big> &
nbsp;
<a href="search.htm">查询</a></big></big></p>
<p><big><big> &
nbsp;
<a href="http://misserver/add.htm">添加</a></big></big></p>
</body>
</html>
add.htm源文件
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<meta name="Microsoft Border" content="none">
<title>添加记录</title>
</head>
<body>
<p> </p>
<p>请在下表中填写相关的信息:</p>
<form method="POST" action="scripts/class/add.idc">
<table border="1" cellpadding="0" width="100%">
<tr>
<td width="50%"><div align="right"><p>姓名:</td>
<td width="50%"><input type="text" name="txtname" size="20"></td>
</tr>
<tr>
<td width="50%"><div align="right"><p>年龄:</td>
<td width="50%"><input type="text" name="txtage" size="2"></td>
</tr>
<tr>
<td width="50%"><div align="right"><p>性别:</td>
<td width="50%"><input type="radio" value="男" checked name="gender">男<input
type="radio" name="gender" value="女">女</td>
</tr>
<tr>
<td width="50%"><div align="right"><p>电话:</td>
<td width="50%"><input type="text" name="txtphone" size="20"></td>
</tr>
<tr>
<td width="50%"><div align="right"><p>Email:</td>
<td width="50%"><input type="text" name="txtemail" size="20"></td>
</tr>
<tr>
<td width="50%"><div align="right"><p><input type="submit" value="添加" name="cmdadd"></td>
<td width="50%"><input type="reset" value="清除" name="cmdclear"></td>
</tr>
</table>
</form>
<p><a href="class.htm">返回</a></p>
</body>
</html>
search.htm文件
<head>
<title>同学通讯录</title>
</head>
<body bgcolor="#FFFFFF">
<form method="POST" action="/scripts/class/search.idc">
<p>输入您想查询的同学姓名:</p>
<p><input type="text" name="txtname" size="20"><input type="submit" value="开始"
name="B1"><input type="reset" value="清除" name="B2"></p>
</form>
<p><a href="class.htm">返回</a></p>
</body>
</html>
4 编写IDC文件
IDC文件应保存在INETPUB/SCRIPTS/子目录下,可以在此目录下进一步建立子目录,本例在
INETPUB/SCRIPTS/CLASS/子目录下保存了四个IDC文件,add.idc、edit.idc|、delete.idc和search.idc
。分别完成前台网页与后台数据库的记录增加、记录修改、记录删除和记录检索的功能。本例使用记事本
设计,但保存时应存为后缀是.idc的文件。
示例.idc文件中数据源的名称(Datasource)为“CLASS”。用户名(Username)为sa、密码(Password
)未设,来保证到ODBC数据源的有效登录,通常sa权限最高,它为系统默认的管理员。TEMPLATE模板指定
用于输出结果的相应HTX文件。SQL Statement是要执行的SQL语句。本例中四个SQL语句是从stu数据库
people表中选取NAME、AGE、SEX、PHONE、EMAIL字段,IDC对数据库中的数据进行增加、修改、删除和检
索等操作,并将结果通过相应的HTML扩展文件(.htx)输出。
下面分别是这四个文件的代码。
add.idc文件:
Username:sa
Password:
Template:add.htx
SQLStatement:
+INSERT INTO people(NAME,AGE, SEX, PHONE, email)
+VALUES('%txtname%',convert(int,'%txtage%'),'%gender%',
+'%txtphone%','%txtemail%')
edit.idc|文件:
Username:sa
Password:
Template:edit.htx
SQLStatement:
+UPDATE people
+SET NAME='%txtname%',AGE=convert(int,'%txtage%'),
+SEX='%gender%',
+PHONE='%txtphone%', email='%txtemail%'
+WHERE (name='%hidname%')
+AND(age=convert(int,'%hidage%'))
+AND(sex='%hidgender%')
+AND(phone='%hidphone%')
+AND(email='%hidemail%')
delete.idc文件:
Username:sa
Password:
Template:delete.htx
SQLStatement:
+DELETE FROM people
+WHERE (name='%hidname%')
+AND(age=convert(int,'%hidage%'))
+AND(sex='%hidgender%')
+AND(phone='%hidphone%')
+AND(email='%hidemail%')
search.idc文件:
Username:sa
Password:
Template:search.htx
SQLStatement:
+SELECT NAME,AGE, SEX, PHONE, email
+from stu.DBO.people
+where name='%txtname%'
5 编写HTX文件
HTX文件应保存在INETPUB/SCRIPTS/子目录下,可以在此目录下进一步建立子目录,本例在
INETPUB/SCRIPTS/CLASS/子目录下保存了四个HTX文件,add.htx、edit.htx|、delete.htx和search.htx
。.htx文件是含有以〈%%〉或〈!--%%--〉括起来的特殊标志的HTML文档,将返回的数据格式化。文件中
用Begindetail...enddetail、if...else...endif来控制取自数据库的数据,并用一定的HTML格式返回结
果。并用隐藏表技术来标识相关的网页。 本示例用Microsoft FrontPage 98编写。
下面分别是这四个文件的代码。
add.htx文件:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<meta name="Microsoft Border" content="none">
<title>添加结果</title>
</head>
<body>
<p> </p>
<p>下面的信息是您刚添加到库中的:</p>
<p> </p>
<form method="POST" action="edit.idc">
<input type="hidden" name="hidage" value="<%idc.txtage%>"><input type="hidden"
name="hidemail" value="<%idc.txtemail%>"><input type="hidden" name="hidgender"
value="<%idc.gender%>"><input type="hidden" name="hidname" value="<%idc.txtname%>"><input
type="hidden" name="hidphone" value="<%idc.txtphone%>"><table border="1" cellpadding="0"
width="100%">
<tr>
<td width="50%"><div align="right"><p>姓名:</td>
<td width="50%"><input type="text" name="txtname" size="20" value="<%idc.txtname%>"></td>
</tr>
<tr>
<td width="50%"><div align="right"><p>年龄:</td>
<td width="50%"><input type="text" name="txtage" size="20" value="<%idc.txtage%>"></td>
</tr>
<tr>
<td width="50%"><div align="right"><p>性别:</td>
<td width="50%"><input type="text" name="gender" size="20" value="<%idc.gender%>"></td>
</tr>
<tr>
<td width="50%"><div align="right"><p>电话:</td>
<td width="50%"><input type="text" name="txtphone" size="20" value="<%idc.txtphone%>"></td>
</tr>
<tr>
<td width="50%"><div align="right"><p>Email:</td>
<td width="50%"><input type="text" name="txtemail" size="20" value="<%idc.txtemail%>"></td>
</tr>
<tr>
<td width="100%"
colspan="2"> &n
bsp; &nbs
p;
<input type="submit" value="修改" name="cmdedit"></td>
</tr>
</table>
</form>
<form action="delete.idc" method="POST">
<input type="hidden" name="hidage" value="<%idc.txtage%>"><input type="hidden"
name="hidemail" value="<%idc.txtemail%>"><input type="hidden" name="hidgender"
value="<%idc.gender%>"><input type="hidden" name="hidname" value="<%idc.txtname%>"><input
type="hidden" name="hidphone" value="<%idc.txtphone%>"><table width="528">
<tr>
<td width="528"><div
align="left"><p> &nbs
p;
&n
bsp;
<input type="submit" value="删除" name="cmddelete"></td>
</tr>
</table>
</form>
</body>
</html>
edit.htx|文件:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>记录已修改成功</title>
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<meta name="Microsoft Theme" content="none">
<meta name="Microsoft Border" content="none">
</head>
<body>
<p>记录已修改成功!<a href="http://misserver/class.htm">返回</a></p>
</body>
</html>
delete.htx文件:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>记录已删除成功</title>
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<meta name="Microsoft Theme" content="none">
<meta name="Microsoft Border" content="none">
</head>
<body>
<p>记录已删除成功!<a href="http://misserver/class.htm">返回</a></p>
<p> </p>
</body>
</html>
search.htx文件:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="Microsoft Border" content="tl, default">
<title>查询结果</title>
<meta name="Microsoft Theme" content="none">
</head>
<body bgcolor="#FFFFFF">
<%if idc.txtname eq ""%>
<h2>通讯录中</h2>
<%else%>
<h2>通讯录中含<i> <%idc.txtname%> </i>字样的查询结果为</h2>
<%endif%>
<table border="1" cellpaddint="10">
<%begindetail%><%if CurrentRecord eq 0%> <caption>查询结果:</caption>
<tr>
<td><b>姓名</b> </td>
<td><b>年龄</b></td>
<td><b>性别</b></td>
<td><b>电话</b></td>
<td><b>Email</b></td>
</tr>
<%endif%> <tr>
<td><%name%>
</td>
<td align="right"><%age%>
</td>
<td><%sex%>
</td>
<td><%phone%>
</td>
<td><%email%>
</td>
</tr>
<%enddetail%></table>
<%if CurrentRecord eq 0%><i><b>
<p></b></i><em><font color="#0000FF"><strong><big>没有含<%idc.txtname%>的记录,请重新检索
</big></strong><b>!</b></font>
</em></p>
<%endif%>
<p><a href="http://misserver/search.htm">返回</a></p>
</body>
</html>
6 调试
可在服务器和客户机上分别调试。
服务器:
* 打开资源管理器,双击INETPUB/WWWROOT/下的class.htm。
* 出现“同学通讯录”页面,如果此时数据库中没有记录,我们可先进行添加,然后再进行检索。
客户机:
* 在任何一台与服务器相连的计算机中,打开浏览器,如Internet Explorer。
* 在URL中打入HTTP://202.112.80.222/class.htm(服务器的IP地址为202.112.80.222或输入服务器
名)。
* 出现“同学通讯录”页面。
class.htm文件:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<meta name="Microsoft Theme" content="none">
<meta name="Microsoft Border" content="none">
<title>同学通讯录</title>
</head>
<body bgcolor="#FFFFFF">
<p><big>同学通讯录:</big></p>
<p> </p>
<p><big><big> &
nbsp;
<a href="search.htm">查询</a></big></big></p>
<p><big><big> &
nbsp;
<a href="http://misserver/add.htm">添加</a></big></big></p>
</body>
</html>
add.htm源文件
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<meta name="Microsoft Border" content="none">
<title>添加记录</title>
</head>
<body>
<p> </p>
<p>请在下表中填写相关的信息:</p>
<form method="POST" action="scripts/class/add.idc">
<table border="1" cellpadding="0" width="100%">
<tr>
<td width="50%"><div align="right"><p>姓名:</td>
<td width="50%"><input type="text" name="txtname" size="20"></td>
</tr>
<tr>
<td width="50%"><div align="right"><p>年龄:</td>
<td width="50%"><input type="text" name="txtage" size="2"></td>
</tr>
<tr>
<td width="50%"><div align="right"><p>性别:</td>
<td width="50%"><input type="radio" value="男" checked name="gender">男<input
type="radio" name="gender" value="女">女</td>
</tr>
<tr>
<td width="50%"><div align="right"><p>电话:</td>
<td width="50%"><input type="text" name="txtphone" size="20"></td>
</tr>
<tr>
<td width="50%"><div align="right"><p>Email:</td>
<td width="50%"><input type="text" name="txtemail" size="20"></td>
</tr>
<tr>
<td width="50%"><div align="right"><p><input type="submit" value="添加" name="cmdadd"></td>
<td width="50%"><input type="reset" value="清除" name="cmdclear"></td>
</tr>
</table>
</form>
<p><a href="class.htm">返回</a></p>
</body>
</html>
search.htm文件
<html>
<head>
<title>同学通讯录</title>
</head>
<body bgcolor="#FFFFFF">
<form method="POST" action="/scripts/class/search.idc">
<p>输入您想查询的同学姓名:</p>
<p><input type="text" name="txtname" size="20"><input type="submit" value="开始"
name="B1"><input type="reset" value="清除" name="B2"></p>
</form>
<p><a href="class.htm">返回</a></p>
</body>
</html>