正在加载...

转一份ASP与存储过程教程

in 沉思录 | 没有评论

    存储过程其实就是能完成一定操作的一组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对象调用,但我没有试成过)。

关键字: ,

ASP不是简单、低能的代名词

in 沉思录 | 仅一条评论

很多人错误地认为ASP是简单、低效的代名词,认为ASP是低能的,不足挂齿的,也很简单,一学就会,一琢磨就精通。

有人讲ASP不安全,写ASP的程序的时候如果严格按照书写安全的代码的规范去写,写出来的程序也没有什么理由不安全。那些人说ASP不安全,好像PHP、JSP的程序就不会出现SQL Injection似的。

有人讲ASP不高效,真的想要高效的话你可以结合COM,在Win32平台下COM的效率Java是永远追不上的。单纯讲速度有什么意义呢?Java的速度绝对算不上高,论速度的话好多技术方案的速度都比Java高,这一点学Java的人最清楚了,可是谁在乎过这一点了?Java的胜出绝对不是因为它的速度。抛开具体的应用环境单纯地讲速度是不理性的。

有人讲ASP这个不能做,那个做不了,功能很局限。其实只要你明白Web的原理的话你就会明白,写ASP程序表面看是在玩一种脚本语言, 完整内容...

关键字: ,,,,,,

用GetString让ASP速度倍增

in 沉思录 | 没有评论

许多ASP程序员都有过执行数据库查询,然后将查询结果用HTML表格的形式显示出来的经历。通常我们应该是这么做的: 

<%
'Create connection / recordset
'Populate data into recordset object
%>
<TABLE>
<% Do While not rs.EOF %>
<TR>
<TD ><%=rs("Field1")% ></TD>
<TD ><%=rs("Field2")% ></TD>
.
</TR>
<% rs.MoveNext
Loop %>
</TABLE>

如果查询结果很多,服务器解释你的ASP script将花费大量的时间,因为有许多的Response.Write语句要处理. 如果你将输出的全部结果放在一个很长的字符串里(从<TABLE >到</TABLE >),那么服务器只需解释一遍Response.Write语句,速度就会快得多 . 微软公司里的一些能干的家伙已经将想法变成了现实. (注意,这是一个ADO 2.0以上才有 的特性. 如果你还在使用以前版本的话,请升级到最新版) 完整内容...

关键字:

目前唯一正确的 Windows Server 2008 IIS 7.0下配置php,MySQL,Zend,phpMyadmin图解教程

in 沉思录 | 没有评论

首先确认你已经把一下程序下载完毕
mysql-5.0.41-win32、phpMyAdmin-2.11.3、ZendOptimizer-3.3.0a、php-5.2.5-Win32
首先把php的压缩包解压到E盘,例如E:php            (也可以是其他盘符,个人喜好而已)
1、IIS 管理器主界面

2、配置ISAPI筛选器
打开站点的ISAPI筛选器,添加一个筛选器.
筛选器名称为php,可执行文件路径为F:phpphp5isapi.dll

3、配置处理程序映射
添加脚本映射
请求路径为*.php,可执行文件路径为F:phpphp5isapi.dll,名称为php

4、配置应用程序池
添加应用程序池
名称为php,  .NET Framework 版本选”无托管代码”,托管通道模式选”经典”

5、更改站点应用池
选择应用程序池为刚刚所建立的php应用池

6、添加默认文档
添加名称为index.php的文档

7、配置php.ini
更改F:php目录里的php.ini-dist的名称为php.ini,然后复制到X:Windows目录  (X为你系统所在的盘符)
并把php_gd2.dll,php_mcrypt.dll,php_mysql.dll,php_pdo_mysql.dll前面的引号去掉,这样php才可以支持这些扩展

8、配置extension路径
更改extension_dir的路径为F:/php/ext/  (必须以/结尾)

9、配置session.save_path路径
更改session.save_path的路径为F:/php/tmp  (此目录需要手动建立)

