信息系统项目管理师_2024年软考学习应考交流_信息系统项目管理师考试

 找回密码
 马上注册

QQ登录

只需一步,快速开始

楼主: 翔羽
打印 上一主题 下一主题

[转帖]ASP编程常用的代码

  [复制链接]

该用户从未签到

升级  30.8%

41
 楼主| 发表于 2006-2-24 09:18:02 | 只看该作者
通过向客户程序发送唯一的 Cookie 可以管理服务器上的 Session 对象。当用户第一次请求 ASP 应用程序中的某个页面时,ASP 要检查 HTTP 头信息,查看是否有在报文中有名为 ASPSESSIONID 的 Cookie 发送过来,如果有,则服务器会启动新的会话,并为该会话生成一个全局唯一的值,在把这个值作为新 ASPSESSIONID Cookie 的值发送给客户端,正是使用这种 Cookie,可以访问存储在服务器上的属于客户程序的信息。Session 对象最常见的作用就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。另外其还经常被用在鉴别客户身份的程序中。要注意的是,会话状态仅在支持 cookie 的浏览器中保留,如果客户关闭了 Cookie 选项,Session 也就不能发挥作用了。 <br/>   一、属性 <p>   1、SessionID </p><p>   SessionID 属性返回用户的会话标识。在创建会话时,服务器会为每一个会话生成一个单独的标识。会话标识以长整形数据类型返回。在很多情况下 SessionID 可以用于 WEB 页面注册统计。 </p><p>   2、TimeOut </p><p>   Timeout 属性以分钟为单位为该应用程序的 Session 对象指定超时时限。如果用户在该超时时限之内不刷新或请求网页,则该会话将终止。 </p><p>   二、方法 </p><p>   Session 对象仅有一个方法,就是 Abandon,Abandon 方法删除所有存储在 Session 对象中的对象并释放这些对象的源。如果您未明确地调用 Abandon 方法,一旦会话超时,服务器将删除这些对象。当服务器处理完当前页时,下面示例将释放会话状态。 <br/>  &lt; % Session.Abandon %&gt;</p><p></p><p>   三、事件 </p><p>   Session 对象有两个事件可用于在 Session 对象启动和释放是运行过程。 </p><p>   1、Session_OnStart 事件在服务器创建新会话时发生。服务器在执行请求的页之前先处理该脚本。Session_OnStart 事件是设置会话期变量的最佳时机,因为在访问任何页之前都会先设置它们。 </p><p>   尽管在 Session_OnStart 事件包含 Redirect 或 End 方法调用的情况下 Session 对象仍会保持,然而服务器将停止处理 Global.asa 文件并触发 Session_OnStart 事件的文件中的脚本。 </p><p>   为了确保用户在打开某个特定的 Web 页时始终启动一个会话,就可以在 Session_OnStart 事件中调用 Redirect 方法。当用户进入应用程序时,服务器将为用户创建一个会话并处理 Session_OnStart 事件脚本。您可以将脚本包含在该事件中以便检查用户打开的页是不是启动页,如果不是,就指示用户调用 Response.Redirect 方法启动网页。程序如下 : </p><p>&lt; SCRIPT RUNAT=Server Language=VBScript&gt;<br/>Sub Session_OnStart<br/>startPage = "/MyApp/StartHere.asp"<br/>currentPage = Request.ServerVariables("SCRIPT_NAME")<br/>if strcomp(currentPage,startPage,1) then<br/>Response.Redirect(startPage)<br/>end if<br/>End Sub<br/>&lt; /SCRIPT&gt;</p><p>   上述程序只能在支持 cookie 的浏览器中运行。因为不支持 cookie 的浏览器不能返回 SessionID cookie,所以,每当用户请求 Web 页时,服务器都会创建一个新会话。这样,对于每个请求服务器都将处理 Session_OnStart 脚本并将用户重定向到启动页中。 <br/>   2、Session_OnEnd 事件在会话被放弃或超时发生。 </p><p>   关于使用 Session 对象需要注意的事项 Application 对象相近,请参照前文。 </p><p>   会话可以通过以下三种方式启动 : </p><p>   1、一个新用户请求访问一个 URL,该 URL 标识了某个应用程序中的 .asp 文件,并且该应用程序的 Global.asa 文件包含 Session_OnStart 过程。 </p><p>   2、用户在 Session 对象中存储了一个值。 </p><p>   3、用户请求了一个应用程序的 .asp 文件,并且该应用程序的Global.asa 文件使用 &lt; OBJECT&gt; 标签创建带有会话作用域的对象的实例。 </p><p>   如果用户在指定时间内没有请求或刷新应用程序中的任何页,会话将自动结束。这段时间的默认值是 20 分钟。可以通过在 Internet 服务管理器中设置“应用程序选项”属性页中的“会话超时”属性改变应用程序的默认超时限制设置。应依据您的 Web 应用程序的要求和服务器的内存空间来设置此值。例如,如果您希望浏览您的 Web 应用程序的用户在每一页仅停留几分钟,就应该缩短会话的默认超时值。过长的会话超时值将导致打开的会话过多而耗尽您的服务器的内存资源。对于一个特定的会话,如果您想设置一个小于默认超时值的超时值,可以设置 Session 对象的 Timeout 属性。例如,下面这段脚本将超时值设置为 5 分钟。 <br/>  &lt; % Session.Timeout = 5 %&gt;</p><p>   当然你也可以设置一个大于默认设置的超时值,Session.Timeout 属性决定超时值。你还可以通过 Session 对象的 Abandon 方法显式结束一个会话。例如,在表格中提供一个“退出”按钮,将按钮的 ACTION 参数设置为包含下列命令的 .asp 文件的 URL。 <br/>  &lt; % Session.Abandon %&gt; </p>

该用户从未签到

升级  30.8%

42
 楼主| 发表于 2006-2-24 09:18:18 | 只看该作者
