2007年04月10日

下面是一篇参考资料,来自于vckbase(注:文中的.net指的是Visual C++.net):

正则表达式简介

翻译:NorthTibet

原文出处:Regular Expressions


  有些新手对正则表达式不是很熟悉,有必要在此作一简单回顾。如果你是正则表达式高手,可以不用看这一部分。
  正则表达式是描述字符串集的字符串。例如,正则表达式“Mic*”描述所有包含“Mic”,后跟零个或多个字符的字符串。Mickey、Microsoft、Michelangelo 或 Mic 本身都是例子。句号“.”匹配任何字符,“+”类似“*”,但至少要一个字符,所以“Mic+”匹配前述所有除“Mic”以外的串。[a-z]指一个匹配范围,所以[a-zA-Z_0-9]匹配字母、数字或下划线。Regex 称之为单词字符,可以将它写成“\w”。所以“\w+”匹配至少有一个字符的单词字符序列——换句话说,叫 C 符号(C tokens)。那么这样一来,几乎所有的C 符号都不能以数字开头,因此,下面这个正则表达式是正确的:“^[a-zA-Z_]\w*$”。专用字符“^”意思是“以…开始”(除非它位于某个范围之内,这时它的意思是“非”),“$”意思是“结尾”,那么“^[a-zA-Z_]\w*$”意思就是:以字母或下划线开始的字母、数字或下划线字符串。
  正则表达式在对输入进行有效性验证时非常有用。\d 匹配数字,{n}匹配重复n次,于是 ^5\d{15}$ 匹配5开头的16位数字,也即是说 MasterCard 信用卡号码。那 ^[45]\d{15}$ 就是Visa 卡号,它以4开头。你可以用大括弧对表达式进行分组,下面是个测试。这个表达式描述的是什么呢?

^\d{5}(-\d{4}){0,1}$

提示:{0,1} 意思是重复0次或1次(可以缩写成问号 ?)。想出来了吗?该表达式意思是:五个数字后重复0次或1次(破折号后跟四个数字)。它匹配 02142和98007-4235,但不匹配 3245 或 2345-98761。这也就是美国的邮政编码。大括弧将 ZIP+4 部分分组,所以{0,1}修饰符将应用于整个分组。
  以上我仅浅尝即止地说明了正则表达式能做什么。我还没提到替换,由于我没有具体资料,所以不敢描述在 Unicode 中会怎么样。但你能感觉到正则表达式有多么强大。多年来它们乃 UNIX 的中流砥柱,并且在Web 编程和 Perl 这样的语言中更臻完善,其对 HTML 的操作几乎完全是对文本的处理。正则表达式在 Windows 中一直没有得到充分使用,直到 .NET 框架面世,它才正式成为 Windows 家族的一员。

框架 Regex 类

.NET 框架用 Regex 类实现正则表达式,并有三个支持类:Match、Group 和 Capture (参见 Figure A)。典型情况下,你创建 Regex 并用输入串调用 Regex::Match 来获得第一个 Match,或用 Regex::Matches 来获取所有匹配:

Regex *r = new Regex("\b\w+\b");
MatchCollection* mc =
  r->Matches("abc ,_foo ,<& mumble7");
for (int i=0; i<mc->Count; i++) {
   Match *m = mc->Index(i);
   Console.WriteLine(m->Value);
}

  这将显示“abc”,“foo”和“mumble7”,每个匹配在一行。这个例子引入了一个专门的字符 \b,所谓锚或原子零宽度断言,就像 ^(开始)和$(结尾)。\b 指定某个单词的边界,所以“\b\w+\b”意思是用单词分隔的一个或多个单词字符。
 

 

 

Figure A Regex 类

  正则表达式中的每个括弧表达式都构成一个 Group。Regex::Groups 返回作为集合的 Groups,它决不会是空,因为整个正则表达式本身即是一组。Groups 很重要,因为它们使你进行逻辑 OR 匹配,如“(ying|yong)”,它们使你将限定符应用到子表达式,并让你吸取匹配的单独部分。正文的 Figure 1 中我的 RegexTest 程序运行后用邮编为例显示分组。
  在所有函数中最强大的函数要数 Regex::Replace,它使得正则表达式的威力惊人地强大。和许多开发人员一样,过去在多次传递字符串到多行编辑控件之前,我常常不得不手工将 “\n” 转换为“\r\n”,但使用 Regex::Replace,这个操作简直易如反掌。

s = Regex::Replace(s,"\n","\r\n");

 

  Regex::Match 和 Replace 具备静态重载,所以你可以不用创建对象,以快速使用正则表达式。我最喜欢的 Regex::Replace 重载之一是带有一个委托参数,使你能用过程代码动态计算替换文本——参见正文中那个有趣的例子。


Micsoft 的.net已经支持正则表达式,使用框架类Regex即可。如果使用正则表达式替换符合规则的字符串,在Visual C++.net和Visual C# .net中的使用还有一些小的差别。

1. Visual C++.net

命名空间的使用:using namespace System::Text::RegularExpressions;

String *s = "test text sample for regular expression";

(1)定义对象:Regex *rx = new Regex("t[^ ]* ");//匹配以t开始的字符串,紧跟着0到n个非空格字符,直到遇到空格结束

完成匹配替换:s = rx->Replace(s,"");//匹配到以后,删除

(2)也可直接使用静态函数Replace完成以上操作:

s = Regex::Replace(s, "t[^ ]* ","");

2. Visual C#.net

命名空间的使用:using System.Text.RegularExpressions;

String s = "test text sample for regular expression";

