桦山涧

桦山涧
Asp.net ---->知识改变命运!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[转]Internet数据库连接器(IDC)技术

Posted on 2011-06-27 22:28  桦林  阅读(2316)  评论(0编辑  收藏  举报

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文件:

<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&

nbsp;
&nbsp; 
<href="search.htm">查询</a></big></big></p>
<p><big><big>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&

nbsp;
&nbsp; 
<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><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><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文件:

Datasource:class
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|文件:

Datasource:class
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文件:

Datasource:class
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文件:

Datasource:class
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文件:

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

<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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n

bsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs

p;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp; 
<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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs

p;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n

bsp;
&nbsp;&nbsp;&nbsp;&nbsp; 
<input type="submit" value="删除" name="cmddelete"></td>
</tr>
</table>
</form>
</body>
</html>


 

edit.htx|文件:

<html>

<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>记录已修改成功!<href="http://misserver/class.htm">返回</a></p>
</body>
</html>



delete.htx文件:

<html>

<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>记录已删除成功!<href="http://misserver/class.htm">返回</a></p>

<p> </p>
</body>
</html>


 

search.htx文件:

<html>

<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><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&

nbsp;&nbsp;
<a href="search.htm">查询</a></big></big></p>
<p><big><big>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&

nbsp;&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>