ASP存储过程在开发中的应用分析。

需求:用于实现省市区三级下拉菜单(简化过程,提高重用)

   目的:省全部显示,市根据省ID进行显示,区根据省,市ID进行显示

使用SQL实现:组合SQL的过程

   使用存储过程实现: 

 1CREATE  PROCEDURE PMyInfo  
 2    @Userid int  
 3AS  
 4BEGIN  
 5   SELECT U.UserName,U.PostCode,U.Homepage,Content,U.BirthDay,F.School,F.SchoolAge,F.DiplId,F.TechId,
 6     (SELECT DepName FROM DicDep WHERE DepID = U.DepID) AS DepName,--部门
 7      (SELECT TechName FROM DicTech WHERE TechID = F.TechID) AS TechName, --科室
 8      (SELECT UnitName FROM DicUnit WHERE UnitID = U.UnitID) AS UnitName,  --单位
 9      FROM UserAdmin AS U LEFT OUTER JOIN FamousDoc AS F ON U.Userid = F.UserID
10WHERE  U.UserID = @Userid
11END
12


 

调用存储过程性质:有参数,返回记录集,无需分页

   调用过程:

           省下拉列表:rsa.open "exec ProvCityBorough",conn,1

           市下拉列表:rsa.open "EXEC ProvCityBorough" & sProvId,conn,1

           区下拉列表:rsa.open "EXEC ProvCityBorough "&sProvId & sCityID,conn,1                   这段代码调用时没有结果(为什么)


 

需求:显示医生的个人信息(减少对数据库I/O的次数)

目的:医生的信息

使用SQL实现:

需要通过用户类型ID查询出用户类型为医生

通过单位ID查询单位名称及科室

通过用户的专科ID查询出专科名称

通过用户的职称ID查询出职称名称

   使用存储过程实现:

 1CREATE PROC ProvCityBorough
 2    @ProvID INT = 0 ,@CityID INT = 0
 3AS
 4SET NOCOUNT ON
 5BEGIN
 6    IF @ProvID = 0 and @CityID = 0
 7       SELECT * FROM DicProvince ORDER BY rovid
 8    ELSE IF @CityID > 0  --先比较市ID,再进行比较省ID(为什么)
 9
10     SELECT * FROM DicBorough where ProvID = ProvID AND CityID=@CityID 
11ORDER BY BoroID
12    ELSE IF @ProvID > 0
13             SELECT * FROM DicCity WHERE ProvID = @ProvID ORDER BY Cityid
14END
15--调用示例
16--EXEC ProvCityBorough 10,83
17
18 
19


   调用存储过程性质:有输入参数,有记录集,但无需分页,可用rs.open 调用

   调用过程:rs.open "EXEC PMyInfo "&iUserId,conn,1

 

 

需求:注册时用户是否存在验证(对查询进行预编译,提高查询效率)

目的:接收用户名验证用户是否存在

使用SQL实现:

     接收用户名,组合SQL语句,进行查询数据库

     如果记录集的条数等1则提示出错返回,否则继续进行操作

   存储过程代码:

 

 1CREATE  PROCEDURE PCheckUser
 2   @UserName VARCHAR(20),@Pwd VARCHAR(50),@Email VARCHAR(50)
 3AS
 4   SET NOCOUNT ON
 5BEGIN
 6   SELECT UserName FROM UserAdmin WHERE UserName = @UserName
 7   IF @@rowcount > 0  --(@@rowcount的作用)
 8      RETURN 1
 9   ELSE
10      BEGIN
11        INSERT INTO(…) VALUES(…)
12        RETURN 0
13      END
14END
15
16


 

   调用存储过程性质:有参数,有返回值

   调用过程:

 1<%     Set Comm = Server.CreateObject("ADODB.Command")
 2    with Comm
 3       .ActiveConnection = Conn
 4       .CommandText = "PCheckUser"   .CommandType = 4    .Prepared = true              
 5       .Parameters.Append .CreateParameter("RETURN",2,4)    --返回值参数的设置(放在第一位)
 6       .Parameters.Append .CreateParameter("@UserName",200,1,50,syhm)
 7       .Parameters.Append .CreateParameter("@Pwd",200,1,50,spwd)
 8       .Execute
 9    end with