(1)定义对象:Regex rx = new Regex("t[^ ]* ");//匹配以t开始的字符串,紧跟着0到n个非空格字符,直到遇到空格结束

完成匹配替换:s = rx.Replace(s,"");//匹配到以后,删除

(2)使用静态函数Regex::Replace来完成

s = Regex.Replace(s,"t[^ ]* ","");

说明:两者的差别,主要是语法规则的差别。

 

2007年04月09日
免费站内搜索代码——网罗目前最好的站内搜索代码,方便适用各网站内部网页搜索
——————————————————————————-
网站栏目及相关内容:

百度baidu搜索站内免费搜索代码:
——————————————————————————–
·百度向网友开放免费下载百度搜索代码。
·只需将以下代码之一加入到您的网页中,您的网站即可获得百度搜索引擎一样强大的搜索功能!
使用本段代码时,您只需要用您的网站地址替换代码中"www.example.com"即可实现站内搜索功能。
HTML代码: 

<SCRIPT language=javascript>
function g(formname) {
var url = "http://www.baidu.com/baidu";
if (formname.s[1].checked) {
formname.ct.value = "2097152";
}
else {
formname.ct.value = "0";
}
formname.action = url;
return true;
}
</SCRIPT>
<form name="f1" onsubmit="return g(this)">
<table bgcolor="#FFFFFF" style="font-size:9pt;">
<tr height="60"><td valign="top"><img src="http://img.baidu.com/img/logo-137px.gif" border="0" alt="baidu"></td>
<td>
<input name=word size="30" maxlength="100">
<input type="submit" value="百度搜索"><br>
<input name=tn type=hidden value="bds">
<input name=cl type=hidden value="3">
<input name=ct type=hidden>
<input name=si type=hidden value="www.example.com">
<input name=s type=radio> 互联网
<input name=s type=radio checked> www.example.com
</td></tr></table>
</form>

Google 免费:让用户搜索您的网站
——————————————————————————–
您的网页也想拥有 Google 搜索吗,您希望让用户搜索您网站上的内容吗?您只须将下面代码片断添加在您的网站上,并且将 “YOUR DOMAIN” 换成您自己的域名,比如 http://news.google.com,就可以实现站内搜索。
您可以根据个人品味对其进行修改,如取消居中,调整其宽度,或改变背景颜色,等等。(但请注意,Google 徽标的背景是白色,而不是透明。)如果您喜欢具有其它背景颜色或大小的 Google 徽标,这里有不同的徽标贴图可供选用。您可以将其中任何徽标替换到以下搜索代码中。
注意:如果您的网站编码不是 GB2312,您需要将代码中的两个 GB2312 换成您网站的编码,比如 Big5。

<!– SiteSearch Google –>
<form method=get action="http://www.google.com/search">
<table bgcolor="#FFFFFF"><tr><td>
<a href="http://www.google.com/">
<img src="http://www.google.com/logos/Logo_40wht.gif" 
border="0" alt="Google"></a>
</td>
<td>
<input type=text name=q size=31 maxlength=255 value="">
<input type=hidden name=ie value=GB2312>
<input type=hidden name=oe value=GB2312>
<input type=hidden name=hl value=zh-CN>
<input type=submit name=btnG value="Google 搜索">
<font size=-1>
<input type=hidden name=domains value="YOUR DOMAIN NAME"><br>
<input type=radio name=sitesearch value=""> 搜索WWW 
<input type=radio name=sitesearch value="YOUR DOMAIN NAME" checked> 搜索YOUR DOMAIN NAME
</font>
</td></tr></table>
</form>
<!– SiteSearch Google –> 

雅虎yahoo搜索站内免费搜索代码:
——————————————————————————–
将以下HTML代码放入您的网页中即可进行站内检索(需将www.example.com换成您网站的域名)
<!–Begin of Y!Search –><form method="get" action="http://www.yahoo.com.cn/search"><a href="http://www.yahoo.com.cn" target="_blank"><img src="http://cn.yimg.com/search/yisou/aliya/pagerlogo.gif" width="50" height="30" border="0"/></a><input type="text" name="p" size="30" maxlength="50"><input type="submit" value="在 www.example.com 站内搜索" name="submit"><input type="hidden" name="vs" value="www.example.com"><input type="hidden" name="source" value="site_search"></form><!–End of Y!Search –>

腾讯搜搜SOSO站内免费搜索代码:
——————————————————————————–
将以下HTML代码放入您的网页中即可进行站内检索(需将www.example.com换成您网站的域名)
<!–Begin of Search QQ –><form method="get" action="http://www.soso.com/q" target=_blank><a href="http://www.soso.com" target="_blank"><img src="http://wcache.soso.com/www/images/public/soso_logo.gif" border="0" align="absbottom"></a><input type="text" name="w" size="30" maxlength="50"><input type="hidden" name="sc" value="site"><input type="submit" value="在 www.example.com 站内搜索"><input type="hidden" name="site" value="www.example.com"><input type="hidden" name="ch" value="website"></form><!–End of Search QQ –>

MSN 搜索站内免费搜索代码:
——————————————————————————–
若要使访问者可以搜索站点上的内容,请向网页中添加以下代码:

<!– Site search from MSN –><form method="get" action="http://search.msn.com.cn/results.aspx"> <input type="hidden" name="cp" value="CODE PAGE USED BY YOUR HTML PAGE"/> <input type="hidden" name="FORM" value="FREESS"/><table bgcolor="#FFFFFF"><tr><td><a href="http://search.msn.com.cn/"><img src="http://search.msn.com.cn/s/affillogo.gif" border="0" ALT="MSN 搜索"/></a></td><td>
<input type="text" name="q" size="30" /><input type="submit" value="Search Site"/> <input type="hidden" name="q1" value="site:YOUR DOMAIN NAME GOES HERE"/> </td></tr></table></form><!– Site Search from MSN –>