现在php基本配置完成了,下面开始讲解配置phpmyadmin,先把压缩包里的内容解压到X:inetpubwwwrootphpmyadmin
配置phpmyadmin的验证方式 修改phpMyAdminlibrariesconfig.default.php文件
把$cfg['Servers'][$i]['auth_type'] = 'config';更改为$cfg['Servers'][$i]['auth_type'] = 'cookie';

10、配置phpmyadmin的加密用的私钥
把$cfg['blowfish_secret'] = '';更改为$cfg['blowfish_secret'] = 'im286';

现在已经把phpmyadmin配置完成了
11、安装ZendOptimizer
一路直接Next既可完成安装,安装路径那里可以设置为F:Zend
默认安装完毕以后不不可以直接支持Zend加密,需要做特别的设置 ..下面将讲解如何配置Zend,并让php可以支持
返回桌面,在”我的电脑”上面右键,点击”属性”
然后出现一下窗口,然后点击右边栏的”高级系统设置”

然后再点击下面的”环境变量”

双击打开编辑Path变量窗口,然后在前面添加
F:php;F:phpext;F:Zendlib;F:ZendlibOptimizer-3.3.0php-5.2.x;
然后点击确定完成配置

注意:如果你的Zend版本和php版本和我所演示的不同的话,那么上面的路径可能会更改,请时情况修改文件路径
12、安装MySQL
执行安装程序,直接下一步既可.安装路径可以自由选择,默认的也可以.个人喜好而已.
安装完毕以后程序会提示你配置MySQL
1.配置窗口

2.询问你使用什么配置,这里可以选择Standard Configuration,也就是标准配置

3.安装系统服务,直接Next既可

4.设置root用户密码,直接输入既可 ..第一次设置的时候没有Current root password:这个选项的,因为我是已经安装过的,所以再次设置密码的时候需要确认当前root的密码.而第一次安装却没,这一步可以忽略. ^^

5.应用配置

MySQL已经安装完毕
现在全部配置工作已经完成,如果不出意外的话,那么现在您的IIS 7.0就可以支持php,mysql,zend,phpmyadmin了
在你的wwwroot目录新建一个index.php文件,并输入以下内容
<?php
Phpinfo();
?>
退出保存 …
然后打开你的浏览器,打开站点http://127.0.0.1
哈哈,看到没…支持php了 ..
你也可以去下载一个php探针..这个界面更友好一些
如果你用ASP程序的时候发现程序不能用的话,那么估计就是父路径支持没打开..下图告诉将怎么打开
把默认的False更改为True然后应用更改既可

关键字: ,,,,,,

全面优化ASP应用程序的性能

in 沉思录 | 没有评论

ASP 本身并不是一种脚本语言,它只是提供了一种使镶嵌在 HTML 页面中的脚本程序得以运行的环境,而在ASP中最常用的脚本语言就是VBScript了。虽然ASP的脚本语言很简单,但是要想让一个ASP程序能够最优化的运行也不是一件简单的事情。 

  现在国内的网络带宽很有限,网络十分拥挤,如何使得自己的ASP应用程序能够快速的运行就成为了每一个ASP程序员的梦想了。那就跟随我来一同加速你的ASP程序吧! 

一. 有关操作数据库的优化方法 

  我们使用ASP最主要的用途就是对数据库进行操作了,如何更快速的完成这些动作呢? 

1. 不要任意使用“Select  *  ......” 

  请尽量拾取你所需要的那些字段,比如,一个Table中有10个字段,但是你只会用到其中的一个字段(name),就要使用“select name from yourtable”,而不是用“select * from yourtable”。你或许会说,我是这么做的阿,但是,如果一个table中有50个字段,你需要用到其中的23个字段的时候,你会怎么做呢?为了节省打字以及查找对应字段名称的麻烦,你就不一定会老老实实的用“select name,sex,age... from yourtable”了吧! 

  实际证明,尽量拾取你所需要的那些字段来使用select语句将会是你的ASP程序至少加快5%左右。 

