增加和显示新的记录一

  对于许多应用程序,你想让用户能够增加新的记录。基本的Server Extensions(服务器扩展)允许你这样做,它是利用SQL_INSERT语句,但是它只能对于一个表格。在许多情况下,你可能需要同时插入数据到多个表格,这些表格有一个相同的ID区域进行连接。举个例子,Orders和OrderDetail插入就包含了一个在两个表格之间的父/子关系。
  下面的例子是用VBScript,并且在NT 4.0工作站、PWS(Personal Web Server,个人网页服务器)和 SQL 7.0. 中创建的。
  本教程是教程《在同一网页上从一个记录集传递一个参数数值到另外一个记录集》的一个延续。我的例子是来自一个Jobs(工作)数据库。用户可以在注册之后键入新的Job Posting(工作记入),下面是基本的数据库设计 。

工作表格

工作分类表格

分类表格

JobID(工作ID,主键)

JobID 工作ID)

CategoryID(分类ID,主键)

JobTitle(工作标题)

JobCategoryID(主键)

Category(分类)

JobDescription(工作描述)

CategoryID (分类ID)

 公司注册页面
你需要创建一个简单的表单,上面有两个方框,一个为CompanyID,另外一个为Password。设置表单方法为POST以及表单的Action(动作)为AddJob.asp。这个网页将传递编辑框中的CompanyID和Password数值作为Request(请求)数值给JobAdd.asp页面,它将作为参数传递给存储过程(spCompanyLogin),如图1所示。

增加一个工作页面
   当注册之后,用户将被带到Job Add (工作增加)页面,这是一个基于表单的页面它将表单数值作为参数传递给一个Job Confirmation(工作确认)页面。这个工作确认页面在重复区域(repeat region)上显示Job Postings(工作记入)的概要。
  在该页面上有几个记录集。其中一个记录集为rsCompanyLogin,它示一个基于存储过程(spCompanyLogin)的记录集,它为存储过程接收CompanyID和Password作为参数并且返回适当的记录。另外一个记录集为rsCategory,它是运行存储过程(spCategory)以返回所有有效工作分类的记录集。
  首先使用存储过程(spCompanyLogin)来在网页上创建rsCompanyLogin记录集。你需要使用高级的对话框来连接存储过程。再为rsCompanyLogin设置以下的记录集的数值。这些与表单区域一致的数值传递自Login(注册)页面,并且它的名字和在存储过程中参数的名字一样(除了@,因为UltraDev不支持@)。现在你还要为页面增加两个Request(请求)变量,对应于以下表格的Run-time(运行)数值;请求变量应该命名为CompanyID和Password。它们将作为参数传递给存储过程并且返回适当的公司记录集。

名字

缺省数值

运行数值

CompanyID (公司ID)

1

Request("CompanyID")

Password(密码)

1

Request("Password")

  现在再使用存储过程(spCategory)来创建rsCategory记录集。这是你需要使用高级的对话框来连接存储过程(Stored Procedure)。这个rsCategory记录集被用于集中带用分类的表格,利用这些分类用户可以选择她的工作条目。
  现在创建一个表格以容纳各种表单区域用于增加新的工作。每一个编辑框(Edit box)、列表框(list box)等等应该与在你存储过程中的参数有相同的名字。为了帮助用户,增加rsCompanyName 区域到页面上。这个将给用户一个反馈,让她知道她是谁。同时在你的表单中增加一个隐藏的区域。这个隐藏区域的名字应该设置为CompanyID,而它的数值设置为
< %=(rsCompanyLogin.Fields.Item("CompanyID").Value)% >
  这个隐藏区域相当重要,因为需要进行数据库的设计。既然公司描述的所有信息从Jobs表格存储在一个独立的表格中,Jobs表格的其中一个必须区域是CompanyID。你的隐藏区域将把这个CompanyID数值传递给AddConfirmation.asp作为一个Request(请求)数值。
  设置表单方法为POST以及表单的Action(动作)为AddConfirm.asp。

  以下是网页的基本ASP代码:
< %
Dim rsCompanyLogin__CompanyID
rsCompanyLogin__CompanyID = "1"
if(Request("CompanyID") < > "") then rsCompanyLogin__CompanyID = Request("CompanyID")
% >

< %
Dim rsCompanyLogin__Password
rsCompanyLogin__Password = "1"
if(Request("Password") < > "") then rsCompanyLogin__Password = Request("Password")
% >
< %
set rsCompanyLogin = Server.CreateObject("ADODB.Recordset")
rsCompanyLogin.ActiveConnection = "dsn=Jobs;"
rsCompanyLogin.Source = "{call dbo.sp_CompanyLogin(" + Replace(rsCompanyLogin__CompanyID, "'", "''") + ",'" + Replace(rsCompanyLogin__Password, "'", "''") + "')}"
rsCompanyLogin.CursorType = 0
rsCompanyLogin.CursorLocation = 2
rsCompanyLogin.LockType = 3
rsCompanyLogin.Open rsCompanyLogin_numRows = 0
% >
< %
set rsCategory = Server.CreateObject("ADODB.Recordset")
rsCategory.ActiveConnection = "dsn=Jobs;"
rsCategory.Source = "{call dbo.sp_Category}"
rsCategory.CursorType = 0
rsCategory.CursorLocation = 2
rsCategory.LockType = 3
rsCategory.Open rsCategory_numRows = 0
% >

增加确认页面:AddConfirm.asp
  这个页面在应用程序中做了所有的实际工作。调用这个网页插入新的记录到两个(或者更多)相关表格并且将新的JobID传递给两个附加的记录集以可以显示新增数据给用户。在这个网页上有几个记录集,它们同Request(请求)变量从AddJop.asp表单的信息转换成存储过程。如图2所示的数据绑定显示了所有的记录集和Request(请求)变量。

  其中,commJobAdd示一个基于存储过程(commJobAdd)命令,它插入一个新的记录到Jobs表格中,并且从插入中提取新的JobID,再使用它同时插入子表JobCategory。这个命令同时返回了JobID的数值给ASP页面。
  RsJobSearch是一个记录集,它接收从commJobAdd传来的JobID并且将它作为参数再传递个一个存储过程(spJobSearch)以返回数据用于新插入的记录。
  RsJobCategories也是一个记录集,它接收来自commJobAdd的一个JobID,并且将它作为参数并传递给存储过程(spJobCategories)以返回那个JobID的分类。
命令存储过程
  commAddJob存储过程需要你正确配置命令,参见图3。当你在SQL 7中建立了初始的连接到存储过程,变量列表框将自动集中来自存储过程的@变量以及正确的数据类型。我们可以看到,绝大多数的变量被设置运行数值,它们被传递给存储过程。为了让命令正确运行,你需要根据在数据库表格中你是怎样配置区域的来为每一个数据类型设置大小。然后你需要增加适当的Request("fieldname")运行数值。值得提醒的是,我们标识了所有的从AddJob.asp表单的文本框和列表框,标识是用相同的名字作为存储过程变量的(负的@符号)。你可以看到所有的Request变量列表在图3中。

rsJobSearch 记录集
  如图4所示,我们可以看看rsJobSearch记录集。rsJobCategories记录集看起来有点象这个记录集。先为两个记录集体设置设置以下的参数。其中运行数值是很重用的,因为它从spJobAdd存储过程中取出新创建的JobID。

名字

缺省数值

运行数值

JobID (工作ID)

1

(commAddJob.Parameters.Item("@JobID").Value)

然后拖拉你想显示的记录集区域到你的区域。数据绑定如图4所示。

修改代码
  这里有几个基本的代码修改你必须增加到JobConfirm.asp页面上以使正常工作。我们使用跟教程1相同的策略来在页面上过滤记录集。你可能需要需要修改代码如下:
1.commJobAdd命令的代码跟为它所定义的变量必须处于页面的顶部,因为它必须首先执行。如果不是这样的话,将它剪切并粘贴到语句< %@LANGUAGE="VBSCRIPT"% >之后。
页面代码
  在UltraDev适当的位置应用这些记录集可以产生以下的网页代码。其中关键的代码在于连接插入存储过程到其它地方的输出。UltraDev做的第一件事情是声明所有的Request变量以传递spAddJob存储过程。然后你也会看到用于创建命令的代码,它们是从Request变量插入不同数值到适当的表格中。之后的代码示用于创建JobID变量、rsJobSearch记录集以及rsJobCategories记录集。