重要提示! 以下代码中,需要用 3 位或 4 位代码页数字替换“您的 HTML 页使用的代码页”,此代码页用来显示网站语言。 

例如,如果您的网站是简体中文,应该用数字 936 替换此说明文字。代码如下: 

value="936"

所有语言的代码页值,请看 Windows 支持的代码页。

TOM 搜索站内免费搜索代码:
——————————————————————————–
使用本段代码时,您只需要用您的网站地址替换代码中"www.example.com"即可实现站内搜索功能

JS代码:

<script language="JavaScript" src="http://ad.tom.com/search/style03.js"></script>

HTML代码:

<SCRIPT language=javascript>
<!–
function go(formname)
{
var url = "http://search.tom.com/search.php?";
formname.method = "get";
if (formname.myselectvalue.value == "1") {
document.search_form1.word.value = document.search_form1.word.value+" site:www.example.com";
}
formname.action = url;
return true;
}
//–>
</SCRIPT>
<form name="search_form1" target="_blank" onsubmit="return go(this)">
<input name=word size="30" value="请输入要查找的关键字" onMouseOver="this.focus()" onBlur="if (value ==”){value=’请输入要查找的关键字’}" onFocus="this.select()" onClick="if(this.value==’请输入要查找的关键字’)this.value=”">
<input type="submit" value="TOM搜索"><br>
<INPUT name=myselectvalue type=hidden value=0>
<INPUT CHECKED name=myselect onclick=javascript:this.form.myselectvalue.value=0; type=radio value=0>
<FONT color=#0000cc style="FONT-SIZE: 12px">互联网</FONT> 
<INPUT name=myselect onclick=javascript:this.form.myselectvalue.value=1; type=radio value=1>
<FONT color=#ff0000 style="FONT-SIZE: 12px">www.example.com</FONT> 
</form>

以下是我自己修改的Google的站内搜索代码:

<!– SiteSearch Google –>
<FORM action=http://www.google.com/search method=get>
<TABLE cellSpacing=2 cellPadding=0 bgColor=#ffffff>
<TBODY>
<TR>
<TD style="DISPLAY: none; VISIBILITY: hidden" noWrap><INPUT type=hidden value=GB2312 name=ie> <INPUT type=hidden value=GB2312 name=oe> <INPUT type=hidden value=zh-CN name=hl> <INPUT type=hidden value="http://xxx.xxx.xxx" name=domains> <INPUT type=hidden CHECKED value="Domain name" name=sitesearch> </TD></TR>
<TR>
<TD><INPUT maxLength=255 name=q> </TD></TR>
<TR>
<TD noWrap><INPUT type=submit value=google搜索 name=btnG> </TD></TR></TBODY></TABLE></FORM><!– SiteSearch Google –>

2007年04月07日

操作系统:Windows XP SP2
分区格式:NTFS
IIS版本:5.1

在进行ASP调试时,可能会出现以下问题:
(1)HTTP 500 – 内部服务器错误

问题描述:

无法显示网页
您要访问的网页有问题,无法显示。

——————————————————————————–

请尝试以下操作:

打开 127.0.0.1  主页,然后查找指向您感兴趣信息的链接。
单击刷新按钮,或以后再试。

单击搜索,寻找 Internet 上的信息。
也可查看相关站点列表。

 

HTTP 500 – 内部服务器错误
Internet Explorer 

(2)Active Server Pages 错误 ‘ASP 0201′

问题描述:

Active Server Pages 错误 ‘ASP 0201′

无效的默认脚本语言

为此应用程序指定的默认脚本语言无效。

****

针对(1)和(2)的问题的尝试解决办法:
打开控制面板-管理工具-Internet 信息服务
选择默认网站-属性-目录安全性-编辑
如果匿名用户选项被选中,单击浏览按钮,弹出对话框后,单击高级按钮,再弹出对话框后,单击立即查找,选择合适的用户,一路确定。
或直接将身份验证方法对话框的匿名用户处的匿名访问帐户IUSR_XXX改为XXX(把IUSR_去掉),
然后重启ISS服务即可(适用于本地调试)
也可打开计算机管理-本地用户和组-组,选择Administrator,将IUS_XXX加入到此组。
然后重启IIS服务(适用于本地调试)


(3)事件查看其中的DCOM系统错误信息

问题描述:
应用程序-特定 权限设置未将 COM 服务器应用程序(CLSID 为
{0C0A3666-30C9-11D0-8F20-00805F2CD064}
)的 本地 激活 权限授予用户 MACHINE_NAME\IWAM_XXX SID (S-1-5-21-854245398-220523388-839522115-1006)。可以使用组件服务管理工具修改此安全权限。
解决办法:
此问题的原因一般是在组件服务的Machine Debug Manager DCOM组件的权限设置:
打开管理工具-组件服务-计算机-我的电脑-DCOM选项,选择其下的“Machine Debug Manager”,右健选择“属性”,找到“安全”,在“启动和激活权限”中编辑“自定义”,添加帐号“IWAM_XXX”,给该帐号赋予“本地启动”和“本地激活”的权限,重新启动IIS。