10    if Comm(0= 1 then   --调用返回值
11     response.write "<script languge='javascript'>alert('您填写的帐号已占用!请返回重新填写.'); </script>" 
12       end if
13%>







 

 

 

 

 

需求:用户注册信息配置(封装业务逻辑)

目的:用户注册对个人相关的信息进行配置

使用SQL实现:

1.如果通过重复性验证,通过刚刚注册的用户名,查询出用户ID

2.将个人网站的布局和样式查出来  -- 插入到个人空间表中

3.将个人类别的公用栏目信息插到注册用户的栏目中

4.将属于个人类别的

   存储过程代码:
 

 1CREATE  PROCEDURE PRegUser
 2    @UserName Varchar(20)
 3AS
 4   SET NOCOUNT ON
 5   DECLARE @UserId BIGINT
 6BEGIN
 7    BEGIN TRANSACTION
 8--1.如果注册成功,根据注册的用户名,查找出用户ID
 9    SELECT @UserId = UserId FROM UserAdmin WHERE UserName = @UserName
10    DECLARE @Spaceid BIGINT,@Cssid BIGINT  --定义中转变量
11    DECLARE@LogoUrl NVARCHAR(100--定义中转变量
12
13--2.将个人网站的第一种布局及第一种布局的第一种样式查找出来,插入到个人空间中
14      SELECTTOP1@Spaceid=Spaceid   FROM DicSpace WHERE typeid = 2
15      SELECT TOP 1 @CssID = Cssid  FROM DicCss WHERE Spaceid = 9      
16--3.将查询的信息插入到个人空间的表中()
17    INSERT INTO UserSpace(…)
18 VALUES(@UserId,@Spaceid,@PreviewUrl,'嘿嘿,我也有自己的网站了',@UserName)
19--4.将属于个人类别的公用的栏目信息插到这个注册用户的栏目中
20   INSERT INTO dictype(UserID,TypeName,TypeClass)
21 SELECT @UserId,TypeName,0 FROM dictypepub WHERE userlevelid=10
22--5.将属于个人类别的公用相册夹插入到这个注册用户的相册类别中  
23    INSERT INTO MyPicFolder SELECT @UserId,
24 FROM DicFolderPub WHERE UserLevelId=10    
25--错误处理
26    IF @@ERROR <> 0 
27       BEGIN
28          ROLLBACK TRANSACTION
29          RETURN 1
30       END
31    ELSE
32       BEGIN
33          COMMIT TRANSACTION 
34          RETURN @UserId
35       END
36END   

 

   调用存储过程性质:有输入参数,有返回值,无返回记录集

   调用过程

  

 1 '将用户基本配置信息写到个人的相应数据表中
 2    Set Comm = Server.CreateObject("ADODB.Command")
 3    with Comm
 4       .ActiveConnection = Conn
 5       .CommandText      = "PRegUser"
 6       .CommandType      = 4        
 7       .Prepared         = true              
 8       .Parameters.Append .CreateParameter("RETURN",20,4)
 9       .Parameters.Append .CreateParameter("@UserName",200,1,50,syhm)
10       .Execute
11    end with
12    if Comm(0> 1 then
13       iUserId = Comm(0)  ‘返回用户ID
14      else
15       response.write "<script languge='javascript'>alert('用户注册失败!请返回重新注册.');history.go(-1);</script>" 
16        response.end()
17end if



 

需求:更改用户类型的单位选择(多条件查数化查询)

目的:根据选择的省,,区或是选择的条件进行查询医院单位,并可以进行分页

使用SQL实现:

1.      进入页面,未选择任何条件,显示医院的总数

2.      按省,,区输入的内容进行条件筛选.在选择不同的省市区时即时显示医院的内容

3.      输入的医院名称进行查询

  

存储过程实现:

 

 1 --功能描述:根据输入单位类别和相应的条件查询相应的单位信息  
 2--输入参数:省,市,区ID,页码,单位名称查询关键字  
 3--输    出:没有条件时返回单位的总数;有条件是查询单位的个数及单位的名称  
 4CREATE  PROC PChooseUnit  
 5   @ProvID varchar(20),@CityID varchar(20),@BoroId varchar(20),  
 6   @iPage int,@UnitName nvarchar(50),@UnitLevelID varchar(4)  
 7AS   
 8   SET NOCOUNT ON
 9BEGIN 
10   DECLARE @sqlh varchar(300), @sql varchar(300)    
11       SET @sqlh = 'SELECT COUNT(*) as Counts FROM DicUnit
12       SET @sql =  ' WHERE UnitTypeID =' + @UnitLevelID      --根据条件进行拼合SQL    
13       if @ProvId > 0      SET @sql = @sql + ' and ProvId=' + @ProvId    
14    if @CityId > 0      SET @sql = @sql + ' and CityId=' + @CityId    
15       if @BoroId > 0      SET @sql = @sql + ' and BoroId=' + @BoroId    
16       if @UnitName <> '' SET @sql = @sql + ' and UnitName like ' + '''' + '%' + @UnitName + '%'''''     
17--如果没有条件,则查询出单位的总个数并进行返回    
18--PRINT @sqlh + @sql  
19  EXEC (@sqlh+@sql)  ‘查询出记录的条数
20  IF @ProvId = 0 AND @BoroId = 0 AND @BoroId = 0 AND @UnitName = ''    
21  BEGIN  
22      RETURN 1 --表示没有条件返回  
23   END             
24-- SQL语句拆分为三段此为第一段
25   SET @sqlh='SELECT UnitID,UserID,UnitName,Clicks FROM 
26(SELECT TOP 10 UnitID,UserID,UnitName,Clicks FROM (SELECT TOP'+convert(varchar(30),10*@iPage) +' UnitID,UserID,UnitName,Clicks 
27FROM dicunit     
28   DECLARE @sqlb varchar(300)  
29-- SQL语句拆分为三段此为第三段
30    SET @sqlb = ' ORDER BY Clicks desc) a  ORDER BY Clicks)
31 DERIVEDTBL ORDER BY Clicks desc '    
32   SET @sql = @sqlh + @sql + @sqlb  
33--PRINT @SQL  
34EXEC (@sql)  
35
36       RETURN 0 --表示有条件返回  
37
38END    
39
40--调用示例
41
42--调用格式:存储过程名,省ID,市ID,区ID,页码,医院名称,单位类型  
43
44--医院ID为1  器械商单位ID为2  药商单位ID为3  软件单位ID为4  
45
46--EXEC PChooseUnit '17', 0,0,3,'',4
47
48

 
 

   调用存储过程性质:有输入参数,返回值,有多个记录集的存储过程

   调用过程

 

 1<
 2   set Comm = server.createobject("adodb.command")
 3  iUnitLevelID = 1
 4  with Comm
 5       .ActiveConnection = conn
 6       .CommandText = "PChooseUnit" '指定存储过程名
 7       .CommandType = 4 '表明这是一个存储过程
 8       .Prepared = true '要求将SQL命令先行编译
 9       .Parameters.append .CreateParameter("return",2,4)                      '返回值    
10       .Parameters.append .CreateParameter("@ProvID",200,1,20,sProvId)   '字符串参数
11       .Parameters.append .CreateParameter("@CityID",200,1,20,sCityID)
12      .Parameters.append .CreateParameter("@BoroId",200,1,20,sBoroId)
13      .Parameters.append .CreateParameter("@iPage",3,1,4,iPage)          '整型值参数
14       .Parameters.append .CreateParameter("@UnitName",200,1,50,sKey)
15      .Parameters.append .CreateParameter("@UnitLevelID",200,1,4,iUnitLevelID)          
16      Set rs = .Execute
17end with
18  iCounts = rs("Counts")           ‘返回的记录总条数
19   rs.close    ‘要关闭记录集,然后才能使用返回值的属性
20   if comm(0= 1 then
21      response.write "<tr><td>&nbsp;</td><td>共有"&iCounts&"家医疗单位。</td></tr>"
22   else
23       rs.open
24       Set rs = rs.NextRecordset()   ‘应用下个记录集
25       href="ChooseHosp.asp"
26      iPages=iCounts\10      if iCounts mod 10 >0 then iPages=iPages+1
27      if iPage>iPages then iPage=iPages
28      if not rs.eof and not rs.bof then
29         while not rs.eof
30            response.write "<tr><td>rs("UnitName")</td></tr>"
31            if rs("UserId")>0 then
32       wend
33    end if    %>
posted @ 2006-12-01 18:01  许文  阅读(1017)  评论(0编辑  收藏  举报