参数数值传递

 

在一个网页上有多个记录集对于许多网页数据库应用程序来说是一个必要条件。在许多情况下 你需要在两个记录集之间建立联系,当其中一个记录集改变的时候中,另外一个页随之改变。
我原来可以通过传递一个隐藏区域数值给详细数据的网页来实现。然而我也想用户可以从搜索中浏览详细的记录,但是我发现UltraDev缺省的代码不能运行你这样做。所以本教程就是教你怎样实现这个功能,你只要进行小部分的更改就可以轻松地连接两个记录集。下面我将解释在SQL 7中怎样传递参数到Stored Procedures(存储过程)。
  下面的例子是用VBScript,并且在NT 4.0工作站、PWS(Personal Web Server,个人网页服务器)和 SQL 7.0.中创建的。
  我的这个例子是一个Jobs(工作)数据库。用户可以使用多种参数来搜索各种工作,比如Job Region(工作地区)、Job Type(工作类型) 和 Job Category(工作分类)。每一个工作可能包括许多用户可能想搜索的分类。以下是基本的数据库设计。

工作表格

工作表格

分类表格

JobID(工作ID,主键)

JobID 工作ID)

CategoryID(分类ID,主键)

JobTitle(工作标题)

JobCategoryID(主键)

Category(分类)

JobDescription(工作描述)

CategoryID(分类ID)

   所以我们要讨论的是一个Jobs和JobCategory之间典型的父-子关系(一对多)。实际的 JobCategory分类存储在独立的分类表格中。
  开始的搜索页面(Search Page)是一个基于表单的网页,它把表单数据作为参数传递给一个 Job Posting (工作记入)页面。这个工作记入页面在一个重复区域上显示工作记入的摘要。
  从重复区域表格中,用户可以点击Job Title(工作标题)进入到Job Detail(工作描述)页面
。在这个应用 程序中用到两个记录集。
  其中一个记录集是rsJobSearch:它是一个基于一个存储过程的记录集,它允许搜索条件作为
存储过程的参数返回适当的记录。
  另外一个记录集是rsJobCategories:它是一个接受JobID作为参数的记录集,它将这个参数传递给存储过程以返回所有的JobID的分类。

工作描述页面

  首先要在页面上使用存储过程创建rsJobSearch记录集,其例子在下面。你需要使用高级的对
话框来连接储存过程。对于rsJobSearch要为记录集设置下面的数值。这些与表单区域一致的
数值传递自Search (搜索)页面,并且它的名字和在存储过程中参数的名字一样(除了@,因
为UltraDev不支持@)。你还要创建一系列的Request(请求)变量作为在下面表格的运行变量。
至此你可以放掉所有的记录集数值,它们是你想在Job Details页面想看到的。为Move to
First Record(移到第一个记录)、 Move to Next Record(移到下一个记录)、 Move to
Previous Record(移到前一个记录)和 Move to Last Record(移到最后一个记录)增加必
要的Server Behaviors(服务器行为)。

名字

缺省数值

运行数值

EnterDate(键入日期)

1/1/00

Request("EnterDate")

CategoryID(分类ID)

'Z'

Request("CategoryID")

RegionID (地区ID)

'Z'

 Request("RegionID")

TypeID (类型ID)

'Z'

Request("TypeID")

Population ID(人口ID)

'Z'

Request("PopulationID")



  现在使用存储过程来创建rsJobCategories记录集。你需要使用高级对话框来连接到存储过程。首先你需要为rsJobCategories记录集编辑数值。接着你所需要做的是为 rsJobCategories设置缺省的数值给从rsJobSearch来的JobID数值。再设置记录集变量。

名字

 缺省数值

运行数值

JobID(工作ID)

1

 rsJobSearch.Fields.Item("JobID")



你为记录集定义变量的ASP代码如下:


< %
Dim rsJobCategories__JobID
rsJobCategories__JobID = "1"
if(Request("JobID") <> "") then rsJobCategories__JobID =
(rsJobSearch.Fields.Item("JobID").Value)
% >


  现在在Job Details(工作描述)页面创建一个表格并且从rsJobCategories增加分类数值。再设置表格作为一个重复区域(repeat region)来显示从记录集的所有行。

修改代码

这里有几个基本的代码修改你必须增加。

1.你必须移动一些代码,因为UltraDev是在记录集创建之前在页面的顶部创建所有的变量
的。但是这是JobID的数值在页面上并不是有效的,它只有到rsJobSearch记录集被创建才是有
效的。所以我们不得不移动一些代码。第一段代码需要移动的是上面一段ASP代码。剪切该段
代码将其粘贴到代码代码语句部分的最末尾,即在标志的上面。

2.再找到创建rsJobCatgories数据库连接的代码。如果你注意看,再这个代码的下面应该是为
Job Categories的重复区域写的代码。剪切这段代码将其粘贴到你第二步中移动的代码下面。
在VBScript区段末尾的新的代码如下:


< %
Dim rsJobCategories__JobID
rsJobCategories__JobID = "1"
if(Request("JobID") <> "") then rsJobCategories__JobID =
(rsJobSearch.Fields.Item("JobID").Value)
% >

