找找吧,water http://www.gogogo8.com/ver2 找找吧,water zh-cn null Thu, 16 Feb 2006 02:27:13 +0800 Copyright 2005 by 找找吧,water. All rights reserved. 找找吧,water 找找吧,water http://www.gogogo8.com/ver2/images/logo.gif http://www.gogogo8.com/ver2 http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=359<![CDATA[用ASP实现一个空间绑定多个域名]]>water编程开发Wed, 15 Feb 2006 00:47:43 +0800
<%if Request.ServerVariables(SERVER_NAME)=www.aaa.com then
response.redirect aaa/
else%>]]>

<%if Request.ServerVariables(SERVER_NAME)=www.aaa.com then
response.redirect aaa/
else%>
<%end if%>
<%if Request.ServerVariables(SERVER_NAME)=www.bbb.com then
response.redirect bbb/
else%>
<%end if%>

这样就跳转了两个不同的目录……理论上可以无限绑定域名跳转。


(2)一个简单的域名自动转向源代码

<%
if Request.ServerVariables(SERVER_NAME)=www.happyest.com then
response.redirect happyest/index.asp
else
response.redirect websites/
end if
%>

此ASP代码功能是当两个域名指向同一个主机时,可以自动重定向到相应的域名网站
]]>
http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=359http://www.gogogo8.com/ver2/trackback.asp?tbID=359http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=359#commenthttp://www.gogogo8.com/ver2/blogfeed.asp?logID=359
http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=355<![CDATA[介绍一个制作下拉菜单完全不同的办法]]>water编程开发Fri, 10 Feb 2006 09:08:03 +0800我是头一回知道这个方法,以前从没听用过,以前如果我从数据库里读出内容来制作下拉菜单的话都是用循环来做的,现在,让我们来看一下老外的办法。
利用RecordSet.GetString来制作动态下拉菜单。
adodb.recordset的getstring方法有一些BUG,但是你使用得小心一点的话它可以为您工作的很好。
先介绍一下GETSTRING的用法……如下: ]]>
我是头一回知道这个方法,以前从没听用过,以前如果我从数据库里读出内容来制作下拉菜单的话都是用循环来做的,现在,让我们来看一下老外的办法。
利用RecordSet.GetString来制作动态下拉菜单。
adodb.recordset的getstring方法有一些BUG,但是你使用得小心一点的话它可以为您工作的很好。
先介绍一下GETSTRING的用法……如下:
stringValue = rsObject.GetString( format, numRows, columnDelimiter, rowDelimiter, ifNull )
只要建立了RS对象,并且执行了相应操作,不管那是返回一条或者多条记录,甚至是空记录,getstring照样工作,但是如果不加注意的话,这个结果可能就不大好玩了,:P(这个老外也够幽默的)
FORMAT参数只有一个合法值,而且是可选的,让我们略过不管它,如果您想返回全部记录的话,那么那个numrows参数也可以不管它了(可选),IFNULL……照我的理解就象TSQL里的isnull函数差不多,如果是NULL,则随便搞个值替换它,所以也不管它。
剩下两个参数了。。。。不多说废话了,先看他们的例子


程序代码:[ 复制代码到剪贴板 ]
<TABLE Border=1>
<TR><TD>
<% = Response.Write rs.GetString( , , "</TD><TD>", "</TD></TR><TR>", ) %>
</TABLE>


这样写的HTML结果如下:

程序代码:[ 复制代码到剪贴板 ]
<TABLE Border=1>
<TR>
<TD>row1, field1 value</TD>
<TD>row1, field2 value</TD>
</TR>
<TR>
<TD>row2, field1 value</TD>
<TD>row2, field2 value</TD>
</TR>
<TR>
</TABLE>


这个也是老外口中说的那个BUG了,让我们看一下具体怎么做的


程序代码:[ 复制代码到剪贴板 ]
<%
Set RS = conn.Execute("SELECT theValue,theText FROM selectOptionsTable ORDER BY theText")
optSuffix = "</OPTION>" & vbNewLine
valPrefix = "<OPTION Value='"
valSuffix = "'>"
opts = RS.GetString( , , valSuffix, optSuffix & valPrefix, "--error--" )
' Next line is the key to it!
opts = Left( opts, Len(opts)-Len(valPrefix) )
Response.Write "<SELECT ...>" & vbNewLine
Response.Write valPrefix & opts
Response.Write "</SELECT>"
%>


你用过这种方法么,实话,我可从没见过,也没听有人说起,:(
附带一下,您如果想建立一个正确的表格的话,也就是我头上说的那个BUG,只要这样做就可以了:


程序代码:[ 复制代码到剪贴板 ]
<%
Set RS = conn.Execute("SELECT * FROM table")
tdSuffix = "</TD>" & vbNewLine & "<TD>
trPrefix = "<TR>" & vbNewLine & "<TD>"
trSuffix = "</TD>" & vbNewLine & "</TR>" & vbNewLine & "<TR>" & vbNewLine
opts = RS.GetString( , , tdSuffix, trSuffix & trPrefix, "--error--" )
' Next line is the key to it!
opts = Left( opts, Len(opts)-Len(trPrefix) )
Response.Write "<TABLE Border=1 CellPadding=5>" & vbNewLine
Response.Write trPrefix & opts
Response.Write "</TABLE>" & vbNewLine
%>


再介绍一个完全不同的办法。。。(我看了快昏倒)


程序代码:[ 复制代码到剪贴板 ]
<%
SQL = "SELECT '<OPTION Value=''',value,'''>',text,'</OPTION>' FROM table ORDER BY text"
Set RS = conn.Execute(SQL)
Response.Write "<SELECT>" & vbNewLine & RS.GetString(,,"",vbNewLine) & "</SELECT>"
%>


你用过吗。。。
看到了吗?可以直接从查询中返回结果。
再进一步,您可以这样做(ACCESS下我试过)


程序代码:[ 复制代码到剪贴板 ]
<%
SQL = "SELECT '<OPTION Value=''' & value & '''>' & text & '</OPTION>' FROM table ORDER BY text"
Set RS = conn.Execute(SQL)
Response.Write "<SELECT>" & vbNewLine & RS.GetString(,,"",vbNewLine) & "</SELECT>"
%>


……………………
:(
不多说了
希望能对你有所帮助

]]>
http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=355http://www.gogogo8.com/ver2/trackback.asp?tbID=355http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=355#commenthttp://www.gogogo8.com/ver2/blogfeed.asp?logID=355
http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=336<![CDATA[基于 Ajax 的无限级菜单]]>water编程开发Fri, 13 Jan 2006 14:15:32 +0800现在到处都有这方面的教程,我重点说一下我自己搞的一个框架。

特点:
支持Form的无闪提交(方法有点笨)]]>
现在到处都有这方面的教程,我重点说一下我自己搞的一个框架。

特点:
支持Form的无闪提交(方法有点笨)
支持MVC框架,即支持传统网页架构
多线程并发请求(要语言支持线程)
动态加载文件,只加载有用的!处理了Ajax框架臃肿的JS文件问题。
采用no table的全div + css布局

a. 获得XMLHTTPRequest对象,网上到处都找得到了,不多说:

程序代码:[ 复制代码到剪贴板 ]
function newXMLHttpRequest() {
var xmlreq = false;
if (window.XMLHttpRequest) {
xmlreq = new XMLHttpRequest();
} else if (window.ActiveXObject) {
try {
xmlreq = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e1) {
try {
xmlreq = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {
}
}
}
return xmlreq;
}



这里提供一个通用的支持多浏览器的方法。

b.提出异步请求

程序代码:[ 复制代码到剪贴板 ]
//这里用Bcandy作为方法名是为了感谢一个对我来说很重要的人,她一直在支持我
function Bcandy(Tid,url,parm,js) {
if(url == ""){
return;
}
//这是一个加载信息提示框,也可以不要!
document.getElementById("load").style.visibility = "visible";
//加载相应页面的JS文件
if(js != null){
//加载JS文件
LoadJS(js);
}
// 获取一个XMLHttpRequest实例
var req = newXMLHttpRequest();
// 设置用来从请求对象接收回调通知的句柄函数
var handlerFunction = getReadyStateHandler(req,Tid);
req.onreadystatechange = handlerFunction;
// 第三个参数表示请求是异步的
req."POST", url, true);
// 指示请求体包含form数据
req.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
// 发送参数
req.send(parm);
}

function getReadyStateHandler(req,Tid) {
// 返回一个监听XMLHttpRequest实例的匿名函数
return function () {
// 如果请求的状态是“完成”
if (req.readyState == 4) {
// 成功接收了服务器响应
if (req.status == 200) {
//下面一句是重点,这里显示了返回信息的内容部分,也可以加以修改。进行其它处理
document.getElementById(Tid).innerHTML = req.responseText;
document.getElementById(Tid).style.visibility = "visible";
//这一句是实现加载信息提示框的隐藏,也可以不要。
document.getElementById("load").style.visibility = "hidden";
} else {
// 有HTTP问题发生
document.getElementById("load").style.visibility = "hidden";
alert("HTTP error: "+req.status);
}
}
}
}


//动态加载JS文件
function LoadJS(file){
var head = document.getElementsByTagName('HEAD').item(0);
var script = document.createElement('SCRIPT');
script.src = file;
script.type = "text/javascript";
head.appendChild(script);
}


这就是基本的框架了,因为使用了request.responseText;所以,可以直接请求一个页面jsp,servlet但在使用Struts框架的请求时要进行特殊处理,因为Form不支持异步请求。建议在这些页面上不要加入<html><body>标签,就像.net里的asxm文件!而且在使用Struts框架时有点要注意的是,Mapping对象直接返回null就可以了,因为我们会在下面讲到并发多线程。来处理这个问题的。
总的来看,有点像是积木搭建起来的。这样方便文件的修改和扩展,互相之间并不影响,而且,实现了代码和标签分离。在进行传统页面改版时,也不用重新编写全部代码。只要修改一小部分就可以完美实现Ajax带来的无闪刷新快感。

以上代码均在IE,FIREFOX下测试过!


首先建立一个数据表menu

mId  菜单主键
name 菜单名称
url  菜单链接
father 低级菜单ID
sub  是否最底层菜单(用于判断是否还可以继续展开)
target 菜单链接目标(用ajax方式打开时作为显示id)
pa   菜单参数(这项用于ajax方式打开菜单)

制作一个菜单对象类

程序代码:[ 复制代码到剪贴板 ]
class Menu{
private int mId;
private String name;
...//其它成员

public getMid(){
return mId;
}
public setMid(int mId){
this.mId = mId;
}
....//其它成员的get set方法,
}


另一个是操作类

程序代码:[ 复制代码到剪贴板 ]
class MenuOpt(){
public Vector getMenus(int father){
Vector vector = new Vector();
//这里是取得父级菜单ID为father的全部菜单
//并封装进Vector的一个对象中。。
return vector;
}
}


其次就是一般的jsp文件了。但要注意以前说过的,不要包含<html><body>标签!
menu.jsp:

程序代码:[ 复制代码到剪贴板 ]
<%@page contentType="text/html; charset=GB2312"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!--前面用到了JSTL的标签定义(学JSP的强烈推荐!)-->
<jsp:useBean id="menu" scope="page" class="ycoe.basic.MenuOpt"/>
<jsp:setProperty name="menu" property="father" value="${param.father}"/>
<div>
<c:forEach var="m" items="${menu.vector}" varStatus = "c">
<c:choose>
<c:when test="${m.sub eq 'Y'}">
<div onClick="showMenu('${m.mid}','${m.url}','${m.target}','father=${m.mid}')">
<img src="pic/menu0.gif" id="img${m.mid}" alt="" style=" cursor:hand;">
<a href="#" class="text1">${m.name}</a>
</div>
<div style="display:none;" id="tr${m.mid}">
<div style="padding-left:12pt" id="${m.mid}"></div>
</div>
</c:when>
<c:otherwise>
<div onclick="enu('${m.url}','${m.target}','${m.pa}');">
<img src="pic/menu1.gif" id="img${m.mid}" alt="">
<a href="#" class="text1">${m.name}</a>
</div>
</c:otherwise>
</c:choose>
</c:forEach>
</div>


menu.js:

程序代码:[ 复制代码到剪贴板 ]
//operMenu(打开下拉菜单的ID,打开的地址,链接打开的目标,参数)。
//这是用在menu.jsp的方法
function showMenu(id,url,target,param){
var trObj = document.getElementById("tr"+id);
var tdObj = document.getElementById(id);
//try{
if(document.getElementById("tr"+id).style.display == "none"){
//显示菜单
if(tdObj.innerHTML == null || tdObj.innerHTML == ""){
//提取数据
document.getElementById("tr"+id).style.display = "";
document.getElementById("img"+id).src = "pic/menu2.gif"
Bcandy(id,"page/menu.jsp",param,"");
enu(url,target,param);
}else{
//如果里面有内容,直接显示
document.getElementById("tr"+id).style.display = "";
document.getElementById("img"+id).src = "pic/menu2.gif"
enu(url,target,param);
}
//Bcandy(target,url,param,"");//打开菜单链接
}else{
//隐藏菜单
document.getElementById("tr"+id).style.display = "none";
document.getElementById("img"+id).src = "pic/menu0.gif"
}
//}catch(e){}
}

//打开菜单
functionenu(url,target,param){
//这里不用我写了吧。有好几种实现方法,建议使用ajax实现!
}


最后是显示页面:


程序代码:[ 复制代码到剪贴板 ]
<%@ page contentType="text/html; charset=GB2312" %>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<style>
.text1:hover { border: 1px #999999 solid; background-color: #CCCCCC; height: 12px;}
.text1{border: 1px #FFFFFF solid; height: 12px;}
</style>
<script type="" src="js/Function.js"></script>
function ini(){
Bcandy("0","menu.jsp","id=0&father=0","menu.js");
}
</script>
<body onload="ini();">
<div id="load" style="z-index:1; color:#FF0000; visibility:hidden; filter: Alpha(opacity=85); background-color:#FFFFFF; left: 48%; top: 48%;BORDER-RIGHT: #000000 1px solid; PADDING-RIGHT: 12px; BORDER-TOP: #000000 1px solid; PADDING-LEFT: 12px;PADDING-BOTTOM: 12px; BORDER-LEFT: #000000 1px solid; LINE-HEIGHT: 22px; PADDING-TOP: 12px; BORDER-BOTTOM: #000000 1px solid; POSITION: absolute;">
<img src='pic/loop.gif' alt=""><br>
数据处理中,请稍候...
<br>
</div>
<div id="0" align="center">
</div>
</body>
</html>


可以看到,无论在哪个层面,都和传统的没什么分别,只有jsp部分除去文件头而已(其实不去掉也行的,呵呵),而且,还可以看到,一个页面,已经分成了好几部分。就像之前说的那样,积木式的(这是网上看到一篇关于.net框架的结构时作者提出的一种结构,觉得不错,被我应用到JSP来了)。

在一些细节方面,我作了一些保留,请理解。但大致框架都是经过IE和FireFox测试。一些功能方面的扩展,自己想想了。

原理:其实就是应用了页面递归!就和一般的递归方法一下,不过用在页面上而已


程序代码:[ 复制代码到剪贴板 ]
<div id="tr${m.id}">
循环,将从封装进vector的对象逐一显示出来
for{
 if(如果是最上层菜单sub=N){
 <div id="t${m.id}" onClick="ShowMenu(${m.father....})">
  显示菜单内容
 </div>
 <!--这里不显示内容,仅作为下一次的容器-->
 <div style="display:none" id="td${m.id....}"></div>
 }else{
  <div onClick="enu(${m.id})">显示菜单内容</div>
 }
}
</div>


showMenu(father,id....)方法,将根据传入的father去服务器里取得数据后,再次调用这个页面。而这时,是将页面的内容显示在新的ID里面。这样,看起来就有和MSDN里的树菜单一样的效果了。

优点:多级菜单多次获取,加快了反应速度,同时应用了ajax请求,让人感觉不到页面的闪烁,亲和力强。再者,可以JS里加入了代码,让用户不用每次点击都去获取服务器数据,而是先判断有没有内容,没有再取。。。同时,实现了菜单与页面的同步,在每打开一级菜单,都可以在相应的地方打开页面。同样,这个operMenu()也可以采用ajax方式。

效果可以上 http://www.start.com/ 看看


按此在新窗口打开图片

]]>
http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=336http://www.gogogo8.com/ver2/trackback.asp?tbID=336http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=336#commenthttp://www.gogogo8.com/ver2/blogfeed.asp?logID=336
http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=333<![CDATA[模拟QQ的下拉列表选择图象]]>water编程开发Thu, 12 Jan 2006 09:07:26 +0800[html]<html>
<head>
<title>模拟OICQ下拉头像</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> ]]>
程序代码:[ 运行 ] [ 复制代码到剪贴板 ]
]]>
http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=333http://www.gogogo8.com/ver2/trackback.asp?tbID=333http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=333#commenthttp://www.gogogo8.com/ver2/blogfeed.asp?logID=333
http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=323<![CDATA[仿DW8代码折叠的HTML编辑器]]>water编程开发Fri, 30 Dec 2005 12:46:59 +0800测试版(仅支持ie5.5+,且一个页面里只能放一个)
收集意见

功能:]]>
测试版(仅支持ie5.5+,且一个页面里只能放一个)
收集意见

功能:
1.动态分析,智能折叠,ctrl+Enter强制重建
2.tab键输出两个空格(若选区为多行,各行前加入两空格,同时按shift键反之),Ctrl+T替换\t为俩空格
3.回车自动缩进
4.Ctrl+W预览

限制:
1.取消了右键菜单(复制剪切粘贴可使用键盘)
2.暂不支持文本拖放
3.Ctrl+Z将撤销所有操作
4.块起止测试并不严格,且未考虑vbscript
5.运行效率有待改进

程序代码:[ 运行 ] [ 复制代码到剪贴板 ]


]]>
http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=323http://www.gogogo8.com/ver2/trackback.asp?tbID=323http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=323#commenthttp://www.gogogo8.com/ver2/blogfeed.asp?logID=323
http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=276<![CDATA[简洁的分页程序(模仿经典论坛的分页)]]>water编程开发Fri, 16 Dec 2005 17:14:04 +0800模仿经典论坛的分页程序(ASP,类)(部分功能未做,有心人自己会补齐的)查看演示

附带演示了最新的JGrid(JAVASCRIPT,以完全支持FireFox,有少许BUG)程序
]]>
模仿经典论坛的分页程序(ASP,类)(部分功能未做,有心人自己会补齐的)查看演示

附带演示了最新的JGrid(JAVASCRIPT,以完全支持FireFox,有少许BUG)程序


程序代码:[ 复制代码到剪贴板 ]
注意:使用本分页(类)程序的方法:
dim sql,rst
sql="select * from Properties"
set rst=server.CreateObject("ADODB.RecordSet")
'注:必须用法打开,conn.execute的不行
rst.sql,conn,1,1

dim myPagination
set myPagination =new pagination
myPagination.pageSize =20
mypagination.pageListCount =10
myPagination.setValue(rst)
set rst =myPagination.rst


源程序很短,所以很简单,只要用心读。

]]>
http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=276http://www.gogogo8.com/ver2/trackback.asp?tbID=276http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=276#commenthttp://www.gogogo8.com/ver2/blogfeed.asp?logID=276
http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=273<![CDATA[有趣人物为你讲述网站开发过程]]>water编程开发Fri, 16 Dec 2005 12:20:54 +0800译:老雕,视觉艺术互联 - http://www.artGlim.com/
这是一篇来至日本PingMag站点,网站开发过程的文章。
原文在此 http://www.pingmag.jp/2005/12/09/the-website-development-process/ 我的翻译能力有限,简略的翻译加上我的理解,见笑,建议英文较好的网友看看原文吧。
按此在新窗口打开图片]]>
译:老雕,视觉艺术互联 - http://www.artGlim.com/
这是一篇来至日本PingMag站点,网站开发过程的文章。
原文在此 http://www.pingmag.jp/2005/12/09/the-website-development-process/ 我的翻译能力有限,简略的翻译加上我的理解,见笑,建议英文较好的网友看看原文吧。
按此在新窗口打开图片

开发过程中三个角色:程序员,设计师和客户

步骤1:项目讨论

按此在新窗口打开图片
在接到项目后首先需要开项目开发讨论会,讨论网站的栏目,开发方向,文字内容和图片等等。

步骤2:激发灵感

按此在新窗口打开图片

考虑网站结构,认识客户中心思想要体现的内容,按客户需求展开创意的灵感。

步骤3:框架导航

按此在新窗口打开图片
程序员和设计师具体讨论网站整体制作

步骤4:项目计划


按此在新窗口打开图片
项目大概工作量和所需的时间,写成项目计划书给客户看。
步骤5:设计初稿

按此在新窗口打开图片
设计师作最基本的设计工作,主页和主要分页。

步骤6:客户反馈


按此在新窗口打开图片
客户对设计初稿提出建议。

步骤7:重新设计


按此在新窗口打开图片
跟据客户对设计初稿建议和项目需求,进行修改设计或重新设计。

步骤8:客户满意


按此在新窗口打开图片
经过:设计初稿-客户反馈-重新设计的过程,最后得到了客户的满意。

步骤9:其它页设计


按此在新窗口打开图片
最基本的设计同意, 您就能开始制作站点每个页的布局和设计。
步骤10:客户确认

按此在新窗口打开图片
再一次让客户反馈,得到最后确认。

步骤11:制作HTML


按此在新窗口打开图片
程序员将设计师制作出的页面,作成HTML页。

步骤12:…和CSS


按此在新窗口打开图片
对网站完成CSS和其它工作。

步骤13:交给客户


按此在新窗口打开图片
程序员,设计师完成的工作,交给客户反馈,直到站点完成。

步骤14:测试


按此在新窗口打开图片
项目最后阶段是测试。站点需要进行跨平台测试,解决所技术问题和错误。

步骤15:发布


按此在新窗口打开图片
最后收款,完成项目。

]]>
http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=273http://www.gogogo8.com/ver2/trackback.asp?tbID=273http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=273#commenthttp://www.gogogo8.com/ver2/blogfeed.asp?logID=273
http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=269<![CDATA[无组件生BMP图片验证码]]>water编程开发Thu, 15 Dec 2005 15:38:38 +0800
[code]<%
call com_creatvalidcode("validcode")
]]>

程序代码:[ 复制代码到剪贴板 ]
<%
call com_creatvalidcode("validcode")

sub com_creatvalidcode(psn)

'author: layen
'qq: 84815733
'e-mail: support

' 禁止缓存
response.expires = -9999
response.addheader "pragma","no-cache"
response.addheader "cache-ctrol","no-cache"
response.contenttype = "image/bmp"

randomize

dim i, ii, iii

const codds = 8 ' 杂点出现的机率
const camount = 36 ' 文字数量
const ccode = "abcdefghijklmnopqrstuvwxyz"

' 颜色的数据(字符,背景)
dim vcolordata(1)
vcolordata(0) = chrb(255) & chrb(102) & chrb(51) ' 蓝,绿,红
vcolordata(1) = chrb(250) & chrb(236) & chrb(211) ' 蓝250,绿236,红211(浅蓝色)

' 随机产生字符
dim vcode(4), vcodes
for i = 0 to 3
vcode(i) = int(rnd * camount)
vcodes = vcodes & mid(ccode, vcode(i) + 1, 1)
next

session(psn) = vcodes '记录入session

' 字符的数据
dim vnumberdata(35)
vnumberdata(0) = "0111"
vnumberdata(1) = "0111"
vnumberdata(2) = "0011"
vnumberdata(3) = "0111"
vnumberdata(4) = "0011"
vnumberdata(5) = "0111"
vnumberdata(6) = "0111"
vnumberdata(7) = "111011111111101111110111111111011111"
vnumberdata(8) = "0111"
vnumberdata(9) = "1111"
vnumberdata(10) = "0011"
vnumberdata(11) = "0111"
vnumberdata(12) = "111000001111011110111011111010111111"
vnumberdata(13) = "1111"
vnumberdata(14) = "0111"
vnumberdata(15) = "1111"
vnumberdata(16) = "111000011111011101111011110110111111"
vnumberdata(17) = "0011"
vnumberdata(18) = "110000011111011111110111111100000111"
vnumberdata(19) = "111000001111111110111011111000011111"
vnumberdata(20) = "0011"
vnumberdata(21) = "100011111101111111011110111000000011"
vnumberdata(22) = "0011"
vnumberdata(23) = "0111"
vnumberdata(24) = "1111"
vnumberdata(25) = "011110111100000111011111111000111111"
vnumberdata(26) = "1011"
vnumberdata(27) = "100000111100001111110101111111010011"
vnumberdata(28) = "0111"
vnumberdata(29) = "100000001110110110111111111110001111"
vnumberdata(30) = "011101110111011111011101111110001111"
vnumberdata(31) = "1111"
vnumberdata(32) = "100101001111010111110010011111101111"
vnumberdata(33) = "101011111010111111011101111000100011"
vnumberdata(34) = "101011111110101111110111111110001111"
vnumberdata(35) = "110000001111001111101110111100000011"

' 输出图像文件头
response.binarywrite chrb(66) & chrb(77) & chrb(230) & chrb(4) & chrb(0) & chrb(0) & chrb(0) & chrb(0) &_
chrb(0) & chrb(0) & chrb(54) & chrb(0) & chrb(0) & chrb(0) & chrb(40) & chrb(0) &_
chrb(0) & chrb(0) & chrb(40) & chrb(0) & chrb(0) & chrb(0) & chrb(10) & chrb(0) &_
chrb(0) & chrb(0) & chrb(1) & chrb(0)

' 输出图像信息头
response.binarywrite chrb(24) & chrb(0) & chrb(0) & chrb(0) & chrb(0) & chrb(0) & chrb(176) & chrb(4) &_
chrb(0) & chrb(0) & chrb(18) & chrb(11) & chrb(0) & chrb(0) & chrb(18) & chrb(11) &_
chrb(0) & chrb(0) & chrb(0) & chrb(0) & chrb(0) & chrb(0) & chrb(0) & chrb(0) &_
chrb(0) & chrb(0)

for i = 9 to 0 step -1 ' 历经所有行
for ii = 0 to 3 ' 历经所有字
for iii = 1 to 10 ' 历经所有像素
' 逐行、逐字、逐像素地输出图像数据
if rnd * 99 + 1 < codds then ' 随机生成杂点
response.binarywrite vcolordata(0)
else
response.binarywrite vcolordata(mid(vnumberdata(vcode(ii)), i * 10 + iii, 1))
end if
next
next
Next
end sub
%>


]]>
http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=269http://www.gogogo8.com/ver2/trackback.asp?tbID=269http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=269#commenthttp://www.gogogo8.com/ver2/blogfeed.asp?logID=269
http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=255<![CDATA[我自己原创的ACCESS数据库加密方法]]>water编程开发Sun, 11 Dec 2005 19:59:42 +0800加密,是用数据流加密数据库,而不是用明文密码。
别人下载下来数据库后,用普通的ACCESS解密软件看不见数据库密码。


文章标题:我自己原创的ACCESS数据库加密方法]]>
加密,是用数据流加密数据库,而不是用明文密码。
别人下载下来数据库后,用普通的ACCESS解密软件看不见数据库密码。


文章标题:我自己原创的ACCESS数据库加密方法
发布时间:本文是初发表于2005年4月14日 (注:在此,不是国内首发)
文章作者:翟振凯 (小琦)
交流方式:
个人站:http://www.xiaoqi.net
技术站:http://www.iisvs.net
商业站:http://www.iisvs.com
QQ:
关于本文:
本着互联网共享主义精神,特写此文献给建站新手,授人以鱼,不如授人以渔,本文所讲的只是方法和原理,希望大家看完此文,能够从中得到些帮助和启发。

声明:希望各位朋友转载时,不要把原有作者版权去掉,谢谢合作。
由于本人写作水平有限,写的不好的地方,还请大家多多包涵,如要批评或意见,请加我QQ。

程序代码:[ 复制代码到剪贴板 ]
<%
'本程序是翟振恺(小琦)原创的,现在我免费发布出来,请转用或转载时不要把版权去掉。
'本程序是针对不能用组件加密asp的用户写的,应该可以有效的保护ACCESS数据。
'QQ:
'个人站:http://www.xiaoqi.net
'技术站:http://www.iisvs.net
'商业站:http://www.iisvs.com


if Request("mdbname")<>"" then

'------------------------取磁盘序列号'-----------------作者:翟振恺(小琦) iisvs.com
set fs=server.createObject("scripting.filesystemobject")
testDrive="G:\"
set f=fs.getdrive(testDrive)
''调用GetDrive方法,将驱动器赋予一个变量

xlh=trim(f.serialnumber) '取到磁盘序列号

'-------------------------取绑定的网站地址'-----------------作者:翟振恺(小琦) iisvs.com
myname=Request.ServerVariables("SERVER_NAME")'我绑定我的主机名

'-------------------------取二进制数据'-----------------作者:翟振恺(小琦) iisvs.com
url=server.MapPath(http://www.gogogo8.com/spacer.gif)&"\www.xiaoqi.net" '取一个exe文件或其它的文件作为提供加密的文件,为了安全,你可以把这个文件放到别人下载不到的地方。
Set fso=Server.CreateObject("Scripting.FileSystemObject")
Set fl=fso.getfile(url)
flsize=fl.size
flName=fl.name
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.
objStream.Type = 1
objStream.LoadFromFile url
Password=objStream.Read'二进制数据
Password=left(Password,4)&right(xlh,3)&myname'数据库密码用二进制数据+磁盘序列号+绑定的网站地址
Password=left(Password,19)'ACCESS数据库密码好像最多20个字符,我用了19个
db="xq.mdb"
SavePath=Server.MapPath(".")
'-----------------------------------------作者:翟振恺(小琦) iisvs.com
    Application.Contents.RemoveAll()
    
    Dim fs, Engine
    Set fs = CreateObject("Scripting.FileSystemObject")
    mdbname = Request("mdbname")
    If fs.FileExists(Server.Mappath(mdbname)) Then
        Set Engine = CreateObject("JRO.JetEngine")
'----------------------------------------------------改数据库密码    
if request("dz")=1 then    
Engine.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.Mappath(mdbname), "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password="&Password&";Data Source=" & Server.Mappath(mdbname & ".temp")
else
Engine.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password="&Password&";Data Source=" & Server.Mappath(mdbname), "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.Mappath(mdbname & ".temp")
end if
'----------------------------------------------------改数据库密码        
        fs.CopyFile Server.Mappath(mdbname & ".temp"),Server.Mappath(mdbname)
        fs.DeleteFile(Server.Mappath(mdbname & ".temp"))
        Set fs = Nothing
        Set Engine = nothing
        if request("dz")=1 then    
        Response.write "<p><font color=#FF0000>数据库加密成功!...</font>"
        Else
        Response.write "<p><font color=#FF0000>数据库解密成功!...</font>"
        end if

    Else        
        Set fs = Nothing
        Response.Write "<p><br><br>数据库名称或路径不正确. 压缩失败!" & vbCrLf
    End If


end if
%>

<form method="POST" action="--WEBBOT-SELF--">
    <p><b>加密解密码数据库</b></p>
    <p><input type="text" name="mdbname" size="20" value="测试.mdb"> 数据库名</p>
    <p><input type="radio" value="1" name="dz" checked>加密
    <input type="radio" value="2" name="dz">解密</p>
    <p><input type="submit" value="提交" name="B1"><input type="reset" value="重置" name="B2"></p>
</form>


连接加密后的数据库的方法:


程序代码:[ 复制代码到剪贴板 ]
<b>测试数据库连接</b>
<!-- 绑定域名和数据库,绑磁盘序列号的我没做,其实也很简单 -->
<%
db="测试.mdb"
%><!-- 下面这句是加密函数 --><%

'------------------------取磁盘序列号----------------------------小琦
set fs=server.createObject("scripting.filesystemobject")
testDrive="G:\"
set f=fs.getdrive(testDrive)
''调用GetDrive方法,将驱动器赋予一个变量

xlh=trim(f.serialnumber) '取到磁盘序列号

'-------------------------取绑定的网站地址---------------------------小琦
myname=Request.ServerVariables("SERVER_NAME")'我绑定我的主机名

'-------------------------取二进制数据---------------------------小琦
url=server.MapPath(http://www.gogogo8.com/spacer.gif)&"\www.xiaoqi.net" '取一个exe文件或其它的文件作为提供加密的文件,为了安全,你可以把这个文件放到别人下载不到的地方。
Set fso=Server.CreateObject("Scripting.FileSystemObject")
Set fl=fso.getfile(url)
flsize=fl.size
flName=fl.name
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.
objStream.Type = 1
objStream.LoadFromFile url
Password=objStream.Read'二进制数据
Password=left(Password,4)&right(xlh,3)&myname'数据库密码用二进制数据+磁盘序列号+绑定的网站地址
Password=left(Password,19)'ACCESS数据库密码好像最多20个字符,我用了19个


%><!-- 下面是连接数据库 --><%


dim conn
Set conn = Server.CreateObject("ADODB.Connection")
conn."Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password="&Password&";Data Source=" & server.MapPath(db)

set rs = conn.execute("select * from [test] order by id desc ")

response.write rs("name")
conn.close
conn=noting
%>
]]>
http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=255http://www.gogogo8.com/ver2/trackback.asp?tbID=255http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=255#commenthttp://www.gogogo8.com/ver2/blogfeed.asp?logID=255
http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=253<![CDATA[ASP中的时间函数]]>water编程开发Fri, 09 Dec 2005 09:22:54 +0800Date 函数
描述:返回当前系统日期。
语法:Date
]]>
Date 函数
描述:返回当前系统日期。
语法:Date

DateAdd 函数
描述:返回已添加指定时间间隔的日期。
语法:DateAdd(interval, number, date)
interval: 必选。字符串表达式,表示要添加的时间间隔。有关数值,请参阅“设置”部分。
number: 必选。数值表达式,表示要添加的时间间隔的个数。数值表达式可以是正数(得到未来的日期)或负数(得到过去的日期)。
date: 必选。Variant 或要添加 interval 的表示日期的文字。
interval 参数可以有以下值:
yyyy (年) 、q (季度) 、m (月) 、y (一年的日数) 、d (日) 、w (一周的日数) 、ww (周) 、h (小时) 、n (分钟) 、s (秒)
说明:可用 DateAdd 函数从日期中添加或减去指定时间间隔。例如可以使用 DateAdd 从当天算起 30 天以后的日期或从现在算起 45 分钟以后的时间。要向 date 添加以“日”为单位的时间间隔,可以使用“一年的日数”(“y”)、“日”(“d”)或“一周的日数”(“w”)。
DateAdd 函数不会返回无效日期。如下示例将 95 年 1 月 31 日加上一个月:
NewDate = DateAdd("m", 1, "31-Jan-95")
在这个例子中,DateAdd 返回 95 年 2 月 28 日,而不是 95 年 2 月 31 日。如果 date 为 96 年 1 月 31 日,则返回 96 年 2 月 29 日,这是因为 1996 是闰年。
如果计算的日期是在公元 100 年之前则会产生错误。
如果 number 不是 Long 型值,则在计算前四舍五入为最接近的整数。

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

DatePart 函数
描述:返回给定日期的指定部分。
语法:DatePart(interval, date[, firstdayofweek[, firstweekofyear>)
DatePart: 函数的语法有以下参数:
interval: 必选。字符串表达式,表示要返回的时间间隔。有关数值,请参阅“设置”部分。
date: 必选。要计算的日期表达式。
firstdayof week: 可选。指定星期中的第一天的常数。如果没有指定,则默认为星期日。有关数值,请参阅“设置”部分。
firstweekofyear: 可选。指定一年中第一周的常数。如果没有指定,则默认为 1 月 1 日所在的星期。有关数值,请参阅“设置”部分。
interval 参数可以有以下值:
yyyy (年) 、q (季度) 、m (月) 、y (一年的日数) 、d (日) 、w (一周的日数) 、ww (周) 、h (小时) 、n (分钟) 、s (秒)
firstdayofweek 参数可以有以下值:
(以下分别为:常数 值 描述)
vbUseSystem 0 使用区域语言支持 (NLS) API 设置。
vbSunday 1 星期日(默认)
vbMonday 2 星期一
vbTuesday 3 星期二
vbWednesday 4 星期三
vbThursday 5 星期四
vbFriday 6 星期五
vbSaturday 7 星期六
firstweekofyear 参数可以有以下值:
(以下分别为:常数 值 描述)
vbUseSystem 0 使用区域语言支持 (NLS) API 设置。
vbFirstJan1 1 由 1 月 1 日所在的星期开始(默认)。
vbFirstFourDays 2 由在新年中至少有四天的第一周开始。
vbFirstFullWeek 3 由在新的一年中第一个完整的周(不跨年度)开始。
说明:DatePart 函数用于计算日期并返回指定的时间间隔。例如使用 DatePart 计算某一天是星期几或当前的时间。
firstdayofweek 参数会影响使用“w”和“ww”间隔符号的计算。
如果 date 是日期文字,则指定的年度会成为日期的固定部分。但是如果 date 被包含在引号 (" ") 中,并且省略年份,则在代码中每次计算 date 表达式时,将插入当前年份。这样就可以编写适用于不同年份的程序代码。

DateSerial 函数
描述:对于指定的年、月、日,返回 Date 子类型的 Variant。
语法:DateSerial(year, month, day)
year: 从 100 到 9999 之间的数字或数值表达式。
month: 任意数值表达式。
day: 任意数值表达式。
说明:要指定日期,如 1991 年 12 月 31 日,DateSerial 函数中每个参数的取值范围都应该是可接受的;即日的取值应在 1 和 31 之间,月的取值应在 1 和 12 之间。但是,也可以使用表示某日之前或之后的年、月、日数目的数值表达式为每个参数指定相对日期。
以下样例中使用了数值表达式代替绝对日期。在这里,DateSerial 函数返回 1990 年 8 月 1 日之前十年 ) 零两个月 (8 - 2) 又一天 (1 - 1) 的日期:即 1980 年 5 月 31 日。
DateSerial, 8 - 2, 1 - 1)
对于 year 参数,若取值范围是从 0 到 99,则被解释为 1900 到 1999 年。对于此范围之外的 year 参数,则使用四位数字表示年份(例如 1800 年)。
当任何一个参数的取值超出可接受的范围时,则会适当地进位到下一个较大的时间单位。例如,如果指定了 35 天,则这个天数被解释成一个月加上多出来的日数,多出来的日数取决于其年份和月份。但是如果参数值超出 -32,768 到 32,767 的范围,或者由三个参数指定(无论是直接还是通过表达式指定)的日期超出了可以接受的日期范围,就会发生错误。

DateValue 函数
描述:返回 Date 子类型的 Variant。
语法:DateValue(date)
date 参数应是字符串表达式,表示从 100 年 1 月 1 日到 9999 年 12 月 31 日中的一个日期。但是,date 也可以是表示上述范围内的日期、时间或日期时间混合的任意表达式。
说明:如果 date 参数包含时间信息,则 DateValue 不会返回时间信息。但是如果 date 包含无效的时间信息(如 "89:98"),就会出现错误。
如果 date 是某一字符串,其中仅包含由有效的日期分隔符分隔开的数字,则 DateValue 将会根据为系统指定的短日期格式识别月、日和年的顺序。DateValue 还会识别包含月份名称(无论是全名还是缩写)的明确日期。例如,除了能够识别 12/30/1991 和 12/30/91 之外,DateValue 还能识别 December 30, 1991 和 Dec 30, 1991。
如果省略了 date 的年份部分,DateValue 将使用计算机系统日期中的当前年份。

Day 函数
描述:返回 1 到 31 之间的一个整数(包括 1 和31),代表某月中的一天。
语法:Day(date)
date 参数是任意可以代表日期的表达式。如果 date 参数中包含 Null,则返回 Null。

FormatDateTime 函数
描述:返回表达式,此表达式已被格式化为日期或时间。
语法:FormatDateTime(Date[,NamedFormat])
Date: 必选。要被格式化的日期表达式。
NamedFormat: 可选。指示所使用的日期/时间格式的数值,如果省略,则使用 vbGeneralDate。
NamedFormat 参数可以有以下值:
(以下分别为:常数 值 描述)
vbGeneralDate 0 显示日期和/或时间。如果有日期部分,则将该部分显示为短日期格式。如果有时间部分,则将该部分显示为长时间格式。如果都存在,则显示所有部分。
vbLongDate 1 使用计算机区域设置中指定的长日期格式显示日期。
vbShortDate 2 使用计算机区域设置中指定的短日期格式显示日期。
vbLongTime 3 使用计算机区域设置中指定的时间格式显示时间。
vbShortTime 4 使用 24 小时格式 (hh:mm) 显示时间。

Hour 函数
描述:返回 0 到 23 之间的一个整数(包括 0 和 23),代表一天中的某一小时。
语法:Hour(time)
time 参数是任意可以代表时间的表达式。如果 time 参数中包含 Null,则返回 Null。

Minute 函数
描述:返回 0 到 59 之间的一个整数(包括 0 和59),代表一小时内的某一分钟。
语法:Minute(time)
time 参数是任意可以代表时间的表达式。如果 time 参数包含 Null,则返回 Null。

Month 函数
描述:返回 1 到 12 之间的一个整数(包括 1 和 12),代表一年中的某月。
语法:Month(date)
date 参数是任意可以代表日期的表达式。如果 date 参数中包含 Null,则返回 Null。

MonthName 函数
描述:返回表明指定月份的字符串。
语法:MonthName(month[, abbreviate])
month: 必选。月份的数值定义。例如,一月是 1,二月是 2,以此类推。
abbreviate: 可选。Boolean 值,表明月份名称是否简写。如果省略,默认值为 False,即不简写月份名称。

Now 函数
描述:根据计算机系统设定的日期和时间返回当前的日期和时间值。
语法:Now

Second 函数
描述:返回 0 到 59 之间的一个整数(包括 1 和 59),代表一分钟内的某一秒。
语法:Second(time)
time 参数是任意可以代表时间的表达式。如果 time 参数中包含 Null,则返回 Null。

Time 函数
描述:返回 Date 子类型 Variant,指示当前系统时间。
语法:Time

TimeSerial 函数
描述:返回一个 Date 子类型的 Variant,含有指定时、分、秒的时间。
语法:TimeSerial(hour, minute, second)
hour: 其值为从 0 (12:00 A.M.) 到 23 (11:00 P.M.) 的数值或数值表达式。
minute: 任意数值表达式。
second: 任意数值表达式。
说明:要指定一时刻,如 11:59:59,TimeSerial 的参数取值应在可接受的范围内;也就是说,小时应介于 0-23 之间,分和秒应介于 0-59 之间。但是,可以使用数值表达式为每个参数指定相对时间,这一表达式代表某时刻之前或之后的时、分或秒数。以下样例中使用了表达式代替绝对时间数。TimeSerial 函数返回中午之前六小时 (12 - 6) 十五分钟的时间 (-15),即 5:45:00 A.M.。
TimeSerial(12 - 6, -15, 0)
当任何一个参数的取值超出可接受的范围时,它会正确地进位到下一个较大的时间单位中。例如,如果指定了 75 分钟,则这个时间被解释成一小时十五分钟。但是,如果任何一个参数值超出 -32768 到 32767 的范围,就会导致错误。如果使用三个参数直接指定的时间或通过表达式计算出的时间超出可接受的日期范围,也会导致错误。

TimeValue 函数
描述:返回包含时间的 Date 子类型的 Variant。
语法:TimeValue(time)
time 参数通常是代表从 0:00:00 (12:00:00 A.M.) 到 23:59:59 (11:59:59 P.M.) 的字符串表达式(包括 0:00:00 和 23:59:59)。不过,time 也可以是代表该范围内任何时间的表达式。如果 time 参数包含 Null,则返回 Null。
说明:可以采用 12 或 24 小时时钟格式输入时间。例如 "2:24PM" 和 "14:24" 都是有效的 time 参数。
如果 time 参数包含日期信息, TimeValue 函数并不返回日期信息。然而,如果 time 参数包含无效的日期信息,则会出现错误。

Weekday 函数
描述:返回代表一星期中某天的整数。
语法:Weekday(date, [firstdayofweek])
date: 可以代表日期的任意表达式。如果 date 参数中包含 Null,则返回 Null。
firstdayofweek: 指定星期中第一天的常数。如果省略,默认使用 vbSunday。
firstdayofweek 参数有如下设置:
(以下分别为:常数 值 描述)
vbUseSystem 0 使用区域语言支持 (NLS) API 设置。
vbSunday 1 星期日
vbMonday 2 星期一
vbTuesday 3 星期二
vbWednesday 4 星期三
vbThursday 5 星期四
vbFriday 6 星期五
vbSaturday 7 星期六
Weekday 函数返回如下值:
(以下分别为:常数 值 描述)
vbSunday 1 星期日
vbMonday 2 星期一
vbTuesday 3 星期二
vbWednesday 4 星期三
vbThursday 5 星期四
vbFriday 6 星期五
vbSaturday 7 星期六

WeekdayName 函数
描述:返回一个字符串,表示星期中指定的某一天。
语法:WeekDayName(weekday, abbreviate, firstdayofweek)
weekday: 必选。星期中某天的数值定义。各天的数值定义取决于 firstdayofweek 参数设置。
abbreviate: 可选。Boolean 值,指明是否缩写表示星期各天的名称。如果省略, 默认值为 False,即不缩写星期各天的名称。
firstdayofweek: 可选。指明星期第一天的数值。关于数值,请参阅“设置”部分。
firstdayofweek 参数有以下值:
(以下分别为:常数 值 描述)
vbUseSystem 0 使用区域语言支持 (NLS) API 设置。
vbSunday 1 星期日(默认)
vbMonday 2 星期一
vbTuesday 3 星期二
vbWednesday 4 星期三
vbThursday 5 星期四
vbFriday 6 星期五
vbSaturday 7 星期六

Year 函数
描述:返回一个代表某年的整数。
语法:Year(date)
date 参数是任意可以代表日期的参数。如果 date 参数中包含 Null,则返回 Null。
]]>
http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=253http://www.gogogo8.com/ver2/trackback.asp?tbID=253http://www.gogogo8.com/ver2/Blog/blogview.asp?logID=253#commenthttp://www.gogogo8.com/ver2/blogfeed.asp?logID=253