问题描述:
应用程序-特定权限设置未将COM 服务器应用程序(CLSID 为 {A9E69610-B80D-11D0-B9B9-00A0C922E750} )的 本地 激活 权限授予用户 IBM-D882681D063\IWAM_IBM-D882681D063 SID (S-1-5-21-1304240173-3011969147-3728014682-1013)。可以使用组件服务管理工具修改此安全权限。
解决办法:
此问题的原因一般是在组件服务的IIS ADMIN SERVICE DCOM组件的权限设置:
解决方法和上面类似,打开管理工具-组件服务-计算机-我的电脑-DCOM选项,选择其下的“IIS ADMIN SERVICE ”,右健选择“属性”,找到“安全”,在“启动和激活权限”中编辑“自定义”,添加帐号“IWAM_XXX”,给该帐号赋予“本地启动”和“本地激活”的权限,重新启动IIS。

问题描述:
服务器 {BA126AD1-2166-11D1-B1D0-00805FC1270E} 没有在限定的时间内用 DCOM 注册。
解决办法:
暂时未找到解决办法,一种建议是修改在组件服务的netman DCOM组件的权限设置:
修改方法同上(但是修改后未解决)。
第二种建议是,在注册表中查找{BA126AD1-2166-11D1-B1D0-00805FC1270E}项,修改权限(此种方法复杂,有点冒险,没有进行)

2007年04月02日

word可以直接另存为 htm,但即使是 另存为 filtered html 也会有大量的废代码。以前我一般用 dreamweaver 的 clean up html 来处理,先处理 word 特有标签,然后删除一些 font,b,span 等。进一步,在 editpus 里面用正则进行处理,最后得到我想要的干净的html 代码。当然最完美的办法就是拷贝文字出来,自己用文本编辑器书写htm标签。

今天又看到 lifehacker这几种 word 2 clean htm 方法:

1.使用这个HTML Tidy Library Project 开源软件来处理。

2.微软官方站点也有个 Office 2000 HTML Filter 2.0工具,可以用来处理掉 word2000转html时出现的多余代码。这里是简单使用说明。

3.使用这个Word HTML Cleaner 在线工具来处理。只能处理word2000以下版本。

4.有人给出了正则表达式(其实,上面的各种软件也都是用正则来解决的)

删除不需要的标签

<[/]?(font|span|xml|[ovwxp]:\w+)[^>]*?>
- replace any matches with the empty string

删除class,style…等不需要的属性

<([^>]*)(?:class|lang|style|size|face|[ovwxp]:\w+)=(?:’[^']*’|""[^""]*""|[^>]+)([^>]*)>
- replace any matches with <$1$2>

详细解释在Clean Word HTML using Regular Expressions

在ASP数据库编程时,经常使用Request对象获取传递的信息,实现数据库的操作,如下:
 ’将获取的信息赋值给变量
 rfname = Request.Form("firstname")
 rlname = Request.Form("lastname")
 rsex = Request.Form("sex")
 rage = Request.Form("age")
 
 ……

 ’插入语句,通过使用变量插入值
 strSQL = "INSERT INTO info(firstname,lastname,sex,age) VALUES(‘"&rfname&"’,'"&rlname&"’,'"&rsex&"’,"&rage&")"

 ’或如下
 strSQL = "INSERT INTO info(firstname,lastname,sex,age) VALUES(‘"+rfname+"’,'"+rlname+"’,'"+rsex+"’,"+rage+")"

 cn.Execute(strSQL)

说明:
如果传入的是字符型请在变量处使用(外单引号,内双引号)’"&变量&"’这种格式,如果传是数值型的可以直接用(只有双引号)"&变量&"

在ASP中,可以通过ADO访问数据库,经常会用到ASP的三个内建对象(ADO):Connection、Recordset、Cmmand对象;以下的示例简单的说明了如何使用三个ADO对数据库进行操作,简单起见,采用了Microsoft Access数据库的文件DSN;使用的是VBScript。

<%@ Language=VBScript %>
<html>
<head>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<title>操作数据库的几种方法</title>
</head>

<body>
Please Input Personal Information:<br>
<form method=post action="dbmeth.asp">
FirstName:<input type=text name="firstname">
<br>LastName:<input type=text name="lastname">
<br>Sex:<input type=text name="sex">
<br>Age:<input type=text name="age">
<br><input type=submit value="connection" NAME="use_db">
<input type=submit value="recordset" NAME="use_db">
<input type=submit value="command" NAME="use_db">
</form>

<%
strFName = Request.Form("firstname")
strLName = Request.Form("lastname")
strSex = Request.Form("sex")
intAge = Request.Form("age")
strCommand = Request.Form("use_db")
Response.Write strFName
Response.Write strLName
Response.Write strSex
Response.Write intAge
Response.Write strCommand

IF  strCommand = "connection" Then
‘使用Connection对象进行操作
 strDSN = "FILEDSN=test.dsn"
 set cn = Server.CreateObject("ADODB.Connection")
 cn.Open strDSN

 strSQL = "INSERT INTO info(firstname,lastname,sex,age) VALUES(‘"&strFName&"’,'"&strLName&"’,'"&strSex&"’,"&intAge&")"
 cn.Execute(strSQL)
 

 strSQL = "SELECT * FROM info"
 set rsInfo = cn.Execute(strSQL) ‘返回Recordset对象
 

 set objno = rsInfo("No")
 set objfname = rsInfo("firstname")
 set objlname = rsInfo("lastname")
 set objsex = rsInfo("sex")
 set objage = rsInfo("age")

 Response.Write "<table cellspacing=0 cellpadding=0 border=1><tr><td>No</td><td>firstname</td><td>lastname</td><td>sex</td><td>age</td></tr>"

 Do Until rsInfo.EOF
 Response.Write "<tr><td>"&objno&"</td><td>"&objfname&"</td><td>"&objlname&"</td><td>"&objsex&"</td><td>"&objage&"</td></tr>"
 rsInfo.MoveNext
 Loop

 Response.Write "</table>"

 cn.Close
 set rsInfo = Nothing
 set cn = Nothing
ElseIf strCommand = "recordset" Then
‘使用Recordset对象进行操作
 strDSN = "FILEDSN=test.dsn"
 ’set cn = Server.CreateObject("ADODB.Connection")
 ’cn.Open strDSN
 
 ’strSQL = "INSERT INTO info(firstname,lastname,sex,age) VALUES(‘good’,'hoo’,'male’,43)"
 ’cn.Execute(strSQL)
 
 set rsInfo = Server.CreateObject("ADODB.Recordset")
 
 strSQL = "INSERT INTO info(firstname,lastname,sex,age) VALUES(‘"&strFName&"’,'"&strLName&"’,'"&strSex&"’,"&intAge&")"
 ’rsInfo.Open strSQL,cn
 rsInfo.Open strSQL,strDSN
 
 strSQL = "SELECT * FROM info" 
 ’rsInfo.Open strSQL,cn
 rsInfo.Open strSQL,strDSN

 set objno = rsInfo("No")
 set objfname = rsInfo("firstname")
 set objlname = rsInfo("lastname")
 set objsex = rsInfo("sex")
 set objage = rsInfo("age")

 Response.Write "<table cellspacing=0 cellpadding=0 border=1><tr><td>No</td><td>firstname</td><td>lastname</td><td>sex</td><td>age</td></tr>"

 Do Until rsInfo.EOF
 Response.Write "<tr><td>"&objno&"</td><td>"&objfname&"</td><td>"&objlname&"</td><td>"&objsex&"</td><td>"&objage&"</td></tr>"
 rsInfo.MoveNext
 Loop

 Response.Write "</table>"

 rsInfo.Close
 set rsInfo = Nothing

ElseIf strCommand = "command" Then
‘使用Command对象进行操作
 strDSN = "FILEDSN=test.dsn"
 set cn = Server.CreateObject("ADODB.Connection")
 cn.Open strDSN
 
 set cm = Server.CreateObject("ADODB.Command")
 set cm.ActiveConnection = cn
 
 cm.CommandText = "INSERT INTO info(firstname,lastname,sex,age) VALUES(?,?,?,?)"
 cm.Prepared = True
 
 cm.Parameters.Append cm.CreateParameter("vfname",200,,255)
 cm.Parameters.Append cm.CreateParameter("vlname",200,,255)
 cm.Parameters.Append cm.CreateParameter("vsex",200,,255)
 cm.Parameters.Append cm.CreateParameter("vage",3,,4)
 ’CreateParameter中的Type参数应该使用数值
 
 cm("vfname")=strFName
 cm("vlname")=strLName
 cm("vsex")=strSex
 cm("vage")=intAge
 cm.Execute
 
 strSQL = "SELECT * FROM info"
 set rsInfo = cn.Execute(strSQL) ‘返回Recordset对象
 

 set objno = rsInfo("No")
 set objfname = rsInfo("firstname")
 set objlname = rsInfo("lastname")
 set objsex = rsInfo("sex")
 set objage = rsInfo("age")

 Response.Write "<table cellspacing=0 cellpadding=0 border=1><tr><td>No</td><td>firstname</td><td>lastname</td><td>sex</td><td>age</td></tr>"

 Do Until rsInfo.EOF
 Response.Write "<tr><td>"&objno&"</td><td>"&objfname&"</td><td>"&objlname&"</td><td>"&objsex&"</td><td>"&objage&"</td></tr>"
 rsInfo.MoveNext
 Loop

 Response.Write "</table>"

 cn.Close
 set rsInfo = Nothing
 set cm = Nothing
 set cn = Nothing 
End If
strGet = ""
%>

</body>
</html>

在SQL Server数据库编程时,常常需要判断一个数据库是否已经存在,如果不存在则创建此数据库。常用的方法有以下三种:

1. select * From master.dbo.sysdatabases where name=’test_db’

如果不存在查询结果,则说明name所表示的数据库不存在

2. object_id(‘test_db’)

如果无法获取对象ID(null),则说明此对象不存在;常用
if object_id(‘test_db’) is null 
或者
if (select object_id(‘test_db’)) is null 

3. db_id(‘test_db’)

如果不能获取数据库ID,则说明name所表示的数据库不存在;实际上此种方法也是在sysdatabases中查找,并返回数据库的ID;常用
if db_id(‘test_db’) is null 
或者
if (select db_id(‘test_db’)) is null 

下面以ASP编程为例来说明,先判断数据库是否存在,如果不存在则创建此数据库:

‘ strSQL = "if not exists (select * From master.dbo.sysdatabases where name=’test_db’) "& _
‘ strSQL = "if object_id(‘test_db’) is null "& _
strSQL = "use master if not exists (select db_id(‘test_db’)) "& _
"create database test_db on primary (name=’test_data’,filename=’d:\temp\test_db\test_db.mdf’,size=5MB,maxsize=unlimited,filegrowth=1%) "& _
"log on (name=’test_log’,filename=’d:\temp\test_db\test_log.ldf’,size=1MB,maxsize=unlimited,filegrowth=1%) "
cn.Execute(strSQL)

Microsoft SQL Server7.0是一种大型、分布式数据库系统,也可被认为是一种大型、分布式数据仓库。SQL Server是一个十分注重安全性的数据库,特别是在7.0版本发布以后,可以将数据库的许可直接授予Windows NT用户,数据库角色也可以包括NT 用户或组及SQL Server旧版本的用户和角色。另外,结合Microsoft Proxy Server ,则必须通过代理服务器才能在Internet 上访问SQL Server,这样更确保了数据的安全。

一. 连接方案

   在连接方案上,可选择TCP/IP套接字和命名管道的方法访问。具有NT用户帐号的用户适合于采用命名管道的方法,没有NT用户帐号的用户则不适合用此方法。这是因为在建立连接之前,数据库用户必须被NT确认,而选择TCP/IP套接字的连接则无此限制,该连接可直接连到数据库服务器,不必通过使用命名管道的中间计算机,只要通过了SQL Server确认用户就可获得访问权。

  由于是编写数据库连接的ASP应用程序,采用的数据访问编程模式是ADO;在ADO以前的数据访问编程模式有数据访问对象DAO和远程访问对象RDO,RDO以及DAO都是在ODBC下开发的,ODBC是用C语言编写的基于SQL的桌面规程。相反,ADO是在一种新型的规程OLE DB下开发的,OLE DB可以被看作是OLE技术在数据库中应用。它是基于C++开发的,给ODBC的功能提供了标准化的COM接口。C++是面向对象的,因此ADO也具有面向对象的特性。并能通过一系列COM接口来扩展自己。这一点对于ASP程序来说很重要。我们知道ASP程序使用的VBScript脚本语言的功能是很弱的,若要扩充VBScript的能力,使其能访问数据,则必须创建一个服务器端组件,通过COM接口来访问数据,而这正是ADO所擅长的。

二. 连接方法

在ASP脚本中可以通过三种实用的方法连接数据库:通过ODBC DSN建立连接,通过oledb建立连接和通过driver建立连接。

(一) 通过ODBC DSN建立连接

运用ODBC数据源,首先必须在控制面板的ODBC中设置数据源,然后再编写脚本和数据库源建立连接。

1、创建 ODBC DSN

  在编程连接网络上指定的服务器和数据库时,必须在Web服务器上创建数据源名(DSN)。要设置一个DSN,必须给服务器提供数据库的名字、通信所用的ODBC驱动、以及在网络中的地址。要注意的是:只有设置的DSN为一个系统DSN,才能让ADO在ASP中正常工作。如何确定DSN是系统DSN而不是用户或文件DSN呢?很简单,只有对于NT服务器上的所有用户和服务都可以访问的DSN才是系统DSN。

        通过在 Windows 的"开始"菜单打开"控制面板",您可以创建基于 DSN 的文件。双击"ODBC"图标,然后选择"系统 DSN"属性页,单击"添加",选择数据库驱动程序,然后单击"下一步"。按照后面的指示配置适用于您的数据库软件的 DSN。

        配置 SQL Server 数据库系统 DSN:在"创建新数据源"对话框中,从列表框中选择"SQL Server",然后单击"下一步"。键入 DSN 文件的名称,然后单击"下一步"。单击"完成"创建数据源。键入运行 SQL 服务程序的服务器的名称、登录 ID 和密码。在"创建 SQL Server 的新数据源"对话框中,在"服务器"列表框中键入包含 SQL Server 数据库的服务器的名称,然后单击"下一步"。选择验证登录 ID 的方式。如果要选择 SQL 服务器验证,请输入一个登录 ID 和密码,然后单击"下一步"。在"创建 SQL Server 的新数据源"对话框中,设置默认数据库、存储过程设置的驱动程序和 ANSI 标识,然后单击"下一步"。(要获取详细信息,请单击"帮助"。)在对话框(同样名为"创建 SQL Server 的新数据源")中,选择一种字符转换方法,然后单击"下一步"。(详细信息,请单击"帮助"。)在下一个对话框(同样名为"创建 SQL Server 的新数据源")中,选择登录设置。 注意典型情况下, 您只能使用日志来调试数据库访问问题。 在"ODBC Microsoft SQL Server 安装程序"对话框中,单击"测试数据源"。如果 DSN 正确创建,"测试结果"对话框将指出测试成功完成。

2、编写脚本和数据库源建立连接

        ADO(ActiveX Data Objects ) 提供 Connection 对象,可以使用该对象建立和管理应用程序和 ODBC 数据库之间的连接。Connection 对象具有各种属性和方法,可以使用它们打开和关闭数据库连接。编写数据库连接脚本,首先应创建 Connection 对象的实例,接着打开数据库连接:
<%
set conn=server.createobject("adodb.connection")
conn.open "DSN=ODBC名称;Database=数据库名称;UID=;PWD=;"
%>

(二) 通过oledb建立连接

        运用oledb方法建立页面与数据库的连接, 不需要创建 ODBC DSN数据源,直接编写如下的脚本和数据源建立连接,是一种简单易用的方法。
<%
set conn=server.createobject("adodb.connection")
conn.open "Provider=SQLOLEDB;server=SQL服务器名称或IP地址;database=数据库名称;uid=;pwd="
%>

(三) 通过driver建立连接

        通过driver建立页面与数据库的连接,同样不需要创建ODBC DSN数据源,但必须知道实际的数据库文件路径或者数据源名(例如,SQLserver的数据库)。
<%
set conn=server.createobject("adodb.connection")
conn.open "driver={sql server};server=SQL服务器名称或IP地址;database=数据库名称;uid=;pwd="%>

三. 存取控制

  设计ASP程序连接SQL SERVER的另一个重要问题是实现对SQL SERVER的存取控制。由于在关系型数据库中,DBMS本身的DCL语言只支持对表和字段的存取控制,而不直接支持对表中记录提供安全性保护。为实现其安全性,同时又不失B/S结构的开放性,可以考虑采用使用中间层存取程序逻辑结合触发器的方式来实现。使用中间层存取程序即用户端程序不直接访问DBMS,而是通过一个中间层的存取程序。

        以网上BBS应用为例,用户查询时,存取程序把表中的全部记录返回给用户;用户插入记录时,存取程序在新记录的User_name字段填写当前用户名,表明记录的主人,当用户删除和修改记录时,存取程序根据User_name字段向用户返回只属于他自己的记录,并允许用户从自己的记录中选择进行操作。使用触发器的方式则是所有用户直接访问表,但在表上建立如下的触发器:

CREATE TRIGGER trigger_1 on table_ 1 FOR INSERT AS
BEGIN
IF EXITS(SELECT * FROM inserted WHERE User_name<>User_name())
BEGIN
ROLLBACK TRANSACTION
RAISERROR(‘请输入正确的用户名’,16,-1)
END
END
CREATE TRIGGER trigger_2 on table_1 FOR UPDATE,DELETE AS
BEGIN
IF EXITS (SELECT * FROM deleted WHERE User_name<>User_name())
BEGIN
RAISERROR(‘你不能修改他人的数据’,16,-1)
END
END

  在上面的程序中,trigger_1对于用户名不正确的用户的插入请求予以否决。trigger_2对于试图修改他人的记录的请示予以否决。由于触发器附着在SQL Server的基本表中,无论用户通过何种方式更新记录,都无法跳过触发器的检查,因此使用触发器实现的安全性是相当高的。但由于在表中只能定义针对手稿删除和修改的触发器,不能定义针对查询的触发器,因此,要实现对查询的存取控制,则要通过中间层存取程序,只有向用户查询请示返回特定条件的记录来实现。

1.ASP与ACCESS数据库连接:
<%
dim conn,mdbfile
mdbfile=server.mappath("数据库名称.mdb")
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};uid=admin;pwd=数据库密码;dbq="&mdbfile
%>

2. ASP与SQL数据库连接:

<%
dim conn
set conn=server.createobject("ADODB.connection")
con.open "PROVIDER=SQLOLEDB;DATA SOURCE=SQL服务器名称或IP地址;UID=sa;PWD=数据库密码;DATABASE=数据库名称
%>

建立记录集对象:

set rs=server.createobject("adodb.recordset")
rs.open SQL语句,conn,3,2

 

3. SQL常用命令使用方法:

(1) 数据记录筛选:

sql="select * from 数据表 where 字段名=字段值 order by 字段名 "
sql="select * from 数据表 where 字段名 like ‘%字段值%‘ order by 字段名 "
sql="select top 10 * from 数据表 where 字段名 order by 字段名 "
sql="select * from 数据表 where 字段名 in (‘值1‘,‘值2‘,‘值3‘)"
sql="select * from 数据表 where 字段名 between 值1 and 值2"

(2) 更新数据记录:

sql="update 数据表 set 字段名=字段值 where 条件表达式"
sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式"

(3) 删除数据记录:

sql="delete from 数据表 where 条件表达式"
sql="delete from 数据表" (将数据表所有记录删除)

(4) 添加数据记录:

sql="insert into 数据表 (字段1,字段2,字段3 …) valuess (值1,值2,值3 …)"
sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表)

(5) 数据记录统计函数:

AVG(字段名) 得出一个表格栏平均值
COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计
MAX(字段名) 取得一个表格栏最大的值
MIN(字段名) 取得一个表格栏最小的值
SUM(字段名) 把数据栏的值相加

引用以上函数的方法:

sql="select sum(字段名) as 别名 from 数据表 where 条件表达式"
set rs=conn.excute(sql)

用 rs("别名") 获取统的计值,其它函数运用同上。

(5) 数据表的建立和删除:

CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… )

例:CREATE TABLE tab01(name varchar(50),datetime default now())

DROP TABLE 数据表名称 (永久性删除一个数据表)

 

(6) 记录集对象的方法:

rs.movenext 将记录指针从当前的位置向下移一行
rs.moveprevious 将记录指针从当前的位置向上移一行
rs.movefirst 将记录指针移到数据表第一行
rs.movelast 将记录指针移到数据表最后一行
rs.absoluteposition=N 将记录指针移到数据表第N行
rs.absolutepage=N 将记录指针移到第N页的第一行
rs.pagesize=N 设置每页为N条记录
rs.pagecount 根据 pagesize 的设置返回总页数
rs.recordcount 返回记录总数
rs.bof 返回记录指针是否超出数据表首端,true表示是,false为否
rs.eof 返回记录指针是否超出数据表末端,true表示是,false为否
rs.delete 删除当前记录,但记录指针不会向下移动
rs.addnew 添加记录到数据表末端
rs.update 更新数据表记录

判断所填数据是数字型

if not isNumeric(request("字段名称")) then
response.write "不是数字"
else
response.write "数字"
end if

经常使用到有关数据库的操作。包括连接代码、SQL命令等等,又不曾刻意去记忆它们(我本人是不愿意去记这东东),所以常常在用到的时候又去查书本,翻来翻去。一些比较少用的数据库还不一定能顺利找到,所以现在把它们全归纳到这里,提供大家参考。(个人水平有限,有缺陷之处,欢迎大家指正。)

<一>。数据库的连接方法:

1.Access数据库的DSN-less连接方法:

set adocon=Server.Createobject("adodb.connection")
adoconn.Open"Driver={Microsoft Access Driver(*.mdb)};DBQ="& _
Server.MapPath("数据库所在路径")

2.Access OLE DB连接方法:

set adocon=Server.Createobject("adodb.connection")
adocon.open"Provider=Microsoft.Jet.OLEDB.4.0;"& _
"Data Source=" & Server.MapPath("数据库所在路径")

3.SQL server连接方法:

set adocon=server.createobject("adodb.recordset")
adocon.Open"Driver={SQL Server};Server=(Local);UID=***;PWD=***;"& _
"database=数据库名;"

4.SQL server OLE DB连接方法:

set adocon=Server.Createobject("adodb.connection")
adocon.open"provider=SQLOLEDB.1;Data Source=RITANT4;"& _
"user ID=***;Password=***;"& _
"inital Catalog=数据库名"

5.Oracle 连接方法:

set adocon=Server.Createobject("adodb.connection")
adocon.open"Driver={microsoft odbc for oracle};server=oraclesever.world;uid=admin;pwd=pass;"

6.Oracle OLE DB 连接方法:

set adocon=Server.Createobject("adodb.connection")
adocon.open"Provider=OraOLEDB.Oracle;data source=dbname;user id=admin;password=pass;"

7.dBase 连接方法:

set adocon=Server.Createobject("adodb.connection")
adocon.open"Driver={microsoft dbase driver(*.dbf)};driverid=277;dbq=————;"

8.mySQL 连接方法:

set adocon=Server.Createobject("adodb.connection")
adocon.open"Driver={mysql};database=yourdatabase;uid=username;pwd=yourpassword;option=16386;"

9.Visual Foxpro 连接方法:

set adocon=Server.Createobject("adodb.connection")
adocon.open"Driver={microsoft Visual Foxpro driver};sourcetype=DBC;sourceDB=*.dbc;Exclusive=No;"

10.MS text 连接方法:

set adocon=Server.Createobject("adodb.connection")
adocon.open"Driver={microsoft text driver(*.txt; *.csv)};dbq=—–;"&_
"extensions=asc,csv,tab,txt;Persist SecurityInfo=false;"

11.MS text OLE DB 连接方法:

set adocon=Server.Createobject("adodb.connection")
adocon.open"Provider=microsof.jet.oledb.4.0;data source=your_path;"&_
"Extended Properties’text;FMT=Delimited’"

<二>。常用的四种SQL命令:

1.查询数据记录(Select)
语法:Select 字段串行 From table Where 字段=内容
例子:想从book表中找出作者为"cancer"的所有记录,SQL语句便如下:
select * from book where author=’cancer’
"*"是取出book表所有的字段,如查询的字段值为数字,则其后的"内容"便无须加上单引号,

如是日期,则在Access中用(#)包括,而在SQL server中则用(’)包括,
如:

select * from book where id=1
select * from book where pub_date=#2002-1-7# (Access)
select * from book where pub_date=’2002-1-7’ (SQL Server)

提示:
日期函数to_date不是标准sql文,不是所有的数据库适用,所以大家在使用的时候要参考数据库具体语法

另外如果是查询传入的变量,则如下:

strau=request.form("author")
strsql="select * from book where author=’"&strau&"’"

如果查询的是数字,则:

intID=request.form("id")
strsql="select * from book where id="&intID

在很多数据库中,如:oracle,上面的语句是可以写成:
strsql="select * from book where id=’"&intID&"’"的。
但是字符型一定不能按照数字格式写,需要注意。

2.添加记录(Insert)
语法:Insert into table(field1,field2,….) Values (value1,value2,….)
例子:添加一作者是"cancer"的记录入book表:
insert into book (bookno,author,bookname) values (’CF001’,’cancer’,’Cancer无组件上传程序’)
同样,如果用到变量就如下:

strno=request.form("bookno")
strau=request.form("author")
strname=request.form("bookname")
strsql="insert into book (bookno,author,bookname) values (’"&strno&"’,’"&strau&"’,’"&strname&"’)"

3.用Recordset对象的Addnew插入数据的方法:
语法:

rs.addnew
rs("field1").value=value1
rs("field2").value=value2

rs.update

4.修改数据记录(Update)
语法:update table set field1=value1,field2=value2,…where fieldx=valuex
例子:update book set author=’babycrazy’ where bookno=’CF001’
如果用到变量就如下:

strno=request.form("bookno")
strau=request.form("author")
strsql="update book set author=’"&strau&"’ where bookno=’"&strno"’"

5.Recordset对象的Update方法:
语法:

rs("field1").value=value1
rs("field2").value=value2

rs.update

注意:使用语法3和语法5的时候,一定要注意字段的类型(尤其是日期型)一致,否则出错的几率非常的高。

例子:

strno=request.form("bookno")
strau=request.form("author")
set adocon=server.createobject("adodb.connection")
adocon.open "Driver={Microsoft Access Driver(*.mdb)};DBQ=" & _
Server.Mappath=("/cancer/cancer.mdb")
strsql="select * from book where bookno=’"&strno&"’"
set rs=server.createobject("adodb.recordset")
rs.open strsql,adconn,1,3
if not rs.eof then ’如果有此记录的话
rs("author").value=strau
rs.update
end if
rs.close
set rs=nothing
adocon.close
set adocon=nothing

6.删除一条记录(Delete)
语法:Delete table where field=value
例子:删除book表中作者是cancer的记录

delete book where author=’cancer’

(注意:如果book表中author字段的值为cancer的记录有多条,将会删除所有author为cancer的记录)

好了,学会了用这些操作,大家在用asp操作数据库的时候,该是没有什么问题了