<p><strong>ASP中使用SQL语句教程 </strong></p><hr/><p><br/>五花八门的SQL产品多得要命,或许你早顾不得其它甩开袖子就动手干了。但你要同时采用ASP和SQL的话就可能会头晕。MySQL、SQL Server和mSQL都是绝佳的SQL工具,可惜,在ASP的环境下你却用不着它们来创建实用的SQL语句。不过,你可以利用自己掌握的Access知识以及相应的Access技能,再加上我们的提示和技巧,相信一定能成功地在你的ASP网页中加入SQL。</p><p><br/>1. <font color="#009999"><strong>SELECT 语句</strong></font></p><p>在SQL的世界里,最最基础的操作就是SELECT 语句了。在数据库工具下直接采用SQL的时候很多人都会熟悉下面的操作:<br/>SELECT what<br/>FROM whichTable<br/>WHERE criteria</p><p>执行以上语句就会创建一个存放其结果的查询。</p><p>而在ASP页面文件上,你也可以采用以上的一般语法,不过情况稍微不同,ASP编程的时候,SELECT 语句的内容要作为字符串赋给一个变量: <br/>SQL = "SELECT what FROM whichTable WHERE criteria"</p><p>好了,明白了ASP下SQL“说话”的方式,接下来如法炮制即可,只要满足你的需要,传统的SQL查询模式和条件查询都能派用场。</p><p>举例说明,不妨假设你的数据库内有个数据表,名字是Products ,现在你想取出这个表里的全部记录。然后你就编写了下面的代码: <br/>SQL ="SELECT * FROM Products"</p><p>以上代码——SQL语句的作用就是取出表内的全部数据——执行后将会选出数据表内的全部记录。不过,要是只想从表内取出某个特定列,比如p_name。那就不能用 * 通配符了,这里得键入具体某列的名字,代码如下: <br/>SQL ="SELECT p_name FROM Products"</p><p>执行以上查询之后Products 表内、p_name 列的内容就会全被选取出来。</p><p><br/>2. <font color="#009999"><strong>用WHERE子句设置查询条件</strong></font></p><p>有的时候取出全部数据库记录也许正好满足你的要求,不过,在大多数情况下我们通常只需得到部分记录。这样一来该如何设计查询呢?当然会更费点脑筋了,何况本文也存心不想让你去用那个什么劳什子的recordset。</p><p>举个例子,假如你只打算取出p_name 记录,而且这些记录的名字必须以字母w打头,那么你就要用到下面的WHERE 子句了:<br/>SQL ="SELECT p_name FROM Products WHERE p_name LIKE 'W%'"</p><p>WHERE 关键词的后面跟着用来过滤数据的条件,有了这些条件的帮助,只有满足一定标准的数据才会被查询出来。在以上的例子里,查询的结果只会得到名字以w 打头的p_name 记录。</p><p>以上例子中,百分比符号(%)的含义是指示查询返回所有w 字母打头而且后面是任何数据甚至没有数据的记录条目。所以,在执行以上查询的时候, west 和 willow 就会从Products 表内被选取出来并存放在查询里。</p><p>就像你看到的那样,只要仔细地设计SELECT 语句,你就可以限制recordset 中返回的信息量,多琢磨琢磨总能满足你的要求。</p><p>这些啊还不过是掌握SQL用途刚起步。为了帮助你逐步掌握复杂的SELECT 语句用法,下面就让我们再来看一下关键的标准术语:比较运算符,这些玩意都是你在构筑自己的SELECT 字符串来获得特定数据时要经常用到的。</p><p>WHERE子句基础<br/>在开始创建WHERE 子句的时候,最简单的方式是采用标准的比较符号,它们是 &lt; 、 &lt;= 、 &gt; 、 &gt;= 、&lt;&gt; 和 =。显然,你很快就能明白以下代码的含义和具体运行结果:<br/>SELECT * FROM Products WHERE p_price &gt;= 199.95<br/>SELECT * FROM Products WHERE p_price &lt;&gt; 19.95<br/>SELECT * FROM Products WHERE p_version = '4'</p><p>注意: 这里你会注意到,最后一个例句中的数字4周围加了单引号。原因是这样的,在这个例子中的 '4' 是文本类型而非数字类型。因为你会把 SELECT 语句放到引号中来把它作为一个值赋给变量,所以你也可以在语句中采用引号。</p><p>比较运算符<br/>比较运算符指定从表内取出数据的内容范围。你可以用它们来创建过滤器以便缩小recordset的范围,促使其只保存给定任务下你关心的信息。</p><p>3. <font color="#009999"><strong>LIKE 、 NOT LIKE和 BETWEEN</strong></font></p><p><br/>你已经在上面取出w打头记录的例子中看到了LIKE的用法。LIKE判定词是一个非常有用的符号。不过,在很多情况下用了它可能会带给你太多的数据,所以在用到它之前最好先开动脑筋多想想自己到底想获得什么数据。假设你想取出5位数字的SKU号码,而且其开头是1结尾是5,那么你可以用下划符(_)代替%符号:<br/>SQL = "SELECT * FROM Products WHERE p_sku LIKE '1___5'"</p><p>下划符表示任意一个字符。所以在输入“1 _ _ _ 5”的情况下,你的搜索就会限制在满足特定模式的5位数范围内了。</p><p>假如你想反其道而行之,要找出所有不匹配“1_ _ _ 5”模式的SKU条目。那么你只需要在刚才语句例子中的LIKE前面加上NOT就可以了。</p><p>BETWEEN<br/>假设你想取出一定范围内的数据,而且你事先知道范围的起点和终点,那么你不妨采用BETWEEN 判断词。现在就让我们假设你想选取给定表内范围在 1和 10之间的记录。你可以如下使用BETWEEN:<br/>…WHERE ID BETWEEN 1 AND 10</p><p>或者你也可以采用已经熟悉的数学判断字句:<br/>…WHERE ID &gt;= 1 AND ID &gt;= 10</p><p><br/>4. <font color="#009999"><strong>联合语句</strong></font></p><p>我们到目前为止所谈到的SQL语句相对较为简单,如果再能通过标准的recordset循环查询,那么这些语句也能满足一些更复杂的要求。不过,何必非要拘泥在浅尝则止的基础水准之上呢?你完全可以再增加其他一些符号,比如AND、 OR和NOT来完成更强大的功能。</p><p>以下面的SQL语句为例:<br/>SQL ="SELECT c_firstname, c_lastname, c_email FROM customers WHERE c_email IS<br/>NOT NULL AND c_purchase = '1' OR c_purchase = '2' AND c_lastname LIKE<br/>'A%'"</p><p>就你目前所掌握的SQL知识,以上的例子也不难解释,不过上面的语句并没有很明白地让你看清条件字句是如何胶合在单一SQL语句中的。</p><p>多行语句<br/>在SQL语句不好懂的情况下,你不妨把整个语句分解为多行代码,然后在现有变量基础上逐步增加查询语句的各个组成部分并把它存在同一变量内: <br/>SQL = "SELECT c_firstname, c_lastname, c_emailaddress, c_phone"<br/>SQL = SQL &amp; " FROM customers"<br/>SQL = SQL &amp; " WHERE c_firstname LIKE 'A%' and c_emailaddress NOT NULL"<br/>SQL = SQL &amp; " ORDER BY c_lastname, c_firstname"<br/>到了最后一句,SQL变量就包含了以下的完整SELECT 语句:<br/>"SELECT c_firstname, c_lastname, c_emailaddress, c_phone FROM customers<br/>WHERE c_firstname LIKE 'A%' and c_emailaddress NO NULL ORDER BY c_lastname,<br/>c_firstname"</p><p>整句照上面分解之后显然好读多了!在进行调试的时候,你或许更乐于多敲几个字符把程序改得更好读些。不过你可要记住了,在封闭引号之前或者在打开引号之后你需要增加空格,这样才能保证字符串连接起来的时候你没有把几个词凑到了一块。</p><p><br/></p>

该用户从未签到

升级  30.8%

43
 楼主| 发表于 2006-2-24 09:18:42 | 只看该作者
5. <font color="#009999"><strong>开始执行</strong></font><p>在学会了SELECT语句的构造和用途之后你就该学习如何使用它了。在你所掌握的数据库工具下,这可能意味着你得按下某个写着“执行”字样的按钮。在ASP网页上,可以立即执行SQL语句也可以当作存储过程调用。</p><p>一旦创建了SQL 语句,你还得设法访问其查询结果。显然,这里的关键就是ASP recordset。在使用非SQL的recordset时,创建recordset的代码通常如下所示:<br/>Dim objRec<br/>Set objRec = Server.CreateObject ("ADODB.Recordset")<br/>objRec.Open "customers", objConn, 0, 1, 2</p><p>如果你对ASP比较熟悉以上的代码对你可就不陌生了,你应该知道“customers”表示你打开数据库内一个数据表的名字。</p><p>打开recordset<br/>为了充分利用你更为熟悉的SQL技能,你需要调整常规ASP网页上最常采用的recordset:<br/>Dim objRec<br/>Set objRec = Server.CreateObject ("ADODB.Recordset")<br/>objRec.Open SQL, objConn, 0, 1, 2</p><p>这里唯一的修改就是在objRec.Open,之后用包含SQL语句的变量代替了要查询的数据表的名称。</p><p>这种方法的优点之一是你可以指定游标类型(如以上0, 1 ,2 所示)。</p><p>执行SQL<br/>你可以用紧凑的一行代码执行SQL语句来创建recordset。以下是语法:<br/>Dim objRec<br/>set objRec = objConn.Execute(SQL)</p><p>在上例中,你所看到的SQL是你存放自己SQL SELECT 语句的变量。该代码行“运行”SQL语句(或者说对数据库进行查询),选取数据并把数据存放在recordset 内,在上例中就是变量objRec。这种方法的主要缺点是你不能选择自己想采用的游标类型。相反,recordset总是用前向游标打开。</p><p>因为游标的缘故,你或许打算熟悉两种创建recordset的方法。直接执行查询节省了键入字符所消耗的时间,但那样的话你就得采用默认的游标了,这样有可能遭遇经常不能正常运行的毛病。不管你具体采用哪种办法,两者之间的最大的差别也不外乎代码精练与否。在不考虑你取得什么字段、你的标准是什么的前提下,也不管你如何存储数据,采用SQL式的recordset 在体积上会比ASP上打开的标准recordset 要小得多,更别提操作起来的简易性了。毕竟,通过过滤数据,你消除了耗费时间的if-then 测试和可能用到的循环。</p><p>编写测试用SQL<br/>这里有个技巧,许多专业ASP程序员习惯在测试网页的时候“编写”自己的SQL语句。这样做可以帮助你调试代码,因为你可以从中看到传递给服务器执行的字符串。而你要做的无非是增加Response.WriteyourVariable 在屏幕上显示有关信息。在你把和SQL有关的问题提交给ASP讨论组的时候你就应该附上这些信息。</p><p>6. <font color="#009999"><strong>存储查询</strong></font></p><p><br/>当你的查询相对简单的时候,每次从头开始创建SQL语句也不费什么工夫,不过,复杂的查询就不同了,每次都从头来会产生很多开发错误。因此,一旦让SQL顺利地运行起来,你最好把它们存起来,在需要时再调用它们。这样,哪怕是一个简单查询你都能随时用上存储的查询语句了。</p><p>假设你每周都要给团队做一次报告,指出目前存在的业务支持问题,这些数据需要从你的数据库中选取,而且要按照日期选择记录,同时根据你所在团队所采用的支持问题的类别排序。一旦你设计了这一查询,你何必以后每周都重新编写一次呢?不要在你的HTML页面上创建查询,你应该用你的数据库工具创建查询并且保存它。</p><p>然后你可以采用ActiveCommand 属性把查询插入到你的ASP网页。头一两回你可能会觉得没啥意思,其实也就几行代码而已:<br/>Set objSQ = Server.CreateObject ("ADODB.Command")<br/>objSQ.ActiveConnection = "databaseName"</p><p>objSQ.CommandText = "storedQueryName"<br/>objSQ.CommandType = adCmdStoredProc</p><p>set objRec = objSQ.Execute</p><p>注意,采用adCmdStoredProc 表示你已经在页面上包含了adovbs.inc 文件。该文件定义了你可以按照名字而非数字进行访问的Access常数。只需要在页面上包含该文件即可(&lt;!--#INCLUDE --&gt;),然后你就可以用adCmdStoredProc 这类名字了。这样,将来你再看到的时候更容易理解以上被存储的查询到底是个什么意思。</p><p>7.<font color="#009999"><strong> ORDER BY</strong></font></p><p>从Access数据库中选取记录有件最令人丧气的事情,它们是以怎样的顺序输入到数据库内就按照怎样的顺序出来。就算你在Access环境内采用Sort By来改变记录视图,数据表内的记录顺序也并没有发生改变。</p><p><br/>如果你正在使用ASPrecordset在网页上写出记录,那么你或许知道乱纷纷的顺序是多令人痛苦的事。但是你可能不得不经常得面对这一问题,因为并不存在什么简单方便的解决方案。好在ORDER BY 可以简化这一难题。</p><p>为了对你的结果排序,只要在SELECT语句末尾加上ORDER BY,然后指定你需要排序的参照列即可。因此,如果你想要根据顾客的姓氏对Customers表排序,那么你可以编写如下的查询语句:<br/>SQL = "SELECT c_lastname, c_firstname, c_email FROM Customers ORDER BY c_lastname"</p><p>这样,只要你建立了recordset而且开始把结果写到屏幕上,你就会看见数据按照字母顺序排列起来了。</p><p>多级排序<br/>其实不仅仅可以在SQL语句中进行一级排序。实际上,在很多情况下,你可能会希望指定两到三级深度的数据排序。假设你有以下数据表,其内容如下所示:</p><p><img height="176" src="mkMSITStore:E:\Documents%20and%20Settings\Administrator\桌面\200622221424550480\20057210142669.chm::/images/2003101213373359565.gif" width="427" alt=""/></p><p></p><p>先前采用的单级ORDER BY 排序是按下面的顺序取出数据的:<br/>Absurdly Assured<br/>absurd@assured.com</p><p>Absolutely Assured<br/>absolutely@assured.com</p><p>Crazed Coder<br/>crazy@coder.net</p><p>Loosely Fringe<br/>loose@fringe.to</p><p>Lunatic Fringe<br/>lune@fringe.to</p><p>Hands On<br/>hands@yes.org</p><p>显然ORDER BY 起了应有的作用。在实际的表结构下,Absurdly Assured 是最后的条目,但它排在检索结果的最顶端。Hands On记录排最后因为 O 在以上列表中排在字母表最后。显然,Absolutely按照字母表最好排在Absurdly之前。为此,你需要采取第2级ORDER BY 排序标准,参照第2列进行排序:<br/>SQL = "SELECT c_lastname, c_firstname, c_email FROM Customers ORDER BY<br/>c_lastname, c_firstname"</p><p>其结果将首先按照c_lastname 列排序然后按照c_firstname 列排序。假如你的数据表包含的记录比较多,仔细设计排序会令输出结果编排更为合理。</p><p>投入使用<br/>如果你同大多数程序员一样喜欢自己动手编代码,沉湎于掌握新技术的狂热之中。何不从ASP的冗长编码中转过头来尝试一下SQL编码呢?下面我们将就ASP编程时常见的问题以及如何在ASP中高效地利用SQL语句做一番探讨。</p>

该用户从未签到

升级  30.8%

44
 楼主| 发表于 2006-2-24 09:18:56 | 只看该作者
<p>8. <font color="#009999"><strong>记录统计</strong></font></p><p><br/>确定数据库内有多少记录,或者确定有多少记录达到了某些标准,这些用ASP完成并非难事。如果你采用了正确的游标类型,你可以用RecordCount 属性获得记录数当然也可以用recordset。但是,有个更简单的办法,这就是在自己的SELECT语句中采用count(*) ,代码如下所示:<br/>SQL = "SELECT count(*) FROM Customers"</p><p>或者<br/>SQL = "SELECT count(*) FROM Customers WHERE c_lastname LIKE 'A%'"</p><p>举例说明,以下代码将选出一些记录以及这些记录的总数:<br/>SQL = "SELECT c_firstname, c_lastname, count(*) FROM Customers WHERE c_lastname LIKE 'A%'"</p><p>但是你不能实现自己的目的。这里采用的“count”函数其实是一种集合函数,意思是只返回单行信息:回答你提出的问题。对第1个SELECT 语句来说,问题是“在客户表内有多少条记录?”查询返回单一的值作为响应,因此它不能同你常规的查询相组合。假如你希望得到其他数据,你需要采用RecordCount。</p><p>集合函数除了“count”之外还包括AVG、MIN、MAX和SUM等。</p><p><br/>9. <font color="#009999"><strong>连接</strong></font></p><p>任何熟悉SQL和关系数据库的人都遇见过大量的连接类型。最简单的说,连接(join)会把两个表的内容组合到一个虚拟表或者recordset内。假如数据表有效地规一化,或许你会经常从某一个表中选出特定的信息再从另一个表中选出关联信息。这样做就需要简单的“同等连接(equijoin)”。</p><p>为了了解实际的连接操作,现在让我们假设在一个数据库内存放了某类软件的相关记录。某个表(Software)包含了软件产品的名称、软件的版本以及其他有关细节:</p><p><img height="157" src="mkMSITStore:E:\Documents%20and%20Settings\Administrator\桌面\200622221424550480\20057210142669.chm::/images/200310121338147907.gif" width="413" alt=""/></p><p></p><p>另一个表(Releases)则存储了软件发布历史的信息,其中包括发布日期和发布状态等(比如测试版、当前版、过时等):</p><p><img height="177" src="mkMSITStore:E:\Documents%20and%20Settings\Administrator\桌面\200622221424550480\20057210142669.chm::/images/2003101213382533944.gif" width="312" alt=""/></p><p></p><p>上表中还包含了一个列,内容指向软件表中采用的ID号。所以,通过这种索引软件表的方式,你就知道发布表中software_ID 等于 2的软件是Rome。</p><p>你采用连接组合信息,这样就不需要在两个表之间来回折腾了。不过,除了组合信息之外还可以通过连接把有关信息合并。这样,只要发布表内的software_ID 匹配软件表内的ID,你就把匹配信息一起放到一个记录内。</p><p>代码如下:<br/>SQL = "SELECT * FROM Software, Releases WHERE software.ID = releases.softwareID"</p><p>仔细分析以上的语句,首先注意到两个表名列在了FROM的后面。再根据所采用的连接,今后你可能还会发现语法会有所变化(或者连接类型有变),但是以上的语法是最基本的,显示了数据的联合选择方式。这里的WHERE 子句用来比较特定的ID值。在Software 表内,存在ID 列。同样的,Releases 表内则有个software_ID 列。为了明确你在WHERE 子句里要比较的值,你用表名作为前缀,后面还加上了一个点号(.)。</p><p>以下是连接选取数据之后的结果: </p><p><img height="134" src="mkMSITStore:E:\Documents%20and%20Settings\Administrator\桌面\200622221424550480\20057210142669.chm::/images/2003101213385325535.gif" width="433" alt=""/></p><p></p><p>注意:在创建连接的时候要仔细考虑选出数据的列。以上代码采用 * 通配符是为了让读者关注于SELECT 代码行的其他部分。但是,正如你从上图看到的那样,你无法选出softwareID 列,因为这一列没有作为recordset部分的增加值。它的作用就是为WHERE 子句所用。</p><p></p><p>&nbsp; </p>

该用户从未签到

升级  30.8%

45
 楼主| 发表于 2006-2-24 09:19:11 | 只看该作者
<p><strong>ASP访问SQL Server内置对象</strong></p><p></p><hr/><p>平常我们只听说过ADO等一类ASP对象,但在ASP中还有个鲜为人知的专门SQL Server的ASP访问对象,它就是SQLOLE.SQLServer对象。SQLOLE.SQLServer可以直接访问SQL Server的系统属性。以Set oSQLServer = CreateObject ("SQLOLE.SQLServer")语句将产生一个SQL Server服务器对象。 </p><p>---- 若要查看此服务器中数据库的集合,可用语句: </p><p></p><p>For Each SQLDB In oSQLServer.Databases<br/>Response.Write SQLDB.Name ‘将列出所有的数据库,如Pubs等<br/>Next</p><p>---- 若要查看某数据库中(如PUBS数据库)数据表的集合,可用语句: </p><p></p><p>pubDatabase=oSQLServer.Databases(“pubs”)<br/>’oSQLServer是前面创建的SQL Server服务器对象<br/>For Each DBTable In pubDatabase.Tables<br/>Response.Write DBTable.Name<br/>Next</p><p>---- 下面的语句将列出数据库中(PUBS数据库)数据视图 </p><p></p><p>pubDatabase =oSQLServer.Databases(“pubs”)<br/>’oSQLServer是前面创建的SQL Server服务器对象<br/>For Each DBView In pubDatabase.Views<br/>Response.Write DBView.Text<br/>Next</p><p>---- 以下语句将列出数据库中(PUBS数据库)存贮过程 </p><p></p><p>pubDatabase =oSQLServer.Databases(“pubs”)<br/>’oSQLServer是前面创建的SQL Server服务器对象<br/>For Each DBSP In pubDatabase.StoredProcedures<br/>Response.Write DBSP.Text<br/>Next</p><p>---- 程序运行的结果(取数据表名): </p><p>---- 取存贮过程的结果: </p><p>---- 一个完整的小例子源码附后(其它功能读者可加入)。 </p><p></p><p>&lt; %@ LANGUAGE = VBScript % &gt;</p><p>&lt; HTML &gt;<br/>&lt; HEAD &gt;<br/>&lt; META NAME="GENERATOR" Content=<br/>"Microsoft Developer Studio" &gt;<br/>&lt; META HTTP-EQUIV="Content-Type"<br/>content="text/html; charset=gb2312" &gt;</p><p>&lt; TITLE &gt;&lt; /TITLE &gt;<br/>&lt; /HEAD &gt;</p><p>&lt; %<br/>On Error Resume Next<br/>Dim oSQLServer<br/>Set oSQLServer = CreateObject ("SQLOLE.SQLServer")</p><p><br/>strServer = "dep"<br/>strLogin = "sa"<br/>strPwd = ""</p><p><br/>oSQLServer.Connect strServer,strLogin,strPwd</p><p></p><p>% &gt;</p><p><br/>&lt; BODY BGCOLOR=#ffffff &gt;<br/>数据库列表<br/>&lt; SELECT NAME="Database" &gt;<br/>&lt; %<br/>For Each SQLDB In oSQLServer.Databases<br/>If Not SQLDB.SystemObject Then<br/>Response.Write "&lt; OPTION VALUE=<br/>""" &amp; SQLDB.Name &amp; """ &gt;" &amp; SQLDB.Name</p><p>&amp; " "<br/>End If<br/>Next<br/>Set oSQLServer = Nothing<br/>% &gt;<br/>&lt; /SELECT &gt;<br/>&lt; /BODY &gt;<br/>&lt; /HTML &gt;</p>

该用户从未签到

升级  30.8%

46
 楼主| 发表于 2006-2-24 09:19:26 | 只看该作者
<p><strong>ASP中正则表达式的应用</strong></p><hr/><p>  一、正则表达式概述 <br/>如果原来没有使用过正则表达式,那么可能对这个术语和概念会不太熟悉。不过,它们并不是您想象的那么新奇。 <br/>请回想一下在硬盘上是如何查找文件的。您肯定会使用 ? 和 * 字符来帮助查找您正寻找的文件。? 字符匹配文件名中的单个字符,而 * 则匹配一个或多个字符。一个如 'data?.dat' 的模式可以找到下述文件:data1.dat、data2.dat等等。如果使用 * 字符代替 ? 字符,则将扩大找到的文件数量。'data*.dat' 可以匹配下述所有文件名:data.dat、data1.dat、data12.dat等等,尽管这种搜索文件的方法肯定很有用,但也十分有限。? 和 * 通配符的有限能力可以使你对正则表达式能做什么有一个概念,不过正则表达式的功能更强大,也更灵活。 <br/>在我们编写ASP程序时,经常会判断一个字符串的有效性,如;一个串是否是数字、是否是有效的Email地址等等。如果不使用正则表达式,那么判断的程序会很长,并且容易出错,如果使用正则表达式,这些判断就是一件很轻松的工作了。后面我们将介绍如何判断数字和Email地址的有效性。 <br/>在典型的搜索和替换操作中,必须提供要查找的确切文字。这种技术对于静态文本中的简单搜索和替换任务可能足够了,但是由于它缺乏灵活性,因此在搜索动态文本时就有困难了,甚至是不可能的。 <br/>使用正则表达式,能完成些什么事情呢? <br/>测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。 <br/>替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。 <br/>根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。 <br/>例如,如果需要搜索整个 web 站点来删除某些过时的材料并替换某些HTML 格式化标记,则可以使用正则表达式对每个文件进行测试,看在该文件中是否存在所要查找的材料或 HTML 格式化标记。用这个方法,就可以将受影响的文件范围缩小到包含要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料,最后,可以再次使用正则表达式来查找并替换那些需要替换的标记。那么,正则表达式语法的语法是如何呢? <br/>一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文 <br/>字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 <br/>这里有一些可能会遇到的正则表达式示例: <br/>/^\[ \t]*$/ "^\[ \t]*$" 匹配一个空白行。 <br/>/\d{2}-\d{5}/ "\d{2}-\d{5}" 验证一个ID 号码是否由一个2位数字,一个连字符以及一个5位数字组成。 <br/>/&lt;(.*)&gt;.*&lt;\/\1&gt;/ "&lt;(.*)&gt;.*&lt;\/\1&gt;" 匹配一个 HTML 标记。</p><p>  二、正则表达式在VBScript中的应用 <br/>  VBScript使用RegExp对象、Matches集合以及Match对象提供正则表达式支持功能。我们还是先看一个例子。 <br/>&lt;% <br/>Function RegExpTest(patrn, strng) <br/>Dim regEx, Match, Matches   '建立变量。 <br/>Set regEx = New RegExp   '建立正则表达式。 <br/>regEx.Pattern = patrn  '设置模式。 <br/>regEx.IgnoreCase = True   '设置是否区分字符大小写。 <br/>regEx.Global = True   '设置全局可用性。 <br/>Set Matches = regEx.Execute(strng)  '执行搜索。 <br/>For Each Match in Matches  '遍历匹配集合。 <br/>RetStr = RetStr &amp; "Match found at position " <br/>RetStr = RetStr &amp; Match.FirstIndex &amp; ". Match Value is '" <br/>RetStr = RetStr &amp; Match.Value &amp; "'." &amp; "&lt;BR&gt;" <br/>Next <br/>RegExpTest = RetStr <br/>End Function <br/>response.write RegExpTest("[ij]s.", "IS1 Js2 IS3 is4") <br/>%&gt; <br/>在这个例子中,我们查找字符串中有无is或者js这两个词,忽略大小写。运行的结果如下: <br/>Match found at position 0. Match Value is 'IS1'. <br/>Match found at position 4. Match Value is 'Js2'. <br/>Match found at position 8. Match Value is 'IS3'. <br/>Match found at position 12. Match Value is 'is4'. <br/>下面我们就介绍这三个对象和集合。 <br/>  1、RegExp对象 是最重要的一个对象,它有几个属性,其中: <br/>  ○Global 属性,设置或返回一个 Boolean 值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。如果搜索应用于整个字符串,Global 属性的值为 True,否则其值为 False。默认的设置为 False。 <br/>  ○IgnoreCase 属性,设置或返回一个Boolean值,指明模式搜索是否区分大小写。如果搜索是区分大小写的,则IgnoreCase 属性为 False;否则为 True。缺省值为 False。 <br/>  ○Pattern 属性,设置或返回被搜索的正则表达式模式。必选项。总是一个 RegExp 对象变量。 <br/>  2、Match 对象 <br/>  匹配搜索的结果是存放在Match对象中,提供了对正则表达式匹配的只读属性的访问。 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的 Match 对象属性都是只读的。在执行正则表达式时,可能产生零个或多个 Match 对象。每个 Match 对象提供了被正则表达式搜索找到的字符串的访问、字符串的长度,以及找到匹配的索引位置等。 <br/>  ○FirstIndex 属性,返回在搜索字符串中匹配的位置。FirstIndex 属性使用从零起算的偏移量,该偏移量是相对于 <br/>搜索字符串的起始位置而言的。换言之,字符串中的第一个字符被标识为字符 0 <br/>  ○Length 属性,返回在字符串搜索中找到的匹配的长度。 <br/>  ○Value 属性,返回在一个搜索字符串中找到的匹配的值或文本。 <br/>  3、Matches 集合 <br/>  正则表达式 Match 对象的集合。Matches 集合中包含若干独立的 Match 对象,只能使用 RegExp 对象的 Execute 方法来创建之。与独立的 Match 对象属性相同,Matches `集合的一个属性是只读的。在执行正则表达式时,可能产生零个或多个 Match 对象。每个 Match 对象都提供了与正则表达式匹配的字符串的访问入口、字符串的长度,以及标识匹配位置的索引。 <br/>  学习了这三个对象和集合,如何应用于字符串的判断和替换呢?regExp对象的三个方法正好解决了这个问题,它们是Replace方法、Test方法和Execute方法。 <br/>  1、Replace 方法 <br/>  替换在正则表达式查找中找到的文本。我们还是先看个例子:下面的例子说明了 Replace 方法的用法。 <br/>&lt;% <br/>Function ReplaceTest(patrn, replStr) <br/>Dim regEx, str1 ' 建立变量。 <br/>str1 = "The quick brown fox jumped over the lazy dog." <br/>Set regEx = New RegExp ' 建立正则表达式。 <br/>regEx.Pattern = patrn ' 设置模式。 <br/>regEx.IgnoreCase = True ' 设置是否区分大小写。 <br/>ReplaceTest = regEx.Replace(str1, replStr) ' 作替换。 <br/>End Function <br/>Response.write ReplaceTest("fox", "cat") &amp; "&lt;BR&gt;" ' 将 'fox' 替换为 'cat'。 <br/>Response.write ReplaceTest("(\S+)(\s+)(\S+)", "$3$2$1") ' 交换词对. <br/>%&gt; <br/>  2、Test 方法 <br/>  对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。正则表达式搜索的实际模式是通过RegExp对象的Pattern属性来设置的。RegExp.Global属性对Test方法没有影响。 <br/>  如果找到了匹配的模式,Test方法返回True;否则返回False。下面的代码说明了Test 方法的用法。 <br/>&lt;% <br/>Function RegExpTest(patrn, strng) <br/>Dim regEx, retVal ' 建立变量。 <br/>Set regEx = New RegExp ' 建立正则表达式。 <br/>regEx.Pattern = patrn ' 设置模式。 <br/>regEx.IgnoreCase = False ' 设置是否区分大小写。 <br/>retVal = regEx.Test(strng) ' 执行搜索测试。 <br/>If retVal Then <br/>RegExpTest = "找到一个或多个匹配。" <br/>Else <br/>RegExpTest = "未找到匹配。" <br/>End If <br/>End Function <br/>Response.write RegExpTest("is.", "IS1 is2 IS3 is4") <br/>%&gt; <br/>  3、Execute 方法 <br/>  对指定的字符串执行正则表达式搜索。正则表达式搜索的设计模式是通过 RegExp 对象的 Pattern 来设置的。 <br/>  Execute 方法返回一个 Matches 集合,其中包含了在 string 中找到的每一个匹配的 Match 对象。如果未找到匹配,Execute 将返回空的 Matches 集合。<br/><br/>  三、JavaScript中正则表达式的使用 <br/>  在JavaScript 1.2版以后,JavaScript也支持正则表达式。 <br/>  1、replace <br/>  replace在一个字符串中通过正则表达式查找替换相应的内容。replace并不改变原来的字符串,只是重新生成了一个新的字符串。如果需要执行全局查找或忽略大小写,那幺在正则表达式的最后添加g和i。 <br/>例: <br/>&lt;SCRIPT&gt; <br/>re = /apples/gi; <br/>str = "Apples are round, and apples are juicy."; <br/>newstr=str.replace(re, "oranges"); <br/>document.write(newstr) <br/>&lt;/SCRIPT&gt; <br/>结果是:"oranges are round, and oranges are juicy." <br/>例: <br/>&lt;SCRIPT&gt; <br/>str = "Twas the night before Xmas..."; <br/>newstr=str.replace(/xmas/i, "Christmas"); <br/>document.write(newstr) <br/>&lt;/SCRIPT&gt; <br/>结果是:"Twas the night before Christmas..." <br/></p>

该用户从未签到

升级  30.8%

47
 楼主| 发表于 2006-2-24 09:19:45 | 只看该作者
例: <br/>&lt;SCRIPT&gt; <br/>re = /(\w+)\s(\w+)/;str = "John Smith"; <br/>newstr = str.replace(re, "$2, $1"); <br/>document.write(newstr) <br/>&lt;/SCRIPT&gt; <br/>结果是:"Smith, John". <br/>  2、search <br/>search通过正则表达式查找相应的字符串,只是判断有无匹配的字符串。如果查找成功,search返回匹配串的位置,否则返回-1。 <br/>search(regexp) <br/>&lt;SCRIPT&gt; <br/>function testinput(re, str){ <br/>if (str.search(re) != -1) <br/>midstring = " contains "; <br/>else <br/>midstring = " does not contain "; <br/>document.write (str + midstring + re.source); <br/>} <br/>testinput(/^[1-9]/i,"123") <br/>&lt;/SCRIPT&gt; <br/>  3、match <br/>  match方法执行全局查找,查找结果存放在一个数组里。 <br/>例一: <br/>&lt;SCRIPT&gt; <br/>str = "For more information, see Chapter 3.4.5.1"; <br/>re = /(chapter \d+(\.\d)*)/i; <br/>found = str.match(re); <br/>document.write(found); <br/>&lt;/SCRIPT&gt; <br/>显示结果:Chapter 3.4.5.1,Chapter 3.4.5.1,.1 <br/>例二: <br/>&lt;SCRIPT&gt; <br/>str = "abcDdcba"; <br/>newArray = str.match(/d/gi); <br/>document.write(newArray); <br/>&lt;/SCRIPT&gt; <br/>显示结果D, d.<p>  四、示例<br/>1 、判断数字的正确性 <br/>&lt;%@ Language=VBScript %&gt; <br/>&lt;script language="javascript" runat="server"&gt; <br/>function isNumeric(strNumber) { <br/>return (strNumber.search(/^(-|\+)?\d+(\.\d+)?$/) != -1); <br/>} <br/>function isUnsignedNumeric(strNumber) { <br/>return (strNumber.search(/^\d+(\.\d+)?$/) != -1); <br/>} <br/>function isInteger(strInteger) { <br/>return (strInteger.search(/^(-|\+)?\d+$/) != -1); <br/>} <br/>function isUnsignedInteger(strInteger) { <br/>return (strInteger.search(/^\d+$/) != -1); <br/>} <br/>&lt;/script&gt; <br/>&lt;HTML&gt; <br/>&lt;BODY&gt; <br/>&lt;b&gt;判断数字的正确性&lt;/b&gt; <br/>&lt;% <br/>Dim strTemp <br/>strTemp = CStr(Request.Form("inputstring")) <br/>If strTemp = "" Then strTemp = "0" <br/>%&gt; <br/>&lt;TABLE BORDER="1" CELLPADDING="4" CELLSPACING="2"&gt; <br/>&lt;TR&gt; <br/>&lt;TD ALIGN="right"&gt;&lt;B&gt;原始字符串&lt;/B&gt;&lt;/TD&gt; <br/>&lt;TD&gt;&lt;%= strTemp %&gt;&lt;/TD&gt; <br/>&lt;/TR&gt; <br/>&lt;TR&gt; <br/>&lt;TD ALIGN="right"&gt;&lt;B&gt;数字&lt;/B&gt;&lt;/TD&gt; <br/>&lt;TD&gt;&lt;%=isNumeric(strTemp)%&gt;&lt;/TD&gt; <br/>&lt;/TR&gt; <br/>&lt;TR&gt; <br/>&lt;TD ALIGN="right"&gt;&lt;B&gt;非负数字&lt;/B&gt;&lt;/TD&gt; <br/>&lt;TD&gt;&lt;%=isUnsignedNumeric(strTemp)%&gt;&lt;/TD&gt; <br/>&lt;/TR&gt; <br/>&lt;TR&gt; <br/>&lt;TD ALIGN="right"&gt;&lt;B&gt;整数&lt;/B&gt;&lt;/TD&gt; <br/>&lt;TD&gt;&lt;%=isInteger(strTemp)%&gt;&lt;/TD&gt; <br/>&lt;/TR&gt; <br/>&lt;TR&gt; <br/>&lt;TD ALIGN="right"&gt;&lt;B&gt;非负整数()&lt;/B&gt;&lt;/TD&gt; <br/>&lt;TD&gt;&lt;%=isUnsignedInteger(strTemp)%&gt;&lt;/TD&gt; <br/>&lt;/TR&gt; <br/>&lt;/TABLE&gt; <br/>&lt;FORM ACTION="&lt;%=Request.ServerVariables("SCRIPT_NAME")%&gt;" METHOD="post"&gt; <br/>请输入一个数字:&lt;BR&gt; <br/>&lt;INPUT TYPE="text" NAME="inputstring" SIZE="50"&gt;&lt;/INPUT&gt;&lt;BR&gt; <br/>&lt;INPUT TYPE="submit" Value="提交"&gt;&lt;/INPUT&gt;&lt;BR&gt; <br/>&lt;/FORM&gt; <br/>&lt;/BODY&gt; <br/>&lt;/HTML&gt; <br/>2、判断Email地址的正确性 <br/>&lt;% <br/>Function isemail(strng) <br/>isemail = false <br/>Dim regEx, Match <br/>Set regEx = New RegExp <br/>regEx.Pattern = "^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$" <br/>regEx.IgnoreCase = True <br/>Set Match = regEx.Execute(strng) <br/>if match.count then isemail= true <br/>End Function <br/>%&gt;</p><p>  五、总结 <br/>  上面我们介绍了正则表达式的基本概念,以及在VBScript和JavaScript中如何使用正则表达式,同时,通过一些实例让大家有了感性的认识。正则表达式的应用范围很广,能为大家解决很多实际中的问题。本文介绍的内容只是一些初步的知识,还有很多语法规则需要大家继续学习,在实践中发现问题,解决问题。<br/></p>

该用户从未签到

升级  30.8%

48
 楼主| 发表于 2006-2-24 09:20:02 | 只看该作者
<p><strong>ASP 中 Split 函数的实例</strong></p><hr/><p>  大家有碰到过要想取一字符串里的某些值而无从下手?有没有觉得看书或教材对split的写法糊里糊涂……如果有此疑问的话,请看下面我对例子的解释,相信您会对这个有一定的了解。 </p><p>  我先介绍一下Split函数的用法:<br/> 返回值数组 = Split("字符串","分割符")</p><p><br/>  假设变量strURL保存着URL值,如strURL = "ftp://username:password@server",这是我们在IE中登录到FTP上时的URL形式,如果我们想把其中的username和password取出来的话,该怎么办呢?当然解决的方法有许多,在这里我们只介绍用Split来解决的方法。首先,我们找出分割符。我们发现在这个字符串中,username和password之间有个冒号把它们隔开了,所以我们就把这个冒号作为Split函数的"分割符"来分割整个字符串,最后达到取username和password的目的。代码如下: <br/>strURL = "ftp://username:password@server"<br/>aryReturn = Split(strURL,":")</p><p>  这样我们就把字符串用冒号分割开了,分割后的结果保存在aryReturn中(aryReturn是一个数组)。 </p><p>  下面我们就来看看这个最终的结果吧,因为Split函数最终返回的是一个数组,所以我们主要就是显示数组中的元素了,就要涉及到一些跟数组有关的函数:IsArray()判断是否数组的函数,LBound()取数组的下标,UBound()取数组的上标。 </p><p><br/>Response.Write("返回值是否为数组:" &amp; IsArray(aryReturn) &amp; "&lt;br&gt;")<br/>For i = LBound(aryReturn) To UBound(aryReturn)<br/>Response.Write("返回值数组中的元素[" &amp; i &amp; "]:" &amp; Right(aryReturn(i),Len(aryReturn(i))-2) &amp; "&lt;br&gt;")<br/>Next </p><p>  通过上面的代码,我们看到字符串被分割成三个部分,即:"ftp"、"//username"、"password@server"。我们要取username和password需要进一步的处理,我就不多说了,直接给出代码。<br/>  取username的代码:<br/>strUsername = Right(aryReturn(1),Len(aryReturn(1))-2) <br/>  取password的代码:</p><p><br/>'取password我们又用到Split函数了,不过这回的分割符是"@" <br/>aryTemp = Split(aryReturn(2),"@") <br/>strPassword = aryTemp(0) <br/>'我们可以顺便取出server<br/>strServer = aryTemp(1) </p><p>  分割符可以是一个字符,也可以是一个字符串。如:<br/>aryReturn = Split("ftp://username:password@server,"//") </p><p>  注意:<br/>  1.一般来说,ASP中可以不声明变量,使用Split函数时,如果要声明返回值的变量的话,只能用Dim,而不能用Redim。虽然说其返回是一个数组,应该是用Redim也可以,但在实际使用过程中是不行。不知是怎么回事?<br/>  2. 如果用Split函数来分割一个字符串中并不存在的分割符时,将返回整个字符串,其结果是只有一个元素的数组。</p><p>  后话,对于要取一字符串中的某些字符或部分,只要抓住规律,再加上用split就可以很好做成各种效果。写此文,希望对大家的学习有所帮助,同时也希望各路高手能够指点一二!<br/></p>

该用户从未签到

升级  30.8%

49
 楼主| 发表于 2006-2-24 09:20:17 | 只看该作者
<p><strong>ASP 中 DateDiff 函数详解</strong></p><hr/><p>DateDiff 函数 </p><p>描述 <br/>返回两个日期之间的时间间隔。 <br/>语法 <br/>DateDiff(interval, date1, date2 [,firstdayofweek][, firstweekofyear]]) <br/>DateDiff 函数的语法有以下参数: </p><p>参数 描述 <br/>interval 必选。字符串表达式,表示用于计算 date1 和 date2 之间的时间间隔。有关数值,请参阅“设置”部分。 <br/>date1, date2 必选。日期表达式。用于计算的两个日期。 <br/>firstdayofweek 可选。指定星期中第一天的常数。如果没有指定,则默认为星期日。有关数值,请参阅“设置”部分。 <br/>firstweekofyear 可选。指定一年中第一周的常数。如果没有指定,则默认为 1 月 1 日所在的星期。有关数值,请参阅“设置”部分。 </p><p><br/>设置 <br/>interval 参数可以有以下值: <br/>设置 描述 <br/>yyyy 年 <br/>q 季度 <br/>m 月 <br/>y 一年的日数 <br/>d 日 <br/>w 一周的日数 <br/>ww 周 <br/>h 小时 <br/>m 分钟 <br/>s 秒 </p><p><br/>firstdayofweek 参数可以有以下值: </p><p>常数 值 描述 <br/>vbUseSystem 0 使用区域语言支持 (NLS) API 设置。 <br/>vbSunday 1 星期日(默认) <br/>vbMonday 2 星期一 <br/>vbTuesday 3 星期二 <br/>vbWednesday 4 星期三 <br/>vbThursday 5 星期四 <br/>vbFriday 6 星期五 <br/>vbSaturday 7 星期六 </p><p><br/>firstweekofyear 参数可以有以下值: </p><p>常数 值 描述 <br/>vbUseSystem 0 使用区域语言支持 (NLS) API 设置。 <br/>vbFirstJan1 1 由 1 月 1 日所在的星期开始(默认)。 <br/>vbFirstFourDays 2 由在新年中至少有四天的第一周开始。 <br/>vbFirstFullWeek 3 由在新的一年中第一个完整的周开始。 </p><p><br/>说明 <br/>DateDiff 函数用于判断在两个日期之间存在的指定时间间隔的数目。例如可以使用 DateDiff 计算两个日期相差的天数,或者当天到当年最后一天之间的星期数。 <br/>要计算 date1 和 date2 相差的天数,可以使用“一年的日数”(“y”)或“日”(“d”)。当 interval 为“一周的日数”(“w”)时,DateDiff 返回两个日期之间的星期数。如果 date1 是星期一,则 DateDiff 计算到 date2 之前星期一的数目。此结果包含 date2 而不包含 date1。如果 interval 是“周”(“ww”),则 DateDiff 函数返回日历表中两个日期之间的星期数。函数计算 date1 和 date2 之间星期日的数目。如果 date2 是星期日,DateDiff 将计算 date2,但即使 date1 是星期日,也不会计算 date1。 </p><p>如果 date1 晚于 date2,则 DateDiff 函数返回负数。 </p><p>firstdayofweek 参数会对使用“w”和“ww”间隔符号的计算产生影响。 </p><p>如果 date1 或 date2 是日期文字,则指定的年度会成为日期的固定部分。但是如果 date1 或 date2 被包括在引号 (" ") 中并且省略年份,则在代码中每次计算 date1 或 date2 表达式时,将插入当前年份。这样就可以编写适用于不同年份的程序代码。 </p><p>在 interval 为“年”(“yyyy”)时,比较 12 月 31 日和来年的 1 月 1 日,虽然实际上只相差一天,DateDiff 返回 1 表示相差一个年份。</p>

该用户从未签到

升级  30.8%

50
 楼主| 发表于 2006-2-24 09:20:32 | 只看该作者
<p><strong>存贮过程(SQL样版) </strong></p><hr/><p>今天发个SQL存贮过程给大家认识</p><p><br/>CREATE PROCEDURE login_verify</p><p>(<br/>@community_id int, --拿值<br/>@username varchar(20),<br/>@password varchar(40),<br/>@result tinyint output<br/>)</p><p>AS</p><p>set nocount ON</p><p><br/>declare @service_deadline_date smalldatetime,@community_setting_max_online_count int ---定义一个变量为 短日期格式</p><p>select @community_setting_max_online_count=community_setting_max_online_count,@service_deadline_date=service_deadline_date from community_info where community_id=@community_id --这里是求最大登录人数</p><p>if datediff(d,@service_deadline_date,getdate())&gt;10 --其实这个是限制用户的使用期,求当前日期与库中的记录日期如时大于10天,则返回@result =11<br/>begin<br/>set @result=11 --超过使用期<br/>return<br/>end</p><p><br/>if (select count(*) from online_user where =@community_setting_max_online_count"&gt;community_id=@community_id)&gt;=@community_setting_max_online_count --根据库中的记录设定与当前人数比较<br/>begin<br/>set @result=10 --超出在线人数限制 --返回@result=10<br/>return<br/>end</p><p><br/>declare @stamia int,@last_update_stamia_date smalldatetime,@level_id int --定义变量 整型 短日期型 整型<br/>declare @userid int ,@user_role int<br/>select @userid=userid,@user_role=user_role,@stamia=stamia,@last_update_stamia_date=last_update_stamia_date,@level_id=level_id from user_info where username=@username and password=@password and community_id=@community_id and user_type=0</p><p>--从用户信息表中,将一些信息写入到定义的三个变量中</p><p>if @userid is not null ----如果@userid 不变null值<br/>begin --用户名和密码校验成功<br/>set @result=1 --检验成功<br/>return<br/>end <br/>else<br/>begin<br/>set @result=0 ---登录失败<br/>end</p><p>set nocount OFF</p><p>GO</p><p>我们给上面的过程取个名login_verify叫做</p><p>写成是ASP代码中调用安全认证的地方</p><p>'''事先已经定义好conn</p><p>Set cmd.ActiveConnection=conn<br/>cmd.CommandText="login_verify"<br/>cmd.CommandType=&amp;H0004</p><p>@community_id int, --拿值<br/>@username varchar(20),<br/>@password varchar(40),<br/>@result int</p><p>cmd.Parameters.Append cmd.CreateParameter("@community_id",3)<br/>cmd.Parameters.Append cmd.CreateParameter("@username ",200)<br/>cmd.Parameters.Append cmd.CreateParameter("@password",200)</p><p>cmd("@community_id")=session("community_id")<br/>cmd("@username")=request("userid")<br/>cmd("@password")=request("userid")</p><p>cmd.execute</p><p>dim result</p><p>result=cmd("@result")</p><p>conn.close</p><p>if trim(result)="1" then</p><p></p><p>'''''''''''''登录成功的提示与操作</p><p>else</p><p>''''''''''''''''''''''登录失败的提示与操作</p><p>end if</p>
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

小黑屋|手机版|Archiver|信息系统项目管理师_软考交流平台. ( 鄂ICP备11002878号-1  公安备案号:42011102001150

GMT+8, 2025-7-5 22:43

Software by Discuz! X3.2

© 2001-2013 SKIN BY DSVUE

快速回复 返回顶部 返回列表