ASP程序与SQL存储过程结合使用详解

定义总是很抽象。存储进程其实就是能完成一定操作的一组SQL语句,只不过这组语句是放在数据库中的(这里我们只谈SQL SERVER)。如果我们通过创建存储进程以及在ASP中调用存储进程,就可以避免将SQL语句同ASP代码混杂在一起。这样做的好处至少有三个:
    第一、大大提高效率。存储进程本身的执行速度非常快,而且,调用存储进程可以大大减少同数据库的交互次数。
    第二、提高安全性。假如将SQL语句混合在ASP代码中,一旦代码失密,同时也就意味着库结构失密。
    第三、有利于SQL语句的重用。

在ASP中,一般通过COMMAND对象调用存储进程,根据不同情况,本文也介绍其它调用方法。为了方便说明,根据存储进程的输入输出,作以下简单分类:
    1. 只返回单一记录集的存储进程
    假设有以下存储进程(本文的目的不在于讲述T-SQL语法,所以存储进程只给出代码,不作说明):

/*SP1*/
    CREATE PROCEDURE DBO.GETUSERLIST
    AS
    SET NOCOUNT ON
    BEGIN
       SELECT * FROM DBO.[USERINFO]
    END
    GO

以上存储进程取得USERINFO表中的所有记录,返回一个记录集。通过COMMAND对象调用该存储进程的ASP代码如下:

'**通过COMMAND对象调用存储进程**
    DIM MYCOMM,MYRST
    SET MYCOMM = SERVER.CREATEOBJECT("ADODB.COMMAND")
    MYCOMM.ACTIVECONNECTION = MYCONSTR          'MYCONSTR是数据库连接字串
    MYCOMM.COMMANDTEXT      = "GETUSERLIST"     '指定存储进程名
    MYCOMM.COMMANDTYPE      = 4                 '表明这是一个存储进程
    MYCOMM.PREPARED         = TRUE              '要求将SQL命令先行编译
    SET MYRST = MYCOMM.EXECUTE
    SET MYCOMM = NOTHING

存储进程取得的记录集赋给MYRST,接下来,可以对MYRST进行操作。
    在以上代码中,COMMANDTYPE属性表明请求的类型,取值及说明如下:
      -1   表明COMMANDTEXT参数的类型无法确定
      1    表明COMMANDTEXT是一般的命令类型
      2    表明COMMANDTEXT参数是一个具有的表名称
      4    表明COMMANDTEXT参数是一个存储进程的名称

还可以通过CONNECTION对象或RECORDSET对象调用存储进程,方法分别如下:

'**通过CONNECTION对象调用存储进程**
    DIM MYCONN,MYRST
    SET MYCONN = SERVER.CREATEOBJECT("ADODB.CONNECTION")
    MYCONN.OPEN MYCONSTR                            'MYCONSTR是数据库连接字串
    SET MYRST  = MYCONN.EXECUTE("GETUSERLIST",0,4) '最后一个参断含义同COMMANDTYPE
    SET MYCONN = NOTHING

'**通过RECORDSET对象调用存储进程**
    DIM MYRST
    SET MYRST = SERVER.CREATEOBJECT("ADODB.RECORDSET")
    MYRST.OPEN "GETUSERLIST",MYCONSTR,0,1,4
    'MYCONSTR是数据库连接字串,最后一个参断含义与COMMANDTYPE相同

2. 没有输入输出的存储进程
    请看以下存储进程:

/*SP2*/
    CREATE PROCEDURE DBO.DELUSERALL
    AS
    SET NOCOUNT ON
    BEGIN
       DELETE FROM DBO.[USERINFO]
    END
    GO

该存储进程删去USERINFO表中的所有记录,没有任何输入及输出,调用方法与上面讲过的基本相同,只是不用取得记录集:

'**通过COMMAND对象调用存储进程**
    DIM MYCOMM
    SET MYCOMM = SERVER.CREATEOBJECT("ADODB.COMMAND")
    MYCOMM.ACTIVECONNECTION = MYCONSTR          'MYCONSTR是数据库连接字串
    MYCOMM.COMMANDTEXT      = "DELUSERALL"      '指定存储进程名
    MYCOMM.COMMANDTYPE      = 4                 '表明这是一个存储进程
    MYCOMM.PREPARED         = TRUE              '要求将SQL命令先行编译
    MYCOMM.EXECUTE                              '此处不必再取得记录集
    SET MYCOMM = NOTHING

当然也可通过CONNECTION对象或RECORDSET对象调用此类存储进程,不过建立RECORDSET对象是为了取得记录集,在没有返回记录集的情况下,还是利用COMMAND对象吧。

3. 有返回值的存储进程
    在进行类似SP2的操作时,应充分利用SQL SERVER强大的事务处理功能,以维护数据的一致性。并且,我们可能需要存储进程返回执行情况,为此,将SP2修改如下:

/*SP3*/
    CREATE PROCEDURE DBO.DELUSERALL
    AS
    SET NOCOUNT ON
    BEGIN
       BEGIN TRANSACTION
       DELETE FROM DBO.[USERINFO]
       IF @@ERROR=0
          BEGIN
             COMMIT TRANSACTION
             RETURN 1
          END
       ELSE
          BEGIN
             ROLLBACK TRANSACTION
             RETURN 0
          END        
       RETURN
    END
    GO

以上存储进程,在DELETE顺利执行时,返回1,否则返回0,并进行回滚操作。为了在ASP中取得返回值,需要利用PARAMETERS集合来声明参数:

'**调用带有返回值的存储进程并取得返回值**
    DIM MYCOMM,MYPARA
    SET MYCOMM = SERVER.CREATEOBJECT("ADODB.COMMAND")
    MYCOMM.ACTIVECONNECTION = MYCONSTR         'MYCONSTR是数据库连接字串
    MYCOMM.COMMANDTEXT      = "DELUSERALL"      '指定存储进程名
    MYCOMM.COMMANDTYPE      = 4                 '表明这是一个存储进程
    MYCOMM.PREPARED         = TRUE              '要求将SQL命令先行编译
   '声明返回值
    SET MYPARA = MYCOMM.CREATEPARAMETER("RETURN",2,4)
    MYCOMM.PARAMETERS.APPEND MYPARA
    MYCOMM.EXECUTE
    '取得返回值
    DIM RETVALUE
    RETVALUE = MYCOMM(0)    '或RETVALUE = MYCOMM.PARAMETERS(0)
    SET MYCOMM = NOTHING

在MYCOMM.CREATEPARAMETER("RETURN",2,4)中,各参数的含义如下:
    第一个参数("RETURE")为参数名。参数名可以任意设定,但一般应与存储进程中声明的参数名相同。此处是返回值,我习气上设为"RETURE";
    第二个参数(2),表明该参数的数据类型,具体的类型代码请参阅ADO参考,以下给出常用的类型代码:
    ADBIGINT: 20 ;
    ADBINARY : 128 ;
    ADBOOLEAN: 11 ;
    ADCHAR: 129 ;
    ADDBTIMESTAMP: 135 ;
    ADEMPTY: 0 ;
    ADINTEGER: 3 ;
    ADSMALLINT: 2 ;
    ADTINYINT: 16 ;
    ADVARCHAR: 200 ;
    对于返回值,只能取整形,且-1到-99为保留值;
    第三个参数(4),表明参数的性质,此处4表明这是一个返回值。此参数取值的说明如下:
    0 : 类型无法确定; 1: 输入参数;2: 输入参数;3:输入或输出参数;4: 返回值

以上给出的ASP代码,应该说是完整的代码,也即最复杂的代码,其实

SET MYPARA = MYCOMM.CREATEPARAMETER("RETURN",2,4)
    MYCOMM.PARAMETERS.APPEND MYPARA

可以简化为

MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER("RETURN",2,4)

甚至还可以继续简化,稍后会做说明。
    对于带参数的存储进程,只能使用COMMAND对象调用(也有资料说可通过CONNECTION对象或RECORDSET对象调用,但我没有试成过)。
4. 有输入参数和输出参数的存储进程
    返回值其实是一种特殊的输出参数。在大多数情况下,我们用到的是同时有输入及输出参数的存储进程,比如我们想取得用户信息表中,某ID用户的用户名,这时候,有一个输入参数----用户ID,和一个输出参数----用户名。实现这一功能的存储进程如下:

/*SP4*/
    CREATE PROCEDURE DBO.GETUSERNAME
       @USERID INT,
       @USERNAME VARCHAR(40) OUTPUT
    AS
    SET NOCOUNT ON
    BEGIN
       IF @USERID IS NULL RETURN
       SELECT @USERNAME=USERNAME
           FROM DBO.[USERINFO]
           WHERE USERID=@USERID
       RETURN
    END
    GO

调用该存储进程的ASP代码如下:

'**调用带有输入输出参数的存储进程**
    DIM MYCOMM,USERID,USERNAME
    USERID = 1
    SET MYCOMM = SERVER.CREATEOBJECT("ADODB.COMMAND")
    MYCOMM.ACTIVECONNECTION = MYCONSTR          'MYCONSTR是数据库连接字串
    MYCOMM.COMMANDTEXT      = "GETUSERNAME"     '指定存储进程名
    MYCOMM.COMMANDTYPE      = 4                 '表明这是一个存储进程
    MYCOMM.PREPARED         = TRUE             '要求将SQL命令先行编译
    '声明参数
    MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER("@USERID",3,1,4,USERID)
    MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER("@USERNAME",200,2,40)
    MYCOMM.EXECUTE
    '取得出参
    USERNAME = MYCOMM(1)
    SET MYCOMM = NOTHING

在以上代码中,可以看到,与声明返回值不同,声明输入参数时需要5个参数,声明输出参数时需要4个参数。声明输入参数时5个参数分别为:参数名、参数数据类型、参数类型、数据长度、参数值。声明输出参数时,没有最后一个参数:参数值。
    需要特别注意的是:在声明参数时,顺序一定要与存储进程中定义的顺序相同,而且各参数的数据类型、长度也要与存储进程中定义的相同。
    如果存储进程有多个参数,ASP代码会显得繁琐,可以使用WITH命令简化代码:

'**调用带有输入输出参数的存储进程(简化代码)**
    DIM MYCOMM,USERID,USERNAME
    USERID = 1
    SET MYCOMM = SERVER.CREATEOBJECT("ADODB.COMMAND")
    WITH MYCOMM
       .ACTIVECONNECTION = MYCONSTR         'MYCONSTR是数据库连接字串
       .COMMANDTEXT      = "GETUSERNAME"     '指定存储进程名
       .COMMANDTYPE      = 4                 '表明这是一个存储进程
       .PREPARED         = TRUE              '要求将SQL命令先行编译
       .PARAMETERS.APPEND .CREATEPARAMETER("@USERID",3,1,4,USERID)
       .PARAMETERS.APPEND .CREATEPARAMETER("@USERNAME",200,2,40)
       .EXECUTE
    END WITH
    USERNAME = MYCOMM(1)
    SET MYCOMM = NOTHING

假如我们要取得ID为1到10,10位用户的用户名,是不是要创建10次COMMAND对象呢?不是的。如果需要多次调用同一存储进程,只需改变输入参数,就会得到不同的输出:

'**多次调用同一存储进程**
    DIM MYCOMM,USERID,USERNAME
    USERNAME = ""
    SET MYCOMM = SERVER.CREATEOBJECT("ADODB.COMMAND")
    FOR USERID = 1 TO 10
       WITH MYCOMM
          .ACTIVECONNECTION = MYCONSTR          'MYCONSTR是数据库连接字串
          .COMMANDTEXT      = "GETUSERNAME"     '指定存储进程名
          .COMMANDTYPE      = 4                 '表明这是一个存储进程
          .PREPARED         = TRUE              '要求将SQL命令先行编译
          IF USERID = 1 THEN
             .PARAMETERS.APPEND .CREATEPARAMETER("@USERID",3,1,4,USERID)
             .PARAMETERS.APPEND .CREATEPARAMETER("@USERNAME",200,2,40)
             .EXECUTE
          ELSE
             '重新给入参赋值(此时参数值不发生变化的入参以及出参不必重新声明)
             .PARAMETERS("@USERID") = USERID
             .EXECUTE
          END IF
       END WITH
       USERNAME = USERNAME + MYCOMM(1) + ","   '也许你喜欢用数组存储
    NEXT
    SET MYCOMM = NOTHING

通过以上代码可以看出:重复调用同一存储进程时,只需为值发生改变的输入参数重新赋值即可,这一方法在有多个输入输出参数,且每次调用时只有一个输入参数的值发生变化时,可以大大减少代码量。

5. 同时具有返回值、输入参数、输出参数的存储进程
    前面说过,在调用存储进程时,声明参数的顺序要与存储进程中定义的顺序相同。还有一点要特别注意:如果存储进程同时具有返回值以及输入、输出参数,返回值要最先声明。
    为了演示这种情况下的调用方法,我们改善一下上面的例子。还是取得ID为1的用户的用户名,但是有可能该用户不具有(该用户已删除,而USERID是自增长的字段)。存储进程根据用户具有与否,返回不同的值。此时,存储进程和ASP代码如下:

/*SP5*/
    CREATE PROCEDURE DBO.GETUSERNAME
       --为了加深对"顺序"的印象,将以下两参数的定义顺序颠倒一下
       @USERNAME VARCHAR(40) OUTPUT,
       @USERID INT
    AS
    SET NOCOUNT ON
    BEGIN
       IF @USERID IS NULL RETURN
       SELECT @USERNAME=USERNAME
           FROM DBO.[USERINFO]
           WHERE USERID=@USERID
       IF @@ROWCOUNT>0
          RETURN 1
       ELSE
          RETURN 0
       RETURN
    END
    GO

'**调用同时具有返回值、输入参数、输出参数的存储进程**
    DIM MYCOMM,USERID,USERNAME
    USERID = 1
    SET MYCOMM = SERVER.CREATEOBJECT("ADODB.COMMAND")
    WITH MYCOMM
       .ACTIVECONNECTION = MYCONSTR          'MYCONSTR是数据库连接字串
       .COMMANDTEXT      = "GETUSERNAME"     '指定存储进程名
       .COMMANDTYPE      = 4                 '表明这是一个存储进程
       .PREPARED         = TRUE              '要求将SQL命令先行编译
       '返回值要最先被声明
       .PARAMETERS.APPEND .CREATEPARAMETER("RETURN",2,4)
       '以下两参数的声明顺序也做相应颠倒
       .PARAMETERS.APPEND .CREATEPARAMETER("@USERNAME",200,2,40)
       .PARAMETERS.APPEND .CREATEPARAMETER("@USERID",3,1,4,USERID)
       .EXECUTE
    END WITH
    IF MYCOMM(0) = 1 THEN
       USERNAME = MYCOMM(1)
    ELSE
       USERNAME = "该用户不具有"
    END IF
    SET MYCOMM = NOTHING
6. 同时返回参数和记录集的存储进程
    有时候,我们需要存储进程同时返回参数和记录集,比如在利用存储进程分页时,要同时返回记录集以及数据总量等参数。以下给出一个进行分页处理的存储进程:

/*SP6*/
    CREATE PROCEDURE DBO.GETUSERLIST
       @IPAGECOUNT INT OUTPUT,   --总页数
       @IPAGE INT,               --当前页号
       @IPAGESIZE INT            --每页记录数
    AS
    SET NOCOUNT ON
    BEGIN
       --创建临时表
       CREATE TABLE #T (ID INT IDENTITY,   --自增字段
                        USERID INT,
                        USERNAME VARCHAR(40))
       --向临时表中写入数据
       INSERT INTO #T
          SELECT USERID,USERNAME FROM DBO.[USERINFO]
             ORDER BY USERID

--取得记录总数
       DECLARE @IRECORDCOUNT INT
       SET @IRECORDCOUNT = @@ROWCOUNT

--确定总页数
       IF @IRECORDCOUNT%@IPAGESIZE=0
          SET @IPAGECOUNT=CEILING(@IRECORDCOUNT/@IPAGESIZE)
       ELSE
          SET @IPAGECOUNT=CEILING(@IRECORDCOUNT/@IPAGESIZE)+1

--若请求的页号大于总页数,则显示最后一页
       IF @IPAGE > @IPAGECOUNT
          SELECT @IPAGE = @IPAGECOUNT

--确定当前页的始末记录
       DECLARE @ISTART INT    --START RECORD
       DECLARE @IEND INT      --END RECORD
       SELECT @ISTART = (@IPAGE - 1) * @IPAGESIZE
       SELECT @IEND = @ISTART + @IPAGESIZE + 1

--取当前页记录    
       SELECT * FROM #T WHERE ID>@ISTART AND ID<@IEND

--删除临时表
       DROP TABLE #T

--返回记录总数
       RETURN @IRECORDCOUNT
    END
    GO

在上面的存储进程中,输入当前页号及每页记录数,返回当前页的记录集,总页数及记录总数。为了更具典型性,将记录总数以返回值的形式返回。以下是调用该存储进程的ASP代码(具体的分页操作略去):

'**调用分页存储进程**
    DIM PAGENOW,PAGESIZE,PAGECOUNT,RECORDCOUNT
    DIM MYCOMM,MYRST
    PAGENOW = REQUEST("PN")
    '自定义函数用于验证自然数
    IF CHECKNAR(PAGENOW) = FALSE THEN PAGENOW = 1
    PAGESIZE = 20
    SET MYCOMM = SERVER.CREATEOBJECT("ADODB.COMMAND")
    WITH MYCOMM
       .ACTIVECONNECTION = MYCONSTR         'MYCONSTR是数据库连接字串
       .COMMANDTEXT      = "GETUSERLIST"     '指定存储进程名
       .COMMANDTYPE      = 4                 '表明这是一个存储进程
       .PREPARED         = TRUE             '要求将SQL命令先行编译
       '返回值(记录总量)
       .PARAMETERS.APPEND .CREATEPARAMETER("RETURN",2,4)
       '出参(总页数)
       .PARAMETERS.APPEND .CREATEPARAMETER("@IPAGECOUNT",3,2)
       '入参(当前页号)
       .PARAMETERS.APPEND .CREATEPARAMETER("@IPAGE",3,1,4,PAGENOW)
       '入参(每页记录数)
       .PARAMETERS.APPEND .CREATEPARAMETER("@IPAGESIZE",3,1,4,PAGESIZE)
       SET MYRST = .EXECUTE
    END WITH
    IF MYRST.STATE = 0 THEN        '未取到数据,MYRST关闭
       RECORDCOUNT = -1
    ELSE
       MYRST.CLOSE    '注意:若要取得参数值,需先关闭记录集对象
       RECORDCOUNT = MYCOMM(0)
       PAGECOUNT   = MYCOMM(1)
       IF CINT(PAGENOW)>=CINT(PAGECOUNT) THEN PAGENOW=PAGECOUNT
    END IF
    SET MYCOMM = NOTHING

'以下显示记录
    IF RECORDCOUNT = 0 THEN
       RESPONSE.WRITE "无记录"
    ELSEIF RECORDCOUNT > 0 THEN
       MYRST.OPEN
       DO UNTIL MYRST.EOF
       ......
       LOOP
       '以下显示分页信息
       ......
    ELSE  'RECORDCOUNT=-1
       RESPONSE.WRITE "参数错误"
    END IF

对于以上代码,只有一点需要说明:同时返回记录集和参数时,若要取得参数,需先将记录集关闭,使用记录集时再将其打开。

7. 返回多个记录集的存储进程
    本文最先介绍的是返回记录集的存储进程。有时候,需要一个存储进程返回多个记录集,在ASP中,如何同时取得这些记录集呢?为了说明这一问题,在USERINFO表中增加两个字段:USERTEL及USERMAIL,并设定只有登录用户可以查看这两项内容。

/*SP7*/
    CREATE PROCEDURE DBO.GETUSERINFO
       @USERID INT,
       @CHECKLOGIN BIT
    AS
    SET NOCOUNT ON
    BEGIN
       IF @USERID IS NULL OR @CHECKLOGIN IS NULL RETURN
       SELECT USERNAME
          FROM DBO.[USRINFO]
          WHERE USERID=@USERID
       --若为登录用户,取USERTEL及USERMAIL
       IF @CHECKLOGIN=1
          SELECT USERTEL,USERMAIL
             FROM DBO.[USERINFO]
             WHERE USERID=@USERID
       RETURN
    END
    GO

以下是ASP代码:

'**调用返回多个记录集的存储进程**
    DIM CHECKLG,USERID,USERNAME,USERTEL,USERMAIL
    DIM MYCOMM,MYRST
    USERID = 1
    'CHECKLOGIN()为自定义函数,判断访问者是否登录
    CHECKLG = CHECKLOGIN()
    SET MYCOMM = SERVER.CREATEOBJECT("ADODB.COMMAND")
    WITH MYCOMM
       .ACTIVECONNECTION = MYCONSTR         'MYCONSTR是数据库连接字串
       .COMMANDTEXT      = "GETUSERINFO"     '指定存储进程名
       .COMMANDTYPE      = 4                 '表明这是一个存储进程
       .PREPARED         = TRUE              '要求将SQL命令先行编译
       .PARAMETERS.APPEND .CREATEPARAMETER("@USERID",3,1,4,USERID)
       .PARAMETERS.APPEND .CREATEPARAMETER("@CHECKLOGIN",11,1,1,CHECKLG)
       SET MYRST = .EXECUTE
    END WITH
    SET MYCOMM = NOTHING

'从第一个记录集中取值
    USERNAME = MYRST(0)
    '从第二个记录集中取值
    IF NOT MYRST IS NOTHING THEN
       SET MYRST = MYRST.NEXTRECORDSET()
       USERTEL  = MYRST(0)
       USERMAIL = MYRST(1)
    END IF
    SET MYRST = NOTHING

以上代码中,利用RECORDSET对象的NEXTRECORDSET方法,取得了存储进程返回的多个记录集。

至此,针对ASP调用存储进程的各种情况,本文已做了较为全面的说明。最后说一下在一个ASP程序中,调用多个存储进程的不同方法。
    在一个ASP程序中,调用多个存储进程至少有以下三种方法是可行的:
    1. 创建多个COMMAND对象

DIM MYCOMM
    SET MYCOMM = SERVER.CREATEOBJECT("ADODB.COMMAND")
    '调用存储进程一
    ......
    SET MYCOMM = NOTHING
    SET MYCOMM = SERVER.CREATEOBJECT("ADODB.COMMAND")
   '调用存储进程二
    ......
    SET MYCOMM = NOTHING
    ......

2. 只创建一个COMMAND对象,结束一次调用时,清除其参数

DIM MYCOMM
    SET MYCOMM = SERVER.CREATEOBJECT("ADODB.COMMAND")
   '调用存储进程一
    .....
    '清除参数(假设有三个参数)
    MYCOMM.PARAMETERS.DELETE 2
    MYCOMM.PARAMETERS.DELETE 1
    MYCOMM.PARAMETERS.DELETE 0
   '调用存储进程二并清除参数
    ......
    SET MYCOMM = NOTHING

此时要注意:清除参数的顺序与参数声明的顺序相反,原因嘛,我也不知道。

3. 利用PARAMETERS数据集合的REFRESH方法重置PARAMETER对象

DIM MYCOMM
    SET MYCOMM = SERVER.CREATEOBJECT("ADODB.COMMAND")
    '调用存储进程一
    .....
   '重置PARAMETERS数据集合中包含的所有PARAMETER对象
    MYCOMM.PARAMETERS.REFRESH
   '调用存储进程二
    .....
    SET MYCOMM = NOTHING

一般以为,重复创建对象是效率较低的一种方法,但是经测试(测试工具为MICROSOFT APPLICATION CENTER TEST),结果出人意料:
    方法2 >= 方法1 >> 方法3
    方法2的运行速度大于等于方法1(最多可高4%左右),这两种方法的运行速度远大于方法3(最多竟高达130%),所以建议在参数多时,采用方法1,在参数较少时,采用方法2。

花了一天的时间,终于把我对于在ASP中调用存储进程的一些粗浅的经验形成了文字。这其中,有些是我只知其果而不明其因的,有些可能是错误的,但是,这些都是经过我亲身实践的。各位看官批判地接受吧。有不同意见,希望一定向我指明,先谢了.

(0)

相关推荐

  • ASP程序与SQL存储过程结合使用详解

    定义总是很抽象.存储进程其实就是能完成一定操作的一组SQL语句,只不过这组语句是放在数据库中的(这里我们只谈SQL SERVER).如果我们通过创建存储进程以及在ASP中调用存储进程,就可以避免将SQL语句同ASP代码混杂在一起.这样做的好处至少有三个:    第一.大大提高效率.存储进程本身的执行速度非常快,而且,调用存储进程可以大大减少同数据库的交互次数.    第二.提高安全性.假如将SQL语句混合在ASP代码中,一旦代码失密,同时也就意味着库结构失密.    第三.有利于SQL语句的重用

  • Oracle数据库创建存储过程的示例详解

    1.1,Oracle存储过程简介: 存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作, 减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的. 优点: 允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次. 允许更快执行,如果某操作需要执行大量SQL语句或重复执行,存储过程比SQL语句执行的要快. 减少网络流量,例如一个需要数百行的SQL代码的操作有一条执行语句完成,不需要在网络中发送数百行代

  • Java java.sql.Timestamp时间戳案例详解

    java.sql.Timestamp(时间戳) 继承父类:java.util.Date 所有已实现的接口:Serializable, Cloneable, Comparable<Date>  主要构造方法:Timestamp(long millis) 使用毫秒时间值构造 Timestamp 对象. Timestamp允许 JDBC API 将该类标识为 SQL TIMESTAMP 值.它通过允许小数秒到纳秒级精度的规范来添加保存 SQLTIMESTAMP 小数秒值的能力. Timestamp

  • mysql创建存储过程及函数详解

    目录 1. 存储过程 1.1. 基本语法 1.2 创建一个指定执行权限的存储过程 1.3 DELIMITER 的使用 2. 创建函数  1. 存储过程 1.1. 基本语法 create procedure name ([params]) UNSIGNED [characteristics] routine_body  params : in|out|inout 指定参数列表 代表输入与输出 routine_body: SQL代码内容,以begin ........   end character

  • MySQL存储过程及语法详解

    目录 1. 存储过程基本用法 1.1 概念 1.2 创建存储过程 1.2.1 语法格式 2.2.2 语法介绍 1.3 调用存储过程 1.4 查看存储过程 1.5 删除存储过程 2. 存储过程中的语法结构 2.1 变量的声明以及赋值 2.1.1 DECLARE 声明变量 2.1.2 SET 变量赋值 2.1.3 select...into 赋值 2.2 条件判断 2.2.1 if条件判断 2.3 传递参数 2.3.1 IN - 输入参数 2.3.2 out - 输出参数 2.4 case 结构 2

  • SpringBoot集成P6Spy实现SQL日志的记录详解

    目录 P6Spy简介 应用场景 pom application.yml entity Mapper 启动类 测试类 P6Spy入门使用 spy.properties P6SPYConfig application.yml P6Spy简介 P6Spy是一个可以用来在应用程序中拦截和修改数据操作语句的开源框架. 通过P6Spy可以对SQL语句进行拦截,相当于一个SQL语句的记录器,这样我们可以用它来作相关的分析,比如性能分析. 应用场景 pom <dependencies> <depende

  • [译]ASP.NET Core 2.0 路由引擎详解

    本文介绍了ASP.NET Core 2.0 路由引擎详解,分享给大家,具体如下: 问题 ASP.NET Core 2.0的路由引擎是如何工作的? 答案 创建一个空项目,为Startup类添加MVC服务和请求中间件: public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvir

  • Asp.net MVC scheduler的实现方法详解

    Asp.net MVC scheduler的实现方法详解 本例使用了fullcalendar js : https://fullcalendar.io/ 1. view : @{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } @section PageContent{ <style> .modal-backdrop { z-index: 9; } </sty

  • mysql数据存储过程参数实例详解

    MySQL 存储过程参数有三种类型:in.out.inout.它们各有什么作用和特点呢? 一.MySQL 存储过程参数(in) MySQL 存储过程 "in" 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改此参数,但对 in 类型参数的修改,对调用者(caller)来说是不可见的(not visible). drop procedure if exists pr_param_in; create procedure pr_param_in ( in id

  • 微信小程序开发图片拖拽实例详解

    微信小程序开发图片拖拽实例详解 1.编写页面结构:moveimg.wxml <view class="container"> <view class="cnt"> <image class="image-style" src="../uploads/foods.jpg" style="left:{{ballleft}}px;width:{{screenWidth}}px" bi

随机推荐