使用Acess或者SQL Sever写ASP代码
有时候你在调试ASP代码的时候会感到和厌倦,因为有许多错误。后来,我发现了一种缩短一些重复ASP编码任务的方法。这是一个老的思想(它应用在Access
2.0的日子里),来在Access上编写网页。这个思想是将文本和数据库区域数值混合在一起来创建你需要的代码。
我现在正在制作一个包含个人简历的站点。在数据库设计的过程中最头痛的是有70种不同的技巧来跟踪人。既然个人简历没有永久地存储,而是在6个月之后被移除,所以创建一个多表格的关系型数据库来存储将是一个“天方夜潭”。所以我决定用一个基本表格在一个地方存储人们的个人简历。这就意味着将有许多区域在数据库种。
我也需要一个Lookup(检查)表格来存储所有的Skill(技巧)数值以可以在UltraDev上用于动态创建列表框。所以我首先创建Lookup表格,并且命名为Skills。
区域名字 SQL 7数据类型 Access 2000/97数据类型 注释SkillID (主键盘) [varchar](50) Text(50) 通常我设置主键为整型,并给它赋值为Autonumber。
在本例子种我使用了一个文本区域并给予了独特的值,后面你将会看到我这样做的理由。
Category [varchar](50) Text(50) 技巧分类
Lookup [varchar](50) Text(50) 技巧描述
SortOrder [int] Integer 用什么顺序来排列
Active [bit] Yes/No 我经常使用Yes/No区域来开或者关这些数值。所有我的查询或者存储过程
是通过运行"Select...Where Active = 1"
来实现的。
以下是一些示例数据
SkillID Category Lookup SortOrder Active
M1 Medical CPR 1 1
M2 Medical Wilderness First 2 1
Aid (WFA)
M3 Medical Wilderness 3 1
Advanced First
Aid (WAFA)
M4 Medical Wilderness First 4 1
Responder (WFR)
M5 Medical First Responder 5 1
M6 Medical EMT 6 1
M7 Medical Wilderness EMT 7 1
M8 Medical Paramedic 8 1
在Skills表格种还有4种其它的种类,因为总共有70种不同的技巧。我创建了总共5个记录集,每一个记录集只有显示各个分类的记录,如上表的Medical分类。我在一个插入页面使用这5个记录集来驱动动态检查框以至于如果人们有那个技巧它们可以复选Yes。
下面让我们看看Resume(个人简历)表格。很明显地上面有name(名字)、 address(地址)以及所有的Skill区域。我给skill区域名字给了相同的数值最为在Skill表格的主键,这样做的目的是可以容易地建立连接。
区域名字 SQL 7数据类型 Access 2000/97数据类型 注释
ResumeID (主键) [int] Integer Autonumber
M1 [bit] Yes/No CPR - Yes/No
M2 [bit] Yes/No Wilderness First
Aid (WFA) - Yes/No
M3 [bit] Yes/No Wilderness Advanced
First Aid (WAFA) - Yes/No
M4 [bit] Yes/No Wilderness First Responder
(WFR) - Yes/No
M5 [bit] Yes/No First Responder - Yes/No
M6 [bit] Yes/No EMT - Yes/No
M7 [bit] Yes/No Wilderness EMT - Yes/No
M8 [bit] Yes/No Paramedic - Yes/No
在Insert(插入)表单种我给了每一个复选框一个名字(M1, M2, M3...),这样一来,单我应用UD Insert Server Behavior
的时候,它就会映射正确的复选框到Resume表格中的正确区域。以下是更简洁的说明:对于特定的Skill(技巧),Skills表格的主键数值对应于Resume表格区域名字。举个例子,SkillID为M1的Skills表格行是CPR行。在Resume表格中如果区域名为M1的数值是Yes的话,那么这个人有CPR。
创建一个View(查看)/Query(查询)/Stored Procedure(存储过程)
你可以通过使用Access 97/2000或者SQL Server来实现这个创作。在本例子中我使用SQL Server,所以它的语法,比如字符串的连接有点不用(SQL使用的是“+”号,而Access使用的是“&”号)。这里有一个我在SQL 7使用查询网格创建查看,它跟Acces很相似。在工具栏上按下SQL按钮可以查看产生的SQL代码。基本的SQL代码是SELECT SkillID, Lookup FROM Skills。在我需要实际区域数值的地方,我必须用单一的引用来关闭字符串,然后使用“+”号来联机字符串到区域数值,再用另外一个“+”和一个新的单一引用来连接下一个字符串。你需要特别注意,再连接整个字符串的时候你需要空格和单一或者双引用标志。它可以有一些麻烦和错误,但是一旦它建立好后,它就会有巨大的魔力使得你一定要引用它。
现在我要做的事情是运行查询Skill 表格以得到两个区域数值、SkillID和Lookup(检查)描述。为了那个查询我将增加文本字符串,这个字符串包含了我需要的ASP代码。一旦你开始增加字符串,网格就不再显示单一区域,所以增加了AS Expr1 语句。
SELECT '< % IF (rsSearch.Fields.Item("'
+ SkillID + '").Value) = "True" THEN Response.Write "<
li > ' + Lookup + ' < /li >" END IF % >' AS Expr1
FROM Skills
当你运行查询或者查看,你能在结果的网格中看到什么?在Access中你看到的就是你得到的,而在SQL Server中要拷贝查询行增加额外的双引用,所以当你拷贝它的时候你所得到的就在末尾。代码如下:
"< % IF (rsSearch.Fields.Item(""M1"").Value)
= ""True"" THEN Response.Write ""< li > CPR
< /li >"" END IF % >"
一个快速搜索和替代将剔除双引用而留给你完美的代码,将这些代码粘贴到你的网页上去:
< % IF
(rsSearch.Fields.Item("M1").Value) = "True" THEN
Response.Write "< li > CPR < /li >" END IF % >
< % IF (rsSearch.Fields.Item("M2").Value) = "True" THEN
Response.Write "< li > Wilderness First Aid (WFA) < /li
>" END IF % >
< % IF (rsSearch.Fields.Item("M3").Value) = "True" THEN
Response.Write "< li > Wilderness Advanced First Aid (WAFA) < /li
>" END IF % >
< % IF (rsSearch.Fields.Item("M4").Value) = "True" THEN
Response.Write "< li > Wilderness First Responder (WFR) < /li
>" END IF % >
< % IF (rsSearch.Fields.Item("M5").Value) = "True" THEN
Response.Write "< li > First Responder < /li >" END IF %
>
< % IF (rsSearch.Fields.Item("M6").Value) = "True" THEN
Response.Write "< li > EMT < /li >" END IF % >
< % IF (rsSearch.Fields.Item("M7").Value) = "True" THEN
Response.Write "< li > Wilderness EMT < /li >" END IF %
>
< % IF (rsSearch.Fields.Item("M8").Value) = "True" THEN
Response.Write "< li > Paramedic < /li >" END IF % >
接下来我解释一个上面这些代码。因为在两个表格之间并不存在真正的关系,所以没有一种直接连接Skills表格和Resumes表格的方法。RsSearch 记录集是UD记录集,它基于用户搜索条件调用Resume表格。可以使用SkillID主键数值M1,它与Resume表格相应区域有着相同的名字,所以我可以从Skills查询创建ASP检查语句。
实际的ASP代码只是简单计算Resume 区域的M1数值是否等于True。如果是的话,它在无序的列表种写下描述。它花费了我一些时间,但是想到要键入、传递和编辑所有70个ASP语句,然后来找出哪儿我已经键错了,这些时间还是值得的。同时,如果我增加新的Skills到Skills表格以及相应的区域给Resume表格,所有我要做的事情是再次运行查询将将它剪切并粘贴到新的数值。很明显地,你不会用这种方法来写整个网页,但是一旦你有许多重复地代码将要分布数据库数值的时候,这种方法将给你节省很多的时间。
另外一个快速的例子可以使用下面的存储过程。这是另外一种检查,但是在本例子中我想让数据库以正确的顺序来产生ASP代码 。因为SQL不支持ORDER BY语句,所以我编写编写以下的存储过程:
Alter Procedure spASPPopulation
As
set nocount on
SELECT '< % IF (rsSearch.Fields.Item("' + PopID + '").Value) =
"True" THEN Response.Write "< li > '+ PopulationType + '
< /li >" END IF % >' AS Expr1
FROM Population
ORDER BY PopulationType
return
你可以使用相同的方法来在你需要的地方创建重复的ASP代码来连接你的数据库。举个例子,比如你需要在一个网页上定义70个变量,你只需要创建一个字符串,它合并了你的Dim语句以及数据库区域名字和数字,然后你只需要剪切并且粘贴它。