2. 尽可能使用系统存储过程(针对MS SQL Server) 

  有的时候完成一个读取操作,使用SQL语句和存储过程同样可以完成,但是使用存储过程将会大大加快完成读取操作的速度,也就提高了你的ASP程序运行的速度。 

3. 注意你的游标使用方法 

  如果你仅仅是对一个table进行读取操作,那么请你使用forward-only,read-only游标,因为这种游标读取数据库是最为快速的,尤其是你的读取数据量很大的情况下。 

4. 不要打开无用的独立记录集 

  也许你在笑了,我会打开没有用的记录集吗?是的,你当然会,比如在生成一个树型记录集的时候,你不得不打开父记录集以及对应的子记录集,甚至还有孙记录集,其实你可以使用ADO提供的Data Shaping技术来替代打开多个独立的记录集,那样会加快程序的运行速度。(关于Data Shaping的用法可以参考ADO帮助) 

5. 一定要记着关闭打开的记录集对象以及连接(Connection)对象 

  有些朋友总是奇怪为何自己的ASP程序刚开始的时候运行速度很快,可是多运行几遍就越来越慢了呢?甚至出现服务器死机的情况。发生这种情况,就很可能是你打开了太多的记录集对象以及连接(Connection)对象而最后却没有关闭他们引起的。使用如下方法进行关闭: 

 程序代码

YourRecordSet.close 

Set YourRecordSet=Nothing 

Set YourConnection=Nothing 

6. 取得数据库数据的方法比较 

  你是如何得到记录集的数据的呢?是不是用YourRecordSet(字段编号),还是YourRecordSet("字段名称")?其实还有其他的使用方法,现在我们就比较一下吧(100条记录): 

 程序代码

Rs("字段名称") 

Rs("字段名").Value 

Rs("字段编号") 

Set方法 

数据库回应时间 

2.967秒 

2.936秒 

1.650秒 

0.586秒 

2.824秒 

2.914秒 

1.611秒 

0.602秒 

2.893秒 

2.943秒 

1.613秒 

0.594秒 

平均回应时间 

2.895秒 

2.931秒 

1.625秒 

0.594秒 

  这下知道了吧,前三种方法大家都可以看的明白,我就说说第四种方法(Set方法)如何使用: 

 程序代码

Dim strSQL 

StrSQL="select name,sex,age from yourtable" 

Dim rs 

Set rs=server.createobject("ADODB.RECORDSET") 

Rs.open strSQL,conn,1,1 

Const fieldsOrder=2 

Dim objOrder 

Set objOrder=rs(fieldsOrder) 

Response.write objOrder  'Set方法 

二. 有关ASP内置对象使用方面的优化方法 

1. 尽量减少Session对象和Application对象的使用 

  虽然ASP中提供的这两个对象对我们的编程提供了很大的帮助,但是,对这两个对象要合理的使用,不要滥用。因为大量的使用这两个对象将会极大的增大服务器的负担,严重消耗系统资源。也将使你的ASP程序运行慢如老牛。 

2. 要及时的关闭不再使用的对象(尤其是Session和Application) 

  不及时的关闭你所使用的对象会导致系统运行速度变得缓慢。也许你会问,Session和Application不是可以自动消失的吗?完全正确,系统默认30分钟内用户如果没有任何操作就自动触发Session_OnEnd和Application_OnEnd事件,但是大量的用户频繁的读取服务器,服务器将在很长的一段时间保持那些已经没有用的Session,Application对象,如果不及时关闭使用完的Session和Application后果将不堪想象了。 

关闭的方法是: 

   Set 对象=Nothing 

三. 合理使用Include文件 

  我们这里说的是指用<!--#include file="xxx"-->形式包含进来的文件,并且文件内容全是ASP程序,也就是说你将一些公共的函数放到一个文件中,并在其他有可能调用其中函数的页面包含进来。 

