ASP程序与SQL存储过程结合使用详解
存储进程是数据库中的一种特殊对象,它包含了可执行的SQL命令集合。这些命令集合被存储在数据库中,作为独立的可执行对象存在。当我们谈论SQL SERVER时,存储进程扮演着非常重要的角色。通过创建和调用存储进程,我们可以避免将SQL语句与ASP代码混杂在一起,从而提高开发效率、安全性和SQL语句的重用性。
存储进程能显著提高执行效率。存储过程在首次执行时会被编译并存储在数据库中,后续的调用可以直接执行已编译的代码,无需再次和编译,从而大大提高了执行速度。通过调用存储过程,可以减少与数据库的交互次数,进一步提高了效率。
存储过程可以提高安全性。如果将SQL语句直接写在ASP代码中,一旦代码泄露,数据库的结构和数据也将面临风险。而存储过程可以将SQL语句封装在数据库中,只有经过授权的用户才能访问和调用,从而保护数据的安全性。
在ASP中,我们可以通过COMMAND对象来调用存储过程。根据不同的输入输出情况,可以对存储过程进行分类。例如,对于只返回单一记录集的存储过程,我们可以通过以下方式调用:
假设有一个名为“GETUSERLIST”的存储过程,它用于获取USERINFO表中的所有记录并返回一个记录集。以下是使用ASP代码通过COMMAND对象调用该存储过程的示例:
```vbscript
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
```
通过这段代码,我们可以调用名为“GETUSERLIST”的存储过程,并将返回的记录集赋值给MYRST对象。接下来,我们可以对MYRST对象进行各种操作,如遍历记录集、更新数据等。
在技术领域里,我们经常会遇到各种各样的指令与代码。其中,COMMANDTYPE属性就像是一个指示牌,告诉我们请求的类型是什么。它的取值有着明确的说明:
当值为-1时,表明我们不能确定COMMANDTEXT参数的类型。
当值为1时,表明COMMANDTEXT是一个普通的命令类型。
当值为2时,表示COMMANDTEXT参数是一个表名称。
当值为4时,表示COMMANDTEXT参数是一个存储过程的名称。
存储过程,是数据库中的一段可重复使用的控制逻辑。我们可以通过CONNECTION对象或RECORDSET对象来调用它。让我们看一下具体的操作方式:
想象一下,你正在使用ADODB.CONNECTION对象与数据库进行交互。你创建了一个连接对象MYCONN,并打开了数据库连接MYCONSTR。接着,你使用MYCONN.EXECUTE方法执行了一个名为“GETUSERLIST”的存储过程,并传递了COMMANDTYPE的值4。这是通过CONNECTION对象调用存储过程的方式。
另一方面,你也可以通过RECORDSET对象来调用存储过程。你创建一个RECORDSET对象MYRST,然后调用它的OPEN方法,传入存储过程的名称和数据库连接字符串MYCONSTR,以及其他相关参数。这是另一种调用存储过程的方式。
并非所有的存储过程都有输入输出。例如,有一个名为DELUSERALL的存储过程,它的作用就是删除USERINFO表中的所有记录。这个存储过程没有任何输入和输出参数,我们在调用它时,不需要取得记录集。我们可以通过创建ADODB.COMMAND对象来调用它,设置其ACTIVECONNECTION为数据库连接字符串MYCONSTR,指定存储过程名为DELUSERALL,并设置COMMANDTYPE为4,表明这是一个存储过程。然后调用它的EXECUTE方法执行这个存储过程。
在有返回值的情况下,我们应该充分利用SQL SERVER强大的事务处理功能来维护数据的一致性。事务可以确保数据的完整性,让我们在处理类似SP2的操作时更加安心。在进行这类操作时,我们可以根据实际情况选择合适的调用方式,通过CONNECTION对象或RECORDSET对象来取得我们需要的返回值。
关于存储进程的修改与调用,我们可能需要存储进程返回的执行情况。为此,我们对SP2进行了相应的调整。
调整后的存储过程是这样的:在删除用户信息表中的数据的存储过程(DELUSERALL)中,如果删除操作成功,则返回1;否则返回0,并回滚事务。这一设计确保了数据的安全性和完整性。为了在ASP环境中获取这个返回值,我们需要使用带有参数的命令对象来声明参数。以下是详细的调用过程:
创建一个命令对象(MYCOMM),并设置其活动连接为数据库连接字符串(MYCONSTR)。然后,指定要执行的存储过程名(DELUSERALL),并声明这是一个存储过程。接着,我们需要预先编译SQL命令。声明一个返回值参数(MYPARA),命名为“RETURN”,数据类型选择整数(ADINTEGER),性质为返回值。然后,执行命令对象,并取得返回值(RETVALUE)。释放命令对象。值得注意的是,对于返回值参数,我们只能选择整数类型,并且-1到-99是保留值。
在实际应用中,我们可以简化上述代码。例如,创建参数并添加到参数集合的过程可以简化为一步完成。具体的简化代码如下:
对于带有参数的存储进程,我们只能使用COMMAND对象来调用它。这是因为COMMAND对象专门用于执行SQL命令和存储过程,并能处理输入和输出参数。而连接对象(CONNECTION)和记录集对象(RECORDSET)主要用于数据库连接和数据操作,不太适合处理带参数的存储过程。除了返回值,存储过程还可以有输入参数和输出参数。这是一种强大的数据库操作方式,能够让我们对数据库进行更精细的控制。
在数据库操作中,我们经常使用带有输入和输出参数的存储进程来获取特定信息。比如,当我们想从用户信息表中获取某个特定ID对应的用户名时,就需要用到这样的存储进程。这个存储进程以用户ID作为输入,返回对应的用户名。下面是一个创建此类存储进程的示例。
示例存储过程 `/SP4/CREATE PROCEDURE DBO.GETUSERNAME`:
这个存储过程有两个参数,一个输入参数`@USERID INT`和一个输出参数`@USERNAME VARCHAR(40) OUTPUT`。过程首先检查用户ID是否为空,如果为空则直接返回。如果不为空,则从用户信息表中选取对应的用户名并赋值给输出参数。
在ASP中调用这个存储过程的代码示例:
在这段ASP代码中,我们首先创建一个命令对象`MYCOMM`,然后设置其活动连接为数据库连接字符串`MYCONSTR`。接着,我们指定要执行的存储过程名为`GETUSERNAME`,并声明输入和输出参数。输入参数`@USERID`被赋值为1。之后,我们执行命令并获取输出参数`@USERNAME`的值。
值得注意的是,在声明参数时,我们需要遵循存储过程中定义的参数类型和顺序。对于输出参数,我们不需要提供参数值,因为存储过程会将其设置为返回的值。
如果我们需要为多个用户ID获取用户名,可以使用循环结构来多次调用这个存储过程,而不需要为每个用户ID创建新的命令对象。这样可以简化代码并提高效率。使用WITH语句可以进一步简化代码,使代码更加整洁和易于阅读。
通过存储过程和ASP的结合使用,我们可以方便地获取数据库中的信息,并通过简单的代码实现复杂的功能。这种结合使用的方式不仅提高了开发效率,也提高了代码的可读性和可维护性。多次调用同一存储进程:参数赋新的生命
在数字世界中,有时我们需要重复调用相同的存储过程,而每次调用都需要对输入参数进行微调。这个过程似乎给参数赋予了新的生命,让它们根据不同的场景展现出不同的结果。
想象一下这样一个场景,你拥有一个存储过程,它接收用户ID并返回相应的用户名。在程序中,你需要为多个用户获取用户名。这时,你可以多次调用这个存储过程,每次只需改变输入的用户ID。
让我们深入代码的世界,看看这是如何实现的:
你创建了一个名为MYCOMM的ADODB.COMMAND对象。接着,为了与数据库建立连接,你设置了ACTIVECONNECTION属性并指定了数据库连接字符串MYCONSTR。然后,你指定了要调用的存储过程的名称“GETUSERNAME”,并明确了这是一个存储过程而不是SQL语句。你还要求SQL命令先行编译。
当你开始循环并为每个用户ID调用此过程时,对于第一个用户ID(在这个例子中为USERID = 1),你需要为输入参数(如@USERID和@USERNAME)设置初始值。随后执行的存储过程将根据你的输入返回相应的用户名。而对于后续的调用(当USERID的值改变时),你只需重新为输入参数赋值即可,无需重新声明或初始化那些值不变的参数。这是因为存储过程内部已经保存了这些参数的状态。这是一个非常高效的方法,特别是当你有多个输入输出参数并且每次调用只有一个输入参数发生变化时。
还要特别注意存储过程的返回值以及输入、输出参数的声明顺序。在调用过程中,返回值的声明总是位于最前面。这是因为返回值是存储过程执行完毕后的第一个输出值,它告诉我们存储过程是否成功执行以及可能的错误信息等。例如,我们改善的例子中展示了一个具有返回值的存储过程。该存储过程可能根据用户的存在与否返回不同的值。当我们尝试获取ID为特定值的用户的用户名时,如果该用户不存在(可能是用户已被删除),存储过程将返回特定的指示值或错误代码。这使我们能够在实际应用中做出相应的响应和处理。
在数据库的世界里,存储进程是一种强大的工具,它们能够执行一系列的操作,并返回结果。下面是一个关于获取用户名的存储过程示例,并附带ASP代码来调用它。
存储过程名为“GETUSERNAME”,设计用来根据提供的用户ID查找对应的用户名。这个过程首先检查用户ID是否为空,如果为空则立即返回。接着,它会查询数据库中的用户信息表,找出与给定用户ID匹配的用户名。如果找到了匹配项,则返回1,否则返回0。这个过程非常直观明了。
在ASP代码中,我们首先创建一个命令对象来调用这个存储过程。我们声明了输入参数(用户ID)和输出参数(用户名),并指定了存储过程的名称。我们还指定了数据库的连接字符串和参数的类型。在执行存储过程后,我们检查返回值来确定是否找到了匹配的用户名。如果找到了,我们将用户名存储在变量中;如果没有找到,我们将变量设置为“该用户不具有”。我们清理资源并结束操作。
有时候我们的存储过程可能需要返回参数和记录集。例如,当我们使用存储过程进行分页操作时,除了返回当前页面的记录集外,还需要返回数据总量等参数。这种功能使得存储过程更加灵活和强大,能够应对各种复杂的业务需求。
在数据库SP6环境中,我们创建了一个名为DBO.GETUSERLIST的存储过程,它专门用于获取用户列表。通过调用此过程,您可以方便地获取特定页面的用户数据,总页数以及总的记录数。
此存储过程接受三个参数:总页数(@IPAGECOUNT),当前页号(@IPAGE)和每页记录数(@IPAGESIZE)。让我们逐一这些参数的使用方式和存储过程的运行流程。
我们关闭了计数返回状态(SET NOCOUNT ON),这是为了阻止SQL Server在执行查询后返回结果集中的行数。接下来,我们创建一个临时表T,用于存储从用户信息表DBO.[USERINFO]中选取的用户数据。这个临时表包含自增字段ID,用户ID和用户名。
确定总页数的过程是一个简单的数学计算。如果记录总数可以被每页记录数整除,那么总页数就是记录总数除以每页记录数的商。否则,总页数就是记录总数除以每页记录数的商加1。这是为了确保无论记录总数的数量如何,我们都能得到完整的页面数据。
然后,我们检查请求的页号是否大于总页数。如果是,我们将请求的页号设置为总页数,以确保我们的查询始终有效。接下来,我们确定当前页的始末记录号,这是为了从临时表中选取特定页面的数据。这个过程涉及到简单的数学计算和对SQL语句的巧妙运用。
然后我们从临时表T中选取当前页面的用户数据。这些数据是基于我们在之前步骤中计算出的始末记录号得到的。我们删除临时表并返回记录总数。这样,调用此存储过程的用户不仅可以获取当前页面的用户数据,还可以知道总的记录数。
在ASP中,分页展示数据是一种常见需求,而这背后通常依赖于存储过程来实现。让我们先看一下如何调用分页存储过程以获取并展示数据。在这个过程中,我们首先通过用户请求获取当前页码(`PAGENOW`)。如果请求中没有提供有效的页码(即不是自然数),则默认设置为第一页。每页显示的记录数设定为20条(`PAGESIZE`)。
创建一个数据库命令对象(`MYCOMM`),并设置其属性以连接到数据库和指定要执行的存储过程。这个存储过程名为“GETUSERLIST”,用于获取用户列表。我们为存储过程设置参数,包括返回记录总数(`RETURN`)、总页数(`@IPAGECOUNT`)、当前页码(`@IPAGE`)和每页记录数(`@IPAGESIZE`)。执行存储过程后,通过返回的记录集(`MYRST`)处理数据。
如果没有取到数据,记录计数(`RECORDCOUNT`)设为-1。如果取到数据,关闭记录集以获取参数值,包括总记录数和总页数。如果请求的页码超出总页数,将其调整为总页数。然后重新打开记录集以展示数据。
在展示数据时,首先检查记录计数。如果没有记录,提示“无记录”。如果有记录,则打开记录集并循环展示每条记录的内容。还需要展示分页信息。如果记录计数为-1,提示“参数错误”。在此过程中需要注意的是,在取得参数值后需要关闭记录集,使用时再重新打开。
SP7 - 获取用户信息的存储过程
为了获取特定用户的详细信息,我们创建了一个名为`GETUSERINFO`的存储过程。此过程接受两个参数:用户ID(`@USERID`)和登录检查标志(`@CHECKLOGIN`)。
当调用此过程时,首先检查这两个参数是否为空。如果任何一个参数为空,过程将立即返回,不执行任何操作。
如果提供了有效的用户ID,过程将从`DBO.[USRINFO]`表中选择用户名(`USERNAME`)。这是通过查询数据库并匹配提供的用户ID来实现的。
接下来,如果登录检查标志(`@CHECKLOGIN`)设置为1,表示我们正在为已登录的用户检索信息,过程将返回用户的电话(`USERTEL`)和电子邮件(`USERMAIL`)信息。这些信息是从`DBO.[USERINFO]`表中获取的,同样是通过匹配用户ID来检索。
ASP代码的执行
在ASP代码中,我们首先定义了一些变量来存储用户信息。然后,我们创建了一个ADODB.COMMAND对象来与数据库交互。我们将数据库连接字符串赋值给`MYCONSTR`,并创建一个指向存储过程`GETUSERINFO`的命令。
我们设置了命令类型为存储过程,并要求先编译SQL命令。然后,我们添加了两个参数到命令中:用户ID和登录检查标志。这些参数的值是根据访问者的状态和我们的需求动态设置的。
执行命令后,我们得到一个记录集对象`MYRST`。通过此对象,我们可以访问存储过程返回的数据。使用`NEXTRECORDSET`方法,我们可以遍历多个记录集,从而获取用户的所有相关信息。
从第一个记录集中,我们可以获取用户名。从第二个记录集中,我们可以获取用户的电话和电子邮件信息。这些值被存储在先前定义的变量中。
总结
通过这种方式,我们在ASP程序中成功地调用了存储过程并处理了返回的多条记录。这对于需要从数据库获取复杂信息的网站来说是非常有用的。通过存储过程,我们可以封装复杂的查询逻辑,使ASP代码更加简洁和高效。使用记录集对象处理返回的数据,使我们能够灵活地提取和显示所需的信息。这种结合ASP和存储过程的方法为Web应用程序提供了强大的数据处理能力。在ASP程序中,调用多个存储过程可以通过以下三种方法实现,每种方法都有其独特的优势和适用场景。
方法一:创建多个COMMAND对象
在ASP中,我们可以通过创建多个ADODB.COMMAND对象来分别调用不同的存储过程。每个COMMAND对象都可以独立地设置参数和执行存储过程。这种方法虽然简单直接,但在存储过程参数较多时,可能会带来一定的性能开销。
方法二:重用COMMAND对象,清除参数后重新使用
这种方法只需要创建一个COMMAND对象,在调用完一个存储过程后,清除其参数,然后再次使用该对象调用另一个存储过程。这样做的好处是减少了对象的创建和销毁带来的开销,提高了性能。但需要注意的是,清除参数的顺序必须与参数声明的顺序相反,具体原因尚未明确。
方法三:使用PARAMETERS数据集合的REFRESH方法重置参数
这种方法也是重用COMMAND对象,但在调用不同存储过程之间,使用PARAMETERS数据集合的REFRESH方法来重置其中包含的所有参数对象。这种方法相对复杂一些,但在某些情况下,可以提高性能和资源利用率。
经过实际测试(使用MICROSOFT APPLICATION CENTER TEST工具),在参数较多的情况下,方法2和方法1的性能相近,且都优于方法3。方法2的运行速度最多可高出方法1约4%,而相对于方法3,其性能提升更为显著,最多可达130%。当存储过程参数较多时,推荐使用方法1;参数较少时,可以选择使用方法2。
以上是我对ASP中调用存储过程的一些实践经验总结。这些经验可能有些知其然而不知其所以然的地方,也可能存在错误之处。欢迎各位同行提出宝贵意见和批评,共同交流学习。在此先表示感谢。毕竟,我的目标是通过分享和交流,共同提高我们的技术水平和能力。
长沙网站设计
- ASP程序与SQL存储过程结合使用详解
- ASP.NET MVC5 网站开发框架模型、数据存储、业务逻
- 思域油耗
- angular2 ng2 @input和@output理解及示例
- 深入分析Javascript事件代理
- 微信小程序实现页面下拉刷新和上拉加载功能详
- php读取本地文件常用函数(fopen与file_get_contents)
- javascript 内置对象及常见API详细介绍
- 微信小程序商城项目之淘宝分类入口(2)
- 佟丽娅:女性魅力的独特展现
- 微信小程序列表中item左滑删除功能
- Linux环境下mysql5.7.13安装教程
- JS针对Array的各种操作汇总
- jQuery实现可移动选项的左右下拉列表示例
- 微信公众号OAuth2.0网页授权问题浅析
- 吉沢明歩:如何获取其歌曲全集及欣赏指南