< %
set rsJobCategories = Server.CreateObject("ADODB.Recordset")
rsJobCategories.ActiveConnection = "dsn=Jobs;"
rsJobCategories.Source = "{call dbo.spJobCategories(" +
Replace(rsJobCategories__JobID, "'", "''") + ")}" rsJobCategories.CursorType = 3
rsJobCategories.CursorLocation = 3
rsJobCategories.LockType = 1
rsJobCategories.Open rsJobCategories_numRows = 0
% >

< %
Dim Repeat1__numRows
Repeat1__numRows = -1 Dim
Repeat1__index Repeat1__index = 0
rsJobCategories_numRows = rsJobCategories_numRows + Repeat1__numRows
% >

< html >< head >...


  这里值得指出的是,你可能会注意到我已经将CursorLocation 的缺省值2修改成3了。这
是因为我的工作数据库有ntext区域(这有点想Access的备忘录区域)以及当UltraDev代码想
阅读大量的文本区域的相后产生了一个ASP错误。所以要改变CursorLocation来修理它。

总体解释

  Job Search 页面使用POST将表单元素传递给Job Posting页面,表单元素有EnterDate(键入日期), CategoryID(分类ID)、RegionID(地区ID)、 TypeID(类型ID)、 PopulationID(人
口ID)。这些数值被放置在Request变量中并且做为参数传递给rsJobSearch存储过程,这个存
储过程再将其传递给适当的数据库记录。Job Posting页面也利用了Go to Detail Page
Server Behavior来连接到Jobs Detail 页面。
  而Job Detail页面跟Job Posting 页面有着相同的rsJobSearch记录集(以及相同的Request变量)来从数据库中取出相同的记录。Job Details页面也有rsJobCategories记录集。我们所要
做的是重新排列UltraDev代码,以至于网页在转载的时候以正确的顺序被创建。其中一个重要
的事情是我们在rsJobSearch数据前后移动代码是为了让它们在UltraDev产生的代码之后产生
。我发现只有代码处于最末端的时候才工作正常。当Job Detail页面被调用的使用,以下的几
件事情就发生了:

1. 不同的Request变量被传递给rsJobSearch存储过程,并且记录集被创建了。
2. 对于当前显示记录的JobID数值被指定为变量rsJobCategories__JobID。
3. rsJobCategories__JobID作为参数传递给rsJobCategories记录集,并且那个记录集被创
建。
4. 页面汇报了来自rsJobSearch的详细信息以及适当的重复区域(Repeat Region)。
5. 当你浏览网页的时候,rsJobSearch 记录集体就被再次调用,并且
rsJobCategories__JobID也再次以新的JobID数值被创建,这个JobID数值重新赋给
rsJobCatagories记录集以正确的数值。
所以每次你移到不同的父记录的时候,适当的子记录将被显示在重复区域上。

存储过程

  以下是Job Search 存储过程的代码。这些代码是一个自动有SQL语句自动生成的,它们被用于在Job Posting 页面以及Job Detail页面上创建rsJobSearch记录集。


Alter Procedure spJobSearch

@EnterDate datetime,
@CategoryID varchar (255) = Z,
@RegionID varchar (255) = Z,
@TypeID varchar (255) = Z,
@PopulationID varchar (255) = Z

AS
declare @SQL nvarchar(1000) select @SQL = 'SELECT Jobs.*, Company.Description,
Company.CompanyName,' + ' Company.Address1, Company.Address2, Company.City,
CategoryType.Category1, JobType.JobType,' + ' Company.State, Company.PostalCode,
Company.Country, Region.Region,' + ' Company.Phone, Company.Fax, Company.Email,
Company.WebSite, Population.PopulationType' + ' FROM Company INNER JOIN' + ' Jobs
ON Company.CompanyID = Jobs.CompanyID INNER JOIN' + ' JobType ON Jobs.JobTypeID =
JobType.JobTypeID INNER JOIN' + ' CategoryType ON Jobs.CategoryID =
CategoryType.CategoryID INNER JOIN' + ' Population ON Jobs.PopulationID =
Population.PopulationID INNER JOIN' + ' Region ON Jobs.RegionID = Region.RegionID'
+ ' WHERE (Jobs.Verify = -1) AND Jobs.ExpireDate >= GetDate()'

IF @EnterDate IS NOT NULL SELECT @SQL = @SQL + ' AND Jobs.EnterDate >= (''' +
CONVERT(varchar,@EnterDate) + ''')'
IF @CategoryID not Like 'Z' select @SQL = @SQL + ' AND Jobs.CategoryID IN (' +
@CategoryID + ')'
IF @RegionID not Like 'Z' select @SQL = @SQL + ' AND Jobs.RegionID IN (' +
@RegionID + ')'
IF @TypeID not Like 'Z' select @SQL = @SQL + ' AND Jobs.JobTypeID IN (' + @TypeID
+ ')'
IF @PopulationID not Like 'Z' select @SQL = @SQL + ' AND Jobs.PopulationID IN (' +
@PopulationID + ')'

execute(@SQL)

下面是JobCategories的存储过程,它取出了JobID的数值并且为JobID选择所有的工作分(Job
Categories)类,其代码如下:
Alter Procedure spJobCategories

@JobID int

As
SELECT JobCategory.JobID, JobCategory.CategoryID, CategoryType.Category
FROM CategoryType INNER JOIN JobCategory
ON JobCategory.CategoryID = CategoryType.CategoryID
WHERE JobCategory.JobID = @JobID ORDER BY CategoryType.Category

Return

--------------