建议你不要将所有的函数放到一个包含文件中,因为你在其他页面包含这个文件的时候,服务器端是要进行预编译的,很可能在一个包含文件里面有上百个函数,而你只是想要使用其中的一个函数,这样就得不偿失了。所以,尽可能的分割你的包含文件成为多个小的包含文件。这样也可以提高程序的运行速度哦。 

四. 有关VBScript语言方面的优化方法 

1.尽量使用系统函数代替自己编写的函数 

   比如要想分割一个有规律的字符串("sss,ddd,fff,ggg"),就不必自己使用什么Mid(),Instr等等函数来分析了,其实VBScript就提供了一个函数 Split(),这样既省时间,又提高了速度,何乐而不为呢? 

2.减少动态数组的使用 

3.尽可能的养成提前声明变量的习惯 

   不要小看了这一条,提前声明变量会加快程序的解释执行时间。相反,从不声明变量,不但程序难以阅读,整个程序在服务器的执行效率也会大打折扣的。 

五. 其他方面的优化方法 

1. 在ASP文件中尽量使用<%%>嵌入到HTML标签中,而不要使用Response.write的方式,比如: 

 程序代码

<html> 

<body> 

<%If ok =1 then %> 

  Hello!&nb
sp;World! 

<%End If%> 

</body> 

</html> 

就远远比: 

&nbsp
;程序代码

<% 

Response.write "<html>" 

Response.write " <body>" 

            If ok =1 then 

  Response.write "Hello! World!" 

            End If 

Response.write " </body>" 

Response.write "</html>" 

%> 

的运行速度要快,尤其是你的ASP文件比较大的情况下。因为,第二种方式增加了服务器端的解释时间,因而也就降低了ASP程序的性能。 

2. 尽量用一个ASP文件完成一个动作 

  很多人喜欢在一个ASP程序中同时完成诸如添加,删除,查找等等多个动作,不要认为这样是有效的利用了文件,相反,这样做的结果是使得应用程序的运行速度减慢很多。 

应当将添加,删除,查找等分割成单个的独立的ASP文件来完成。这样使得文件不会过于庞大,降低服务器端解释执行的负担,并且阅读程序也很快捷。 

  好了,经过我们的全面优化,你的ASP应用程序是不是运行的更加稳定,更加快速了呢?

关键字: ,,,

asp读取XML

in 沉思录 | 没有评论

ASP文件: 
 程序代码

<%Response.Charset="gb2312"%>



<%
dim node,i,nodecount
set xml = CreateObject("Microsoft.XMLDOM")
xml.async = false
xml.load(Server.MapPath("data.xml"))
set root = xml.documentElement
set nodeLis = root.childNodes
nodeCount = nodeLis.length
For i=1 to nodeCount
set node = nodeLis.nextNode()
set cost = node.attributes.getNamedItem("cost")
%>
第 <%=i%> 条记录:
书名 出版社 价格
<%=node.selectSingleNode("name").text%> <%=node.selectSingleNode("publisher").text%> <%= node.selectSingleNode("cost").text%>
<% Next %>

XML文件《data.xml》: 
 程序代码




48
Dreamweaver
上海科技出版社
img/dw.jpg


61
Flash
铁道出版社
img/flash.jpg


48
Firweorks
教育出版社
img/fw.jpg

==========================
js读取::
 程序代码

var source=   new   ActiveXObject('Microsoft.XMLDOM');   //创建一个MSXML解析器实例   
source.async=false;   
source.load("xml.xml")        //载入xml文档。
nodes = source.documentElement;
var ItemN = source.documentElement;       //设置文档元素为根节点元素 
var j = ItemN.length;//获取item节点个数

var array1=new Array();
var array2=new Array();
var array3=new Array();
for(i=0;i<j;i++)
{
array1[i]=ItemN[i].selectSingleNode("name").text;//获取name内容
array2[i] = ItemN[i].selectSingleNode("publisher").text;//获取publisher内容
array3[i] = ItemN[i].selectSingleNode("img").text;//获取img内容
}

关键字: