针对有网友说看不见文章内容, 现提示如下: 点击每一个标题行任一地方都会展开和隐藏此文章内容(不要点击标题). 目前展开隐藏功能只支持IE浏览器,虽然可以改成支持FF浏览器,不过现在一直没时间去弄,等有时间再修改了。 |
blog名称:乱闪Blog 日志总数:267 评论数量:1618 留言数量:-26 访问次数:2654838 建立时间:2005年1月1日 |
|

| |
Sql Server基本函数
|
1.字符串函数 长度与分析用
datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格
substring(expression,start,length) 不多说了,取子串
right(char_expr,int_expr) 返回字符串右边int_expr个字符
字符操作类
upper(char_expr) 转为大写
lower(char_expr) 转为小写
space(int_expr) 生成int_expr个空格
replicate(char_expr,int_expr)复制字符串int_expr次
reverse(char_expr) 反转字符串
stuff(char_expr1,start,length,char_expr2) 将字符串char_expr1中的从
start开始的length个字符用char_expr2代替
ltrim(char_expr) rtrim(char_expr) 取掉空格
ascii(char) char(ascii) 两函数对应,取ascii码,根据ascii吗取字符
字符串查找
charindex(char_expr,expression) 返回char_expr的起始位置
patindex("%pattern%",expression) 返回指定模式的起始位置,否则为0
2.数学函数
abs(numeric_expr) 求绝对值
ceiling(numeric_expr) 取大于等于指定值的最小整数
exp(float_expr) 取指数
floor(numeric_expr) 小于等于指定值得最大整数
pi() 3.1415926.........
power(numeric_expr,power) 返回power次方
rand([int_expr]) 随机数产生器
round(numeric_expr,int_expr) 安int_expr规定的精度四舍五入
sign(int_expr) 根据正数,0,负数,,返回+1,0,-1
sqrt(float_expr) 平方根
3.日期函数
getdate() 返回日期
datename(datepart,date_expr) 返回名称如 June
datepart(datepart,date_expr) 取日期一部份
datediff(datepart,date_expr1.dateexpr2) 日期差
dateadd(datepart,number,date_expr) 返回日期加上 number
上述函数中datepart的
写法 取值和意义
yy 1753-9999 年份
qq 1-4 刻
mm 1-12 月
dy 1-366 日
dd 1-31 日
wk 1-54 周
dw 1-7 周几
hh 0-23 小时
mi 0-59 分钟
ss 0-59 秒
ms 0-999 毫秒
日期转换
convert()
4.系统函数
suser_name() 用户登录名
user_name() 用户在数据库中的名字
user 用户在数据库中的名字
show_role() 对当前用户起作用的规则
db_name() 数据库名
object_name(obj_id) 数据库对象名
col_name(obj_id,col_id) 列名
col_length(objname,colname) 列长度
valid_name(char_expr) 是否是有效标识符
|
|
金额阿拉伯数字转换为中文的存储过程
|
作者: 不详 加入时间: 2004-10-25 文档类型: 来自: 浏览统计: total: 21 year: 21 quarter: 21 month: 21 week: 8 today: 2
Create Procedure AtoC @ChangeMoney Money as Set Nocount ON Declare @String1 char(20) Declare @String2 char(30) Declare @String4 Varchar(100) Declare @String3 Varchar(100) --从原A值中取出的值 Declare @i int --循环变量 Declare @J Int --A的值乘以100的字符串长度 Declare @Ch1 Varchar(100) --数字的汉语读法 Declare @Ch2 Varchar(100) --数字位的汉字读法 Declare @Zero Int --用来计算连续有几个零 Declare @ReturnValue VarChar(100)
Select @ReturnValue = '' Select @String1 = '零壹贰叁肆伍陆柒捌玖' Select @String2 = '万仟佰拾亿仟佰拾万仟佰拾元角分'
Select @String4 = Cast(@ChangeMoney*100 as int)
select @J=len(cast((@ChangeMoney*100) as int))
Select @String2=Right(@String2,@J)
Select @i = 1
while @i<= @j Begin
Select @String3 = Substring(@String4,@i,1)
if @String3<>'0' Begin
Select @Ch1 = Substring(@String1, Cast(@String3 as Int) + 1, 1) Select @Ch2 = Substring(@String2, @i, 1) Select @Zero = 0 --表示本位不为零 end else Begin If (@Zero = 0) Or (@i = @J - 9) Or (@i = @J - 5) Or (@i = @J - 1) Select @Ch1 = '零' Else Select @Ch1 = ''
Select @Zero = @Zero + 1 --表示本位为0 --如果转换的数值需要扩大,那么需改动以下表达式 I 的值。 Select Ch2 = ''
If @i = @J - 10 Begin Select @Ch2 = '亿' Select @Zero = 0 end If @i = @J - 6 Begin Select @Ch2 = '万' Select @Zero = 0 end if @i = @J - 2 Begin Select @Ch2 = '元' Select @Zero = 0 end If @i = @J Select @Ch2 = '整' end
Select @ReturnValue = @ReturnValue + @Ch1 + @Ch2
select @i = @i+1 end
--最后将多余的零去掉 If CharIndex('仟仟',@ReturnValue) <> 0 Select @ReturnValue = Replace(@ReturnValue, '仟仟', '仟')
If CharIndex('佰佰',@ReturnValue) <> 0 Select @ReturnValue = Replace(@ReturnValue, '佰佰', '佰')
If CharIndex('零元',@ReturnValue) <> 0 Select @ReturnValue = Replace(@ReturnValue, '零元', '元') If CharIndex('零万',@ReturnValue) <> 0 Select @ReturnValue = Replace(@ReturnValue, '零万', '万') If CharIndex('零亿',@ReturnValue) <> 0 Select @ReturnValue = Replace(@ReturnValue, '零亿', '亿') If CharIndex('零整',@ReturnValue) <> 0 Select @ReturnValue = Replace(@ReturnValue, '零整', '整') If CharIndex('零佰',@ReturnValue) <> 0 Select @ReturnValue = Replace(@ReturnValue, '零佰', '零')
If CharIndex('零仟',@ReturnValue) <> 0 Select @ReturnValue = Replace(@ReturnValue, '零仟', '零')
If CharIndex('元元',@ReturnValue) <> 0 Select @ReturnValue = Replace(@ReturnValue, '元元', '元') Select @ReturnValue GO
|
|
存储过程分页的好的例子
|
作者: serverme 加入时间: 2004-10-13 文档类型: 来自: 浏览统计: total: 29 year: 29 quarter: 29 month: 29 week: 11 today: 2
-------------------------------------分页的存储过程------------------------ -- 利用SQL未公开的存储过程实现分页
CREATE procedure p_splitpage @sql nvarchar(4000), --要执行的sql语句 @page int=1, --要显示的页码 @pageSize int, --每页的大小 @pageCount int=0 out, --总页数 @recordCount int=0 out --总记录数 as set nocount on declare @p1 int exec sp_cursoropen @p1 output,@sql,@scrollopt=1,@ccopt=1,@rowcount=@pagecount output set @recordCount = @pageCount select @pagecount=ceiling(1.0*@pagecount/@pagesize) ,@page=(@page-1)*@pagesize+1 exec sp_cursorfetch @p1,16,@page,@pagesize exec sp_cursorclose @p1 GO ---------------------------得到执行的查询语句的存储过程----------------- CREATE PROCEDURE dtalyjd_search (@search_name varchar(50)) AS DECLARE @str varchar(4000) if @search_name='' begin set @str='select * from 表名' select @str sql return end else begin set @str='select * from 表名 where search_name like ''%'+@search_name+'%''' select @str sql return end GO
--------------------------ASP页面---------------------
<% dim search_name search_name=trim(request("search_name")) set rs1=conn.execute("exec dtalyjd_search '"&search_name&"'") sql=rs1("sql") rs1.close if request("page")="" or request("page")=0 or IsNumeric(request("page"))=false then m_page=1 else m_page=cint(request("page")) end if m_pagesize=14'每页的条数 set cmd = server.CreateObject("adodb.command") cmd.ActiveConnection = conn cmd.CommandType = 4 cmd.CommandText = "p_SplitPage" cmd.Parameters.Append cmd.CreateParameter("@sql",8,1, 4000, sql) cmd.Parameters.Append cmd.CreateParameter("@page",4,1, 4, m_page) cmd.Parameters.Append cmd.CreateParameter("@pageSize",4,1, 4, m_pageSize) cmd.Parameters.Append cmd.CreateParameter("@pageCount",4,2, 4, m_pageCount) cmd.Parameters.Append cmd.CreateParameter("@recordCount",4,2, 4, m_recordCount) set rs = cmd.Execute set rs = rs.NextRecordSet m_pageCount = cmd.Parameters("@pageCount").value m_recordCount = cmd.Parameters("@recordCount").value if m_pageCount = 0 then m_pageCount = 1 if m_page>m_pageCount then response.Redirect("bureauser_result.asp?page="&m_pageCount&"&lxsuser_name="&lxsuser_name) end if set rs = cmd.Execute %> <table width="100%" border="0" cellspacing="1" cellpadding="0"> <tr> <td width="47%" align="right">查询结果共 <font color="#FF0000">[8]</font>页 这是第 <font color="#FF0000">[5]</font> 页</td> <td width="53%" align="right"> <table width="95%" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="10" align="right" ><img src="feedback_images/ll.gif" width="8" height="21"></td> <td width="475" background="feedback_images/m.gif"> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <% if m_page<>1 then %> <td width="23%"><img src="images/first.gif" width="8" height="8"> <A HREF=<%=Myself%>?Page=1&search_name=<%=search_name%>>首页</A></td> <td width="31%"><img src="images/pre.gif" width="8" height="8"> <A HREF=<%=Myself%>?Page=<%=(Page-1)%>&search_name=<%=search_name%>>上一页</a></td> <% end if If m_page <> m_pageCount Then %> <td width="24%"><img src="images/lat.gif" width="8" height="8"><A HREF=<%=Myself%>?Page=<%=(m_Page+1)%>&search_name=<%=search_name%>>下一页</A></td> <td width="22%"><img src="images/last.gif" width="8" height="8"><A HREF=<%=Myself%>?Page=<%=m_pageCount%>&search_name=<%=search_name%>>尾页</A></td> <%end if%> </tr><%end if%> </table></td> <td width="11"><img src="feedback_images/rr.gif" width="10" height="21"></td> </tr> </table> </td> </tr> </table>
|
|
ACCESS转化成SQL2000需要注意的几个问题
|
很多朋友想用SQL2000数据库的编程方法,但是却又苦于自己是学ACCESS的,对SQL只是一点点的了解而已,这里我给大家提供以下参考---将ACCESS转化成SQL2000的方法和注意事项 一,首先,我说的是在ACCESS2000,SQL2000之间转换,其他的我也还没有尝试过,希望大家多多试验,肯定是有办法的; 二,转换的方法 1,打开”控制面板“下”管理工具“中的”数据库源“; 2,按”添加“添加一个新的数据源,在选择栏里选”Driver do microsoft Access (*.mdb)”,完成后将出现一个框, 在”数据库源“里面输入你想写的名称,我取名叫“ABC”,说明不需要填,接着,按下面的选择,寻找你的数据库地址和选中(注意,请先备份自己的ACCESS数据库),然后确定。 数据源在这里建好了,剩下转换了。 3,打开SQL2000企业管理器,进入数据库,新建一个空的数据库“ABC”; 4,选择新建立的数据库,按鼠标右键,选择“所有任务”下“导入数据”,按“下一步”继续; 5,在数据库源下拉但中选择”Driver do microsoft Access(*.mdb)“,在”用户/系统DSN“中,选种你刚才添加的”ABC“,按 ”下一步“; 6,“目的”不需要修改,选择服务器(一般下为自己的本机"local",也可以选择服务器地址或者局域网地址,确定你的权限是否可以操作,),"使用WINDOWS 身份验证"指用自己的系统管理员身份操作,"使用SQL身份操作验证"可以用于网站的操作,推荐用后者; 7,选上"使用SQL身份操作验证"后,填写你的用户名和密码,我自己选择的是系统默认号码"sa","****",数据库选择刚新建的"ABC",按"下一步"; 8,这一步的两个单项选择,"从数据源复制表和视图"与"用一条查询指令指定要传输的数据",选择前者,按"下一步"继续; 9,这里将出现你自己ACCESS数据库的表,按"全选"后,下一步; 10,"DTS导入/导出向导",看"立即运行"被选中按"下一步", 11,按"完成"继续; 12,这个步骤你将看到你的数据被导入SQL2000里面,当出现"已经成功把XXX个表导入到数据库"的字样,而且所有的表前面都有绿色的勾,就表示成功导入所有数据,如果中途出现问题或者表前面有红色的叉的话,说明该表没有成功导入,这时就要回去查看自己的操作是否正确了. 三,数据修改 1,由于SQL2000里面没有"自动编号",所以你的以"自动编号"设置的字段都会变成非空的字段,这就必须手工修改这些字段,并把他的"标示"选择"是",种子为"1",增量为"1", 2,另外,ACCESS2000转换成SQL2000后,原来属性为"是/否"的字段将被转换成非空的"bit",这时候你必须修改成自己想要的属性了; 3,另外,大家要注意对时间函数的把握.ACCESS与SQL是有很多不同的. |
|
利用XML技术获取域名的世界排名数字
|
利用以下的代码,可以从WWW.ALEXA.COM网站中返回域名的世界排名数字,相信这个代码很有用处。 以前总是看到美萍网站的网站导航里面,每隔站点都能够显示世界排名数字,不知道是怎么得到的。经过不断的努力,我终于利用简单的ASP+XML的方法得到了这个数字。惊喜之余,也拿出来和大家共享吧!相信聪明的您通过修改这个代码将会把它的功能发挥到极致!在这里我有一个小小的要求,如果您改出来了什么好东东,也给我发一份,好吗?
代码拷贝框 <%
'=========================================================
' 文件:AlexaRank.asp
' 功能:返回域名的世界排名数字
' 时间:2004-06-24
' 作者:Guidy
' 版权:iXuEr Studio
'=========================================================
' Copyright (C) 2004-2006 114XP.CN All rights reserved.
' 官方网站:HTTP://www.114xp.cn
' 技术论坛:HTTP://bbs.114xp.cn
' 电子信箱:guidy@qq.com.guidy@psysch.com
'=========================================================
Server.ScriptTimeOut=120
On Error Resume Next
Dim Url
Url = "www.114xp.cn"
Response.Write(AlexaRank(Url))
Response.End()
'==========================================================
Function AlexaRank(Url)
'过滤无用信息,只剩余世界排名
'此方法是作者认真分析网页代码而得出的,所以不保证永久有效
'如果您还有什么更好的办法,不妨来告诉我,共同探讨嘛~~
Dim AlexaUrl,RpStr,TempStr
Dim x,n
RpStr = "</td><td class=""bodyBold"" align=""center"" bgcolor=""#ffffff""><img" '此行不准改动
AlexaUrl = "http://www.alexa.com/data/details/traffic_details?q=&url=" & Url
TempStr = GetHTTPPage(AlexaUrl)
n = InStr(TempStr,RpStr) - 1
TempStr = Left(TempStr,n)
TempStr = StrReverse(TempStr)
x = InStr(TempStr,">") - 1
TempStr = Left(TempStr,x)
TempStr = StrReverse(TempStr)
AlexaRank = TempStr
End Function
'==========================================================
Function GetHTTPPage(url)
'利用XML技术来获取网页数据
on Error resume next
Dim HTTP
Set HTTP=Server.CreateObject("Microsoft.XMLHTTP")
HTTP.Open "GET",Url,False
HTTP.Send()
If HTTP.ReadyState<>4 then
exit function
end If
GetHTTPPage=Bytes2BSTR(HTTP.ResponseBody)
Set HTTP=Nothing
If Err.Number<>0 Then Err.Clear
End function
'==========================================================
Function Bytes2BSTR(vIn)
'还原网页数据为文本字符
Dim StrReturn
Dim i,ThisCharCode,NextCharCode
StrReturn = ""
For i = 1 To LenB(vIn)
ThisCharCode = AscB(MidB(vIn,i,1))
If ThisCharCode < &H80 Then
StrReturn = StrReturn & Chr(ThisCharCode)
Else
NextCharCode = AscB(MidB(vIn,i+1,1))
StrReturn = StrReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
i = i + 1
End If
Next
Bytes2BSTR = StrReturn
End Function
%>
[Ctrl+A 全部选择 然后拷贝]
|
|
什么是Blog? 什么是RSS?新闻聚合工具
|
作者: arron 加入时间: 2005-01-10 文档类型: 转载 来自: 浏览统计: total: 106 year: 106 quarter: 106 month: 106 week: 34 today: 1
什么是Blog?
- Blog,是Weblog的简称。 - Weblog,是Web 和Log的组合词。Web,指World Wide Web;Log,原义是“航海日志”,后指任何类型的流水记录。Weblog 是在网络上的一种流水记录形式。 - Blogger或Weblogger,是指习惯于日常记录并使用Weblog工具的人。
什么是RSS?
它是什么:站点用来和其他站点之间共享内容的简易方式(也叫聚合内容)。 RSS使用XML作为彼此共享内容的标准方式。
它代表什么:Really Simple Syndication (或RDF Site Summary,RDF站点摘要)
例如:一些免费的软件能够让你阅读那些RSS使能的站点,比如 NewsIsFree 和 Amphetadesk。
它有什么用处:让别人容易的发现你已经更新了你的站点,让人们很容易的追踪他们阅读的所有weblogs。
新闻聚合工具
很多Blogger都在他们的站点上放了标记,那只要我们喜欢,就可以将它添加到新闻阅读软件中,以后我们不必打开浏览器在不同站点到处转,在新闻阅读软件中,我们就可以自动收集我们预订的Blog和其他新闻大站的新闻了。 什么是NewzCrawler?
NewzCrawler是一款网页新闻阅读和浏览器,通过它,我们能从不同的来源中访问到许多新闻内容:
基于XML格式(XML\RSS,CDF,BACKSLASH,SCRIPTINGNEWS等)的聚合(Syndicated)新闻。
Usenet新闻组中的新闻。
网页新闻。
NewzCrawler从订阅的每一个新闻频道中收集新闻内容,然后以几种不同的方式显示来:滚动的新闻列表,新闻气球(就是浮动的提示框)和新闻Ticker。和其他相似的软件相比,NewzCrawler是在后台从不同的新闻源获取检索新闻,速度快,同时显示的方式可以订制。而且,它是目前唯一一个能获取不同来源新闻的软件。
我用NewzCrawler能做什么?
从不同的内容源(XML\RSS,Usernet Newsgroup,Web)读取新闻。
以所见即所得的HTML编辑方式编写消息,然后将他们发布到放在那些支持Blogger API的网站上的weblog中,或者发布到新闻群组。
使用内置的浏览器浏览新闻文章。
不断地从NEWS TICKER和NEWS BALLON这两种雅致的方式中获得最新新闻的消息。
还可以把一些新闻和网页通过电子邮件发送给你的朋友。
通过关键字进行新闻搜索。
以可订制的树状方式管理、组织新闻频道。
用MS Agenet来为你读新闻。 |
|
用CSS制作的显示隐藏菜单
|
作者: 不详 加入时间: 2004-10-19 文档类型: 来自: 浏览统计: total: 81 year: 81 quarter: 81 month: 81 week: 31 today: 1
<head> <script> if (!document.getElementById) document.getElementById = function() { return null; }
function initializeMenu(menuId, actuatorId) { var menu = document.getElementById(menuId); var actuator = document.getElementById(actuatorId);
if (menu == null || actuator == null) return;
//if (window.opera) return; // I'm too tired
actuator.parentNode.style.backgroundImage = "url(/images/plus.gif)"; actuator.onclick = function() { var display = menu.style.display; this.parentNode.style.backgroundImage = (display == "block") ? "url(/images/plus.gif)" : "url(/images/minus.gif)"; menu.style.display = (display == "block") ? "none" : "block";
return false; } } window.onload = function() { initializeMenu("productsMenu", "productsActuator"); initializeMenu("newPhonesMenu", "newPhonesActuator"); initializeMenu("compareMenu", "compareActuator"); } </script> <style> body { font-family: verdana, helvetica, arial, sans-serif; }
#mainMenu { background-color: #EEE; border: 1px solid #CCC; color: #000; width: 203px; }
#menuList { margin: 0px; padding: 10px 0px 10px 15px; }
li.menubar { background: url(/images/plus.gif) no-repeat 0em 0.3em; font-size: 12px; line-height: 1.5em; list-style: none outside; }
.menu, .submenu { display: none; margin-left: 15px; padding: 0px; }
.menu li, .submenu li { background: url(/images/square.gif) no-repeat 0em 0.3em; list-style: none outside; }
a.actuator { background-color: transparent; color: #000; font-size: 12px; padding-left: 15px; text-decoration: none; }
a.actuator:hover { text-decoration: underline; }
.menu li a, .submenu li a { background-color: transparent; color: #000; font-size: 12px; padding-left: 15px; text-decoration: none; }
.menu li a:hover, submenu li a:hover { /*border-bottom: 1px dashed #000;*/ text-decoration: underline; }
span.key { text-decoration: underline; } </style> </head> <body> <div id="mainMenu"> <ul id="menuList"> <li class="menubar"> <a href="#" id="productsActuator" class="actuator">Phones</a> <ul id="productsMenu" class="menu"> <li> <a href="#" id="newPhonesActuator" class="actuator">New Phones</a> <ul id="newPhonesMenu" class="submenu"> <li><a href="#">9290</a></li> <li><a href="#">8390</a></li> <li><a href="#">8290</a></li> <li><a href="#">8270</a></li> </ul> </li> <li> <a href="#" id="compareActuator" class="actuator">Compare</a> <ul id="compareMenu" class="submenu"> <li><a href="#">All Phones</a></li> <li><a href="#">Service Provider</a></li> </ul> </li> </ul> </li> </ul> </div> </body>
运行代码框 <head>
<script>
if (!document.getElementById)
document.getElementById = function() { return null; }
function initializeMenu(menuId, actuatorId) {
var menu = document.getElementById(menuId);
var actuator = document.getElementById(actuatorId);
if (menu == null || actuator == null) return;
//if (window.opera) return; // I'm too tired
actuator.parentNode.style.backgroundImage = "url(/images/plus.gif)";
actuator.onclick = function() {
var display = menu.style.display;
this.parentNode.style.backgroundImage =
(display == "block") ? "url(/images/plus.gif)" : "url(/images/minus.gif)";
menu.style.display = (display == "block") ? "none" : "block";
return false;
}
}
window.onload = function() {
initializeMenu("productsMenu", "productsActuator");
initializeMenu("newPhonesMenu", "newPhonesActuator");
initializeMenu("compareMenu", "compareActuator");
}
</script>
<style>
body {
font-family: verdana, helvetica, arial, sans-serif;
}
#mainMenu {
background-color: #EEE;
border: 1px solid #CCC;
color: #000;
width: 203px;
}
#menuList {
margin: 0px;
padding: 10px 0px 10px 15px;
}
li.menubar {
background: url(/images/plus.gif) no-repeat 0em 0.3em;
font-size: 12px;
line-height: 1.5em;
list-style: none outside;
}
.menu, .submenu {
display: none;
margin-left: 15px;
padding: 0px;
}
.menu li, .submenu li {
background: url(/images/square.gif) no-repeat 0em 0.3em;
list-style: none outside;
}
a.actuator {
background-color: transparent;
color: #000;
font-size: 12px;
padding-left: 15px;
text-decoration: none;
}
a.actuator:hover {
text-decoration: underline;
}
.menu li a, .submenu li a {
background-color: transparent;
color: #000;
font-size: 12px;
padding-left: 15px;
text-decoration: none;
}
.menu li a:hover, submenu li a:hover {
/*border-bottom: 1px dashed #000;*/
text-decoration: underline;
}
span.key {
text-decoration: underline;
}
</style>
</head>
<body>
<div id="mainMenu">
<ul id="menuList">
<li class="menubar">
<a href="#" id="productsActuator" class="actuator">Phones</a>
<ul id="productsMenu" class="menu">
<li>
<a href="#" id="newPhonesActuator" class="actuator">New Phones</a>
<ul id="newPhonesMenu" class="submenu">
<li><a href="#">9290</a></li>
<li><a href="#">8390</a></li>
<li><a href="#">8290</a></li>
<li><a href="#">8270</a></li>
</ul>
</li>
<li>
<a href="#" id="compareActuator" class="actuator">Compare</a>
<ul id="compareMenu" class="submenu">
<li><a href="#">All Phones</a></li>
<li><a href="#">Service Provider</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</body>
[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行] |
|
ASP备份数据库
|
作者: 不详 加入时间: 2004-10-25 文档类型: 来自: 浏览统计: total: 24 year: 24 quarter: 24 month: 24 week: 8 today: 1
文件1:BackupDB.asp ================== 代码:
<%@ Language=VBScript %> <META content=VBScript name=VI60_defaultClientScript> <META content="Microsoft FrontPage 4.0" name=GENERATOR> <SCRIPT language=vbscript id=clientEventHandlersVBS> <!-- Sub btnbak_onclick if frmbak.txtsvr.value="" then window.alert("'Server Name' is empty!") frmbak.txtsvr.focus exit sub end if if frmbak.txtuid.value="" then window.alert("'Administrators' is empty!") frmbak.txtuid.focus exit sub end if if frmbak.txtdb.value="" then window.alert("'Database' is empty!") frmbak.txtdb.focus exit sub end if if frmbak.txtto.value="" then window.alert("'Backup To' is empty!") frmbak.txtto.focus exit sub end if frmbak.submit End Sub --> </SCRIPT> </TD></TR></TBODY></TABLE><LINK href="../../sheets/B2BStyle.css" rel=stylesheet> <FORM id=frmbak name=frmbak action=backupdbsave.asp method=post> <P class=heading>Database --> Backup</P> <P align=center> <DIV align=center> <CENTER> <TABLE cellSpacing=1 cellPadding=1 width="60%" align=center border=0> <TBODY> <TR> <TD class=TD_Mand_FN align=middle width="40%" height=35>Server Name:</TD> <TD class=TD_Mand_F width="59%" height=35><INPUT id=txtsvr style="FONT-SIZE: 9pt; FONT-FAMILY: Arial" name=txtsvr></TD></TR> <TR> <TD class=TD_Mand_FN align=middle width="40%" height=35>Administrators:</TD> <TD class=TD_Mand_F width="59%" height=35><INPUT id=txtuid style="FONT-SIZE: 9pt; FONT-FAMILY: Arial" name=txtuid></TD></TR> <TR> <TD class=TD_Mand_FN align=middle width="40%" height=35>Password:</TD> <TD class=TD_Mand_F width="59%" height=35><INPUT id=txtpwd style="FONT-SIZE: 9pt; FONT-FAMILY: Arial" type=password name=txtpwd></TD></TR> <TR> <TD class=TD_Mand_FN align=middle width="40%" height=35>Database:</TD> <TD class=TD_Mand_F width="59%" height=35> <P align=left><INPUT id=txtdb style="FONT-SIZE: 9pt; FONT-FAMILY: Arial" name=txtdb></P></TD></TR> <TR> <TD class=TD_Mand_FN align=middle width="40%" height=35>Backup To:<BR><U>(Server Path)</U></TD> <TD class=TD_Mand_F width="59%" height=35><INPUT id=txtto style="FONT-SIZE: 9pt; FONT-FAMILY: Arial" name=txtto></TD></TR></TBODY></TABLE></CENTER></DIV> <P align=center><INPUT id=btnbak style="FONT-SIZE: 9pt; FONT-FAMILY: Arial" type=button value="Start Backup" name=btnbak></P></FORM></SPAN></
============================= 文件2:BackupDBSave.asp
<%@ Language=VBScript %> <% dim msvr,muid,mpwd,mdb,mto msvr=Request.Form("txtsvr") muid=Request.Form("txtuid") mpwd=Request.Form("txtpwd") mdb=Request.Form("txtdb") mto=Request.Form("txtto") if mpwd="" then mpwd="''"
on error resume next set dmosvr=server.CreateObject("SQLDMO.SQLServer") dmosvr.connect msvr,muid,mpwd
if err.number>0 then Response.Redirect("http:backuperr.asp?err="&err.number)
mdevname="Backup_"&muid&"_"&mdb set dmodev=server.CreateObject("SQLDMO.BackupDevice") dmodev.name=mdevname dmodev.type=2 dmodev.PhysicalLocation=mto dmosvr.BackupDevices.Add dmodev
if err.number>0 then Response.Redirect("http:backuperr.asp?err="&err.number)
set dmobak=server.CreateObject("SQLDMO.Backup") dmobak.database=mdb dmobak.devices=mdevname %> <HTML> <HEAD> <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0"> </HEAD> <body background="../../Images/dot.gif">
<p><strong>Backuping, wait please...</strong></p> <% dmobak.sqlbackup dmosvr if err.number>0 then Response.Redirect("http:backuperr.asp?err="&err.number)
dmosvr.backupdevices(mdevname).remove set dmobak=nothing set dmodev=nothing dmosvr.disconnect set dmosvr=nothing %> <p><strong>Database '<%=mdb%>' backup successed!</strong></p> </BODY> </HTML>
文件3:BackupErr.asp
代码运行框: <%@ Language=VBScript %>
<%
dim errno,errstr
errno=Request.QueryString("err")
errstr=""
select case cstr(errno)
case "18456"
errstr="administrators or password error!"
case "20482"
errstr="server name error or server cannot connect!"
case "911"
errstr="database not found!"
case "15026"
errstr="server path not found!"
case "3201"
errstr="server path not found!"
case "3254"
errstr="restore from file lawlessness!"
case else
errstr="unknown error! retry later please!"
end select
%>
<HTML>
<HEAD>
<META name=VI60_defaultClientScript content=VBScript>
<META NAME="GENERATOR" Content="Microsoft FrontPage 4.0">
<SCRIPT ID=clientEventHandlersVBS LANGUAGE=vbscript>
<!--
Sub btnret_onclick
history.back
End Sub
-->
</SCRIPT>
<title></title>
</HEAD>
<body class="bg_frame_up">
<p align=center><font color=#006666><%=errstr%></font></p>
<p align=center><input id=btnret name=btnret type=button value=Return style="font-family: Arial; font-size: 9pt"></p>
</BODY>
</HTML>
[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行] |
|
存储过程使用大全
|
作者: 幻想曲 加入时间: 2005-01-13 文档类型: 来自: 柠檬树下 浏览统计: total: 44 year: 44 quarter: 44 month: 44 week: 11 today: 1
1,调用没有参数的存储过程
<% set conn=server.CreateObject("adodb.connection") set cmd=server.CreateObject("adodb.command") strconn="dsn=pubs;uid=sa;pwd" conn.Open strconn set cmd.ActiveConnection=conn cmd.CommandText="{call nono}" set rs=cmc.exe 或者cmd.execute set rs=cmd.Execute() %>
2,一个输入的参数的存储过程
<% set conn=server.CreateObject("adodb.connection") set cmd=server.CreateObject("adodb.command") strconn="dsn=pubs;uid=sa;pwd" conn.Open strconn set cmd.ActiveConnection=conn cmd.CommandText="{call oneinput(?)}" cmd.Parameters.Append cmd.CreateParameter("@aaa",adInteger ,adParamInput ) cmd("@aaa")=100 cmd.Execute() %> 3,一个输入参数和一个输出的参数
<% set conn=server.CreateObject("adodb.connection") set cmd=server.CreateObject("adodb.command") strconn="dsn=pubs;uid=sa;pwd" conn.Open strconn set cmd.ActiveConnection=conn cmd.CommandText = "{call oneinout(?,?)}" cmd.Parameters.Append cmd.CreateParameter("@aaa",adInteger,adParamInput) cmd("@aaa")=10 cmd.Parameters.Append cmd.CreateParameter("@bbb",adInteger,adParamOutput) cmd.Execute() bbb=cmd("@bbb") %>
4,一个输入参数,一个输出参数,和一个返回值
<% set conn=server.CreateObject("adodb.connection") set cmd=server.CreateObject("adodb.command") strconn="dsn=pubs;uid=sa;pwd" conn.Open strconn set cmd.ActiveConnection=conn cmd.CommandText="{?=call onereturn(?,?)}" cmd.Parameters.Append cmd.CreateParameter("@return_value",adInteger,adParamReturnValue ) cmd.Parameters.Append cmd.CreateParameter("@aaa",adInteger,adParamInput ) cmd("@aaa")=10 cmd.Parameters.Append cmd.CreateParameter("@bbb",adInteger,adParamOutput) cmd.Execute() bbb=cmd("@bbb") rrr=cmd("@return_value") %>
|
|
在 Access 中使用“存储过程”
|
作者: 加入时间: 2005-01-13 文档类型: 转载 来自: 浏览统计: total: 91 year: 91 quarter: 91 month: 91 week: 21 today: 1
在 Access 中使用“存储过程”
我们已经熟悉在 ASP 中通过调用 SQL Server 存储过程来执行数据库操作,不过大家是否知道,在桌面级数据库 Access 中,我们也能够创建并使用“存储过程”?
Access + ASP 是开发轻量级 Web 应用程序的绝佳组合:简单,快速,兼容性好,但是性能通常不高。并且,用 ADODB.Connection 和 Recordset 对象来执行 SQL 语句的方式,也有一些不方便,因为带参数的 SQL 语句的参数值也常常是拼接到字符串中,于是便有了诸如“单引号问题”这样的麻烦。使用存储过程的一个好处就是,支持 SQL 语句参数值的另外提供。
事实上,Access(2000 及以上版本)中所谓“存储过程”,和 SQL Server 中的 Stored Procedure 是不能比的。它只能算是“Stored Procedure Lite”,不支持多条 SQL 语句,不支持逻辑语句(呵呵,毕竟不是 T-SQL)等等,我也还不清楚它是不是预编译了。不过,正如同 VBScript 实现的所谓“类”仅仅具有封装性,对于代码结构的“美化”和程序重用性具有很大促进一样,Access 的“轻量存储过程”,对于规范,小出错几率的数据库操作应该也有帮助,并且性能可能会有提高。
下面我译 step by step 的方式,介绍如何在 Access 中创建存储过程,然后在 ASP 程序中使用它。
(一)在 Access 中创建“存储过程”
不知道大家的 Access 应用水平如何,反正它对于我来说,仅仅就是一个 MDB 数据库文件的创建工具,我只会新建 MDB 文件,然后在 Access 的界面中创建表,索引,约束等等,over~
Access 中的“查询”,就扮演了存储过程的角色。下文中我提到的 Access 的“存储过程”或者“查询”都是指这个东西
对于“查询”的创建,Access 提供了一个傻瓜工具,类似 VS.NET 里边建立 DataAdapter 时的向导。不过我喜欢直接写 SQL 代码
好,下面先看看我们这个简单的例子中所使用的数据库的表结构。
然后在 Access 主界面上点击左侧的“查询”按钮,再在右边双击“在设计视图中创建查询”,以打开查询设计视图。
这时弹出的是可视化的查询生成器,我们首先添加 SQL 语句需要涉及的表。
添加表之后,在设计视图上点击鼠标右键,选择“SQL 视图”,以切换到 SQL 代码编辑窗口。
好,下面说说 Access 的存储过程的特点。
Access 的查询,我目前的感觉是对 SQL 语句的一个包装,或许进行了某种优化如预编译。我们不能像写 SQL Server 存储过程那样使用多重操作,事务,逻辑判断,循环等等……
但是我们使用 Access 存储过程的主要目的,就是使用参数额外提供的查询,使用存储过程,我们不必再面对将参数值拼接到 SQL 语句字符串中时遇到的各种麻烦,比如:
代码: Dim sql sql = "SELECT * FROM Users WHERE UserName = '" & userName & "'"
以上代码中,如果字符串变量 userName 中含有“'”单引号,则会报错。我们必须手工转化:
代码: Dim sql sql = "SELECT * FROM Users WHERE UserName = '" & Replace(userName, "'", "''") & "'" '转化为连续两个单引号
而使用带参数查询,我们的 SQL 语句可以写为:
代码: Dim sql sql = "SELECT * FROM Users WHERE UserName = @userName"
然后把参数 @userName 的值以 Command 对象的 Parameter 属性来传入即可,很方便直观。
代码: With cmd '创建参数对象 .Parameters.Append .CreateParameter("@userName")
'给各参数指定值 .Parameters("@userName") = userName End With
这里还要说明 Access 存储过程中参数的使用。和 SQL Server 的存储过程中用 @ 变量指定参数,然后同名传入参数对象不同,Access 中的参数,是以“顺序”而非“名字”来识别的。传入的参数无需指定名字,随便起,SQL 中的参数名字也可以随便起,只要传入参数值时,按照 SQL 语句中的参数出现顺序指定就行了。通常,我们使用 Command 对象的 Execute 方法,直接传入参数值数组来执行~
代码: cmd.Execute , Array(userName)
再比如,你的一个 Access 存储过程这么写:
代码: select * from Users where UserName = p_UserName and BookTitle = p_bookTitle
你可以就这么执行,通过传入参数值数组,但是顺序要对应:
代码: cmd.Execute , Array(userName, bookTitle)
OK,看看我们的例子中使用的两个查询,一个是写入数据。写好 SQL 语句后保存并命名
另一个读取数据的存储过程代码。
(二)使用存储过程
然后我们可以在 ASP 程序中调用这些存储过程了。
这里可以看到为什么我说 Access 中的查询就是它的存储过程——我们的 Command 对象的 CommandType 属性设置的是 4,即 Stored Proc!
so...
以下的代码很简单:
代码: 代码拷贝框 <%
Option Explicit
Dim s
Randomize
s = Rnd * 100
Dim conn, cmd
Set conn = Server.CreateObject("ADODB.Connection")
Set cmd = Server.CreateObject("ADODB.Command")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("sp.mdb")
With cmd
.ActiveConnection = conn
.CommandType = &H0004 '存储过程
.CommandText = "AddNewData"
End With
cmd.Execute , Array(CStr(Now()), CSng(s))
With cmd
.ActiveConnection = conn
.CommandType = &H0004 '存储过程
.CommandText = "GetData"
End With
Dim resultRS, resultArray
Set resultRS = cmd.Execute(, Null)
If Not resultRS.EOF Then
resultArray = resultRS.GetRows()
End If
Set resultRS = Nothing
Set cmd = Nothing
conn.Close
Set conn = Nothing
Response.Write "<ul>"
Dim i
For i = 0 To UBound(resultArray, 2)
Response.Write "<li>" & resultArray(0, i)
Response.Write " " & resultArray(1, i)
Response.Write " " & resultArray(2, i)
Response.Write "</li>"
Next
Response.Write "</ul>"
%>
[Ctrl+A 全部选择 然后拷贝]
运行结果:
|
|
SQL Server 中易混淆的数据类型
|
作者: overmind 加入时间: 2005-01-12 文档类型: 转载 来自: 浏览统计: total: 33 year: 33 quarter: 33 month: 33 week: 11 today: 1
(1)char、varchar、text和nchar、nvarchar、ntext char和varchar的长度都在1到8000之间,它们的区别在于char是定长字符数据,而varchar是变长字符数据。所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度;而变长字符数据则不会以空格填充。text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。
后面三种数据类型和前面的相比,从名称上看只是多了个字母"n",它表示存储的是Unicode数据类型的字符。写过程序的朋友对Unicode应该很了解。字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。nchar、nvarchar的长度是在1到4000之间。和char、varchar比较:nchar、nvarchar则最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能存储8000个英文,4000个汉字。可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。
(2)datetime和smalldatetime datetime:从1753年1月1日到9999年12月31日的日期和时间数据,精确到百分之三秒。 smalldatetime:从1900年1月1日到2079年6月6日的日期和时间数据,精确到分钟。
(3)bitint、int、smallint、tinyint和bit bigint:从-2^63(-9223372036854775808)到2^63-1(9223372036854775807)的整型数据。 int:从-2^31(-2,147,483,648)到2^31-1(2,147,483,647)的整型数据。 smallint:从-2^15(-32,768)到2^15-1(32,767)的整数数据。 tinyint:从0到255的整数数据。 bit:1或0的整数数据。
(4)decimal和numeric 这两种数据类型是等效的。都有两个参数:p(精度)和s(小数位数)。p指定小数点左边和右边可以存储的十进制数字的最大个数,p必须是从 1到38之间的值。s指定小数点右边可以存储的十进制数字的最大个数,s必须是从0到p之间的值,默认小数位数是0。
(5)float和real float:从-1.79^308到1.79^308之间的浮点数字数据。 real:从-3.40^38到3.40^38之间的浮点数字数据。在SQL Server中,real的同义词为float(24)。 |
|
sql server 中字段类型及说明
|
作者: 加入时间: 2005-01-18 文档类型: 转载 来自: 浏览统计: total: 24 year: 24 quarter: 24 month: 24 week: 19 today: 1
Bit 1位,值为0或1 Int Integer 4字节,值为-2^31~2^31-1 Smallint 2字节,值为-2^15~2^15-1 Tinyint 1字节,值为0~255 Decimal (p,s) 数字数据,固定精度为P,宽度为S Numeric Money 8字节,存放货币类型,值为-2^63~2^63-1 Small money 4字节,存放货币类型,值为-214748.3648~+214748.3647近似数值数据类型 Float (n) N在1~24之间,4字节,7位精度 N=1~7为real
N在25~53之间,8字节,15位精度 =8~15为float
Datetime 8字节,描述某天的日期和时刻,值的精确度为1/300秒 Smalldatetime 4字节,描述某天的日期和时刻,精度为分钟 Cursor 对游标的引用 Timestamp 8字节,存放在数据库内唯一的数据 Uniqueidentifier 16字节,存放全局唯一标识(GUID) Char (n) 非unicode字符串的固定长度,n=1~8000 Character (n)
Varchar (n) 可变长度,非unicode字符串n=1~8000 Char varying(n)
Text 服务器代码页中可变长度非unicode数据。最大长度为231-1个字符
Nchar 固定长度unicode字符串n=1~4000 National character (n), National char(n)
Nvarchar 固定长度unicode字符串n=1~4000 National character varying(n)
Ntext 可变长度unicode数据,最大长度为230-1个字符 National text
Binary (n) 固定长度二进制数据,n在1~8000之间,存储空间为n+4字节
Varbinary (n) 可变长度二进制数据,n=1~8000 Binary varying (n)
Tmage 可变长度二进制数据,大小为0~231-1
注意: 1) 对于数值型数据类型,宽度(scale)是指存储在小数点后的数字位数,而精度(precision)是指能存储的包含小数点在内的所有数字位数。 2) money和small money的存储宽度为4。 3) 时间戳列值在每一行更新时系统自动更新,时间戳列不能是关键字或关键字的一部分。 4) 唯一标识数据类型不能使用算术操作符(如+、-等),这种数据类型只能使用相等比较操作。Unicode是所有字符集的一致存储数据的标准。它要使用两倍于非Unicode数据存储的存储空间。 |
|
rs.open sql,conn,1,1 的后两个 1,1 的涵义
|
作者: 加入时间: 2005-01-20 文档类型: 来自: 柠檬树下 浏览统计: total: 38 year: 38 quarter: 38 month: 38 week: 38 today: 1
第一个1是游标类型
第二个1是锁类型
rs.open sql,conn,1,1 的后两个 1,1 各代表什么? RS.OPEN SQL,CONN,A,B A: ADOPENFORWARDONLY(=0) 只读,且当前数据记录只能向下移动 ADOPENSTATIC(=3) 只读,当前数据记录可自由移动 ADOPENKEYSET(=1) 可读写,当前数据记录可自由移动 ADOPENDYNAMIC(=2) 可读写,当前数据记录可自由移动,可看到新增记录 B: ADLOCKREADONLY(=1) 默认值,用来打开只读记录 ADLOCKPESSIMISTIC(=2) 悲观锁定 ADLOCKOPTIMISTIC(=3) 乐观锁定 ADLOCKBATCHOPTIMISTIC(=4) 批次乐观锁定 |
|
XMLHTTP 对象及其方法
|
作者: 加入时间: 2005-01-23 文档类型: 转载 来自: 浏览统计: total: 9 year: 9 quarter: 9 month: 9 week: 9 today: 1
MSXML中提供了Microsoft.XMLHTTP对象,能够完成从数据包到Request对象的转换以及发送任务。 创建XMLHTTP对象的语句如下: Set objXML = CreateObject(Msxml2.XMLHTTP) 或 Set objXML = CreateObject(“Microsoft.XMLHTTP”) ' Or, for version 3.0 of XMLHTTP, use: ' Set xml = Server.CreateObject(MSXML2.ServerXMLHTTP) 对象创建后调用Open方法对Request对象进行初始化,语法格式为: poster.open http-method, url, async, userID, password Open方法中包含了5个参数,前三个是必要的,后两个是可选的(在服务器需要进行身份验证时提供)。参数的含义如下所示: http-method: HTTP的通信方式,比如GET或是 POST url: 接收XML数据的服务器的URL地址。通常在URL中要指明 ASP或CGI程序 async: 一个布尔标识,说明请求是否为异步的。如果是异步通信方式(true),客户机就不等待服务器的响应;如果是同步方式(false),客户机就要等到服务器返回消息后才去执行其他操作 userID 用户ID,用于服务器身份验证 password 用户密码,用于服务器身份验证 XMLHTTP对象的Send方法 用Open方法对Request对象进行初始化后,调用Send方法发送XML数据: poster.send XML-data Send方法的参数类型是Variant,可以是字符串、DOM树或任意数据流。发送数据的方式分为同步和异步两种。在异步方式下,数据包一旦发送完毕,就结束Send进程,客户机执行其他的操作;而在同步方式下,客户机要等到服务器返回确认消息后才结束Send进程。 XMLHTTP对象中的readyState属性能够反映出服务器在处理请求时的进展状况。客户机的程序可以根据这个状态信息设置相应的事件处理方法。属性值及其含义如下表所示: 值 说明 0 Response对象已经创建,但XML文档上载过程尚未结束 1 XML文档已经装载完毕 2 XML文档已经装载完毕,正在处理中 3 部分XML文档已经解析 4 文档已经解析完毕,客户端可以接受返回消息 客户机处理响应信息 客户机接收到返回消息后,进行简单的处理,基本上就完成了C/S之间的一个交互周期。客户机接收响应是通过XMLHTTP对象的属性实现的: ● responseTxt:将返回消息作为文本字符串; ● responseXML:将返回消息视为XML文档,在服务器响应消息中含有XML数据时使用; ● responseStream:将返回消息视为Stream对象。 |
|
XHTML+CSS=网站重构
|
作者: 加入时间: 2005-01-23 文档类型: 转载 来自: 浏览统计: total: 26 year: 26 quarter: 26 month: 26 week: 26 today: 1
一,什么是WEB标准?
WEB标准不是某一个标准,而是一系列标准的集合。网页主要由三部分组成:结构(Structure)、表现(Presentation)和行为(Behavior)。对应的标准也分三方面:结构化标准语言主要包括XHTML和XML,表现标准语言主要包括CSS,行为标准主要包括对象模型(如W3C DOM)、ECMAScript等。这些标准大部分由W3C起草和发布,也有一些是其他标准组织制订的标准,比如ECMA(European Computer Manufacturers Association)的ECMAScript标准。我们来简单了解一下这些标准:
1.结构标准语言
(1)XML
XML是The Extensible Markup Language(可扩展标识语言)的简写。目前推荐遵循的是W3C于2000年10月6日发布的XML1.0,参考( http://www.w3.org/TR/2000/REC-XML-20001006 )。和HTML一样,XML同样来源于SGML,但XML是一种能定义其他语言的语。XML最初设计的目的是弥补HTML的不足,以强大的扩展性满足网络信息发布的需要,后来逐渐用于网络数据的转换和描述。关于XML的好处和技术规范细节这里就不多说了,网上有很多资料,也有很多书籍可以参考。
(2)XHTML
XHTML是The Extensible HyperText Markup Language可扩展标识语言的缩写。目前推荐遵循的是W3C于2000年1月26日推荐XML1.0(参考 http://www.w3.org/TR/xhtml1 )。XML虽然数据转换能力强大,完全可以替代HTML,但面对成千上万已有的站点,直接采用XML还为时过早。因此,我们在HTML4.0的基础上,用XML的规则对其进行扩展,得到了XHTML。简单的说,建立XHTML的目的就是实现HTML向XML的过渡。
2. 表现标准语言
CSS是Cascading Style Sheets层叠样式表的缩写。目前推荐遵循的是W3C于1998年5月12日推荐CSS2(参考 http://www.w3.org/TR/CSS2/ )。W3C创建CSS标准的目的是以CSS取代HTML表格式布局、帧和其他表现的语言。纯CSS布局与结构式XHTML相结合能帮助设计师分离外观与结构,使站点的访问及维护更加容易。
3.行为标准
(1)DOM
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范( http://www.w3.org/DOM/ ),DOM是一种与浏览器,平台,语言的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscaped的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
(2) ECMAScript
ECMAScript是ECMA(European Computer Manufacturers Association)制定的标准脚本语言(JAVAScript)。目前推荐遵循的是ECMAScript 262( http://www.ecma.ch/ecma1/STAND/ECMA-262.HTM )。
二、为什么要建立网站标准?
我们大部分人都有深刻体验,每当主流浏览器版本的升级,我们刚建立的网站就可能变得过时,我们就需要升级或者重新建造一遍网站。例如1996-1999年典型的"浏览器大战",为了兼容Netscape和IE,网站不得不为这两种浏览器写不同的代码。同样的,每当新的网络技术和交互设备的出现,我们也需要制作一个新版本来支持这种新技术或新设备,例如支持手机上网的WAP技术。类似的问题举不胜举:网站代码臃肿、繁杂浪费了我们大量的带宽;针对某种浏览器的DHTML特效,屏蔽了部分潜在的客户;不易用的代码,残障人士无法浏览网站等等。这是一种恶性循环,是一种巨大的浪费。
如何解决这些问题呢?有识之士早已开始思考,需要建立一种普遍认同的标准来结束这种无序和混乱。商业公司(Netscape、Microsoft等)也终于认识到统一标准的好处,因此在W3C(W3C.org)的组织下,网站标准开始被建立(1998年2月10日发布XML1.0为标志),并在网站标准组织(webstandards.org)的督促下推广执行。
简单说,网站标准的目的就是:
提供最多利益给最多的网站用户 确保任何网站文挡都能够长期有效 简化代码、降低建设成本 让网站更容易使用,能适应更多不同用户和更多网路设备 当浏览器版本更新,或者出现新的网络交互设备时,确保所有应用能够继续正确执行。 对于网站设计和开发人员来说,遵循网站标准就是使用标准;对于你的网站用户来说,网站标准就是最佳体验。
三、采用网站标准有什么好处?
对网站浏览者的好处:
文件下载与页面显示速度更快; 内容能被更多的用户所访问(包括失明、视弱、色盲等残障人士); 内容能被更广泛的设备所访问(包括屏幕阅读机、手持设备、搜索机器人、打印机、电冰箱等等) 用户能够通过样式选择定制自己的表现界面 所有页面都能提供适于打印的版本
对网站所有者的好处:
更少的代码和组件,容易维护 带宽要求降低(代码更简洁),成本降低。举个例子:当 ESPN.com 使用 CSS改版后,每天节约超过两兆字节(terabytes)的带宽。 更容易被搜寻引擎搜索到 改版方便,不需要变动页面内容 提供打印版本而不需要复制内容 提高网站易用性。在美国,有严格的法律条款(Section 508)来约束政府网站必须达到一定的易用性,其他国家也有类似的要求。
四、怎么改善现有网站?
我们大部分的设计师依旧在采用传统的表格布局、表现与结构混杂在一起的方式来建立网站。学习使用XHTML+CSS的方法需要一个过程,使现有网站符合网站标准也不可能一步到位。最好的方法是循序渐进,分阶段来逐步达到完全符合网站标准的目标。如果你是新手,或者对代码不是很熟悉,也可以采用遵循标准的编辑工具,例如Dreamweaver MX 2004,它是目前支持CSS标准最完善的工具。
1.初级改善
为页面添加正确的DOCTYPE
很多设计师和开发者都不知道什么是DOCTYPE,DOCTYPE有什么用。DOCTYPE是document type的简写。主要用来说明你用的XHTML或者HTML是什么版本。浏览器根据你DOCTYPE定义的DTD(文档类型定义)来解释页面代码。所以,如果你不注意设置了错误的DOCTYPE,结果会让你大吃一惊。XHTML1.0提供了三种DOCTYPE可选择:
(1)过渡型(Transitional )
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1 /DTD/xhtml1-transitional.dtd">
(2)严格型(Strict )
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1 /DTD/xhtml1-strict.dtd">
(3)框架型(Frameset )
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1 /DTD/xhtml1-frameset.dtd">
对于我们初级改善来说,只要选用过渡型的声明就可以了。它依然可以兼容你的表格布局、表现标识等,不至于让你觉得变化太大,难以掌握。
Tip:你懒得输入上面过渡型代码的话,可以访问 http://www.macromedia.com/ 网站的首页,然后查看源代码,把head区同样的代码拷贝粘贴就可以了。
设定一个名字空间(Namespace)
直接在DOCTYPE声明后面添加如下代码:
<html XMLns="http://www.w3.org/1999/xhtml">
一个namespace是收集元素类型和属性名字的一个详细的DTD,namespace声明允许你通过一个在线地址指向来识别你的namespace。只要照样输入代码就可以。声明你的编码语言
为了被浏览器正确解释和通过标识校验,所有的XHTML文档都必须声明它们所使用的编码语言。代码如下:
<meta http-equiv="Content-Type" content="text/html; charset=GB2312" />
这里声明的编码语言是简体中文GB2312,你如果需要制作繁体内容,可以定义为BIG5。
用小写字母书写所有的标签
XML对大小写是敏感的,所以,XHTML也是大小写有区别的。所有的XHTML元素和属性的名字都必须使用小写。否则你的文档将被W3C校验认为是无效的。例如下面的代码是不正确的:
<TITLE>公司简介</TITLE>
正确的写法是:
<title>公司简介</title> 同样的,<P>改成<p>,<B>改成<b>等等。这步转换很简单。
为图片添加 alt 属性
为所有图片添加alt属性。alt属性指定了当图片不能显示的时候就显示供替换文本,这样做对正常用户可有可无,但对纯文本浏览器和使用屏幕阅读机的用户来说是至关重要的。只有添加了alt属性,代码才会被W3C正确性校验通过。注意的是我们要添加有意义的alt属性,象下面这样的写法毫无意义:
<img src="logo_unc_120x30.gif" alt="logo_unc_120x30.gif">
正确的写法:
<img src="logo_unc_120x30.gif" alt="UNC公司标志,点击返回首页">
给所有属性值加引号
在HTML中,你可以不需要给属性值加引号,但是在XHTML中,它们必须被加引号。
例:height="100",而不能是height=100。
关闭所有的标签
在XHTML中,每一个打开的标签都必须关闭。就象这样:
<p>每一个打开的标签都必须关闭。</p> <b>HTML可以接受不关闭的标,XHTML就不可以。</b>
这个规则可以避免HTML的混乱和麻烦。举例来说:如果你不关闭图像标签,在一些浏览器中就可能出现CSS显示问题。用这种方法能确保页面和你设计的一样显示。需要说明的是:空标签也要关闭,在标签尾部使用一个正斜杠"/"来关闭它们自己。例如:
<br /> <img src="webstandards.gif" />
经过上述七个规则处理后,页面就基本符合XHTML1.0的要求。但我们还需要校验一下是否真的符合标准了。我们可以利用W3C提供免费校验服务( http://validator.w3.org/ )。发现错误后逐个修改。在后面的资源列表中我们也提供了其他校验服务和对校验进行指导的网址,可以作为W3C校验的补充。当最后通过了XHTML验证,恭喜你已经向网站标准迈出了一大步。不是想象中的那么难吧!
2.中级改善
接下来我们的改善主要在结构和表现相分离上,这一步不象第一步那么容易实现,我们需要观念上的转变,以及对CSS2技术的学习和运用。但学习任何新知识都需要花点时间的,不是吗?诀窍在于边做边学。假如你一直采用表格布局,根本没用过 CSS,也不必急于跟表格布局说再见,你可以先用样式表代替 font 标签。随着你学到的越多,你能做的就越多。好,一起来看看我们需要做哪些事:
用CSS定义元素外观
我们在写标识时已经养成习惯,当希望字体大点就用<h1>,希望在前面加个点符号就用<li>。我们总是想<h1>的意思是大的,<li>的意思是圆点,<b>的意思是“加粗文本”。而实际上, <h1>能变成你想要的任何样子,通过CSS,<h1>能变成小的字体,<p>文本能够变成巨大的、粗体的,<li>能够变成一张图片等等。我们不能强迫用结构元素实现表现效果,我们应该使用CSS来确定那些元素的外观。
例如,我们可以使原来默认的6级标题可以看起来大小一样: h1, h2, h3, h4, h5, h6{ font-family: 宋体, serif; font-size: 12px; }
用结构化元素代替无意义的垃圾
许多人可能从来都不知道HTML和XHTML元素设计本意是用来表达结构的。我们很多人已经习惯用元素来控制表现,而不是结构。例如,一段列表内容可能会使用下面这样的标识:
句子一<br /> 句子二<br /> 句子三<br /> 如果我们采用一个无序列表代替会更好: <ul> <li>句子一</li> <li>句子二</li> <li>句子三</li> </ul> 你或许会说“但是<li>显示的是一个圆点,我不想用圆点”。事实上,CSS没有设定元素看起来是什么样子,你完全可以用CSS关掉圆点。
给每个表格和表单加上id 给表格或表单赋予一个唯一的、结构的标记,例如
<table id="menu">
接下来,在书写样式表的时候,你就可以创建一个“menu”的选择器,并且关联一个CSS规则,用来告诉表格单元、文本标签和所有其他元素怎么去显示。这样,不需要对每个%lt;td>标签附带一些多余的、占用带宽的表现层的高、宽、对齐和背景颜色等等属性。只需要一个附着的标记(标记“menu”的id标记),你就可以在一个分离的样式表内为干净的、紧凑的代码标记进行特别的表现层处理。
中级改善我们这里先列主要的三点,但其中包含的内容和知识点非常多,需要我们逐步学习和掌握,直到最后实现完全采用CSS而不才用任何表格实现布局。 |
|
傻男人日记
|
一个女人读她死去男人的日记: 读到相识的那一天,男人写着:“我认识一个让我心跳不已的女孩。”
相恋的那一天,男人写着:“我深深爱上她,她也深爱着我。”同居的第一天,男人写着:“我想照顾她一辈子,所以我愿意她把我的房子当她的。”
怀孕的第一天,男人写着:“我每月记着她的经期,而且都很小心,在她还没想和我结婚时我小心的避开危险的日子,没想到我们还是有了孩子。”
这时女人,急忙地往后翻,天啊!男人的记事本上,每月都有特殊的记号,虽冷汗直流仍继续读下去……
读到结婚的那一天,男人写着:“我好高兴终于娶到她。”
生下孩子的那一天,男人写着:“我抱着我的婴孩感到无限喜悦。”
老大出车祸的那一天,男人写着:“我焦急万分来到医院,看着受伤的孩子护士说必须要输血,毫不考虑挽起袖子,没想到这孩子的血型有些奇怪,不是同我也与她不同,但我赶紧向同事求救有没有相同血型的人。”
老大出车祸的第二天,男人写着:“孩子终于没事,虽然他的血型很奇怪。”
老大出车祸的第三天,男人写着:“我不忍问她,我实在太爱她也太爱这孩子,虽然他的血型很奇怪。”
老大出车祸的第四天,男人写着:“我心里很难受,但看到孩子康复的笑容,我什么都不计较。”
老大出车祸的第五天,男人写着:“不再计较后心中舒坦极了,孩子不是我的,至少也是她的,算是我养大的乖小孩。”
女人的泪缓缓流出,她觉得她是最傻又最幸福的女人,因为他从来没执问她什么,然后她更认真的读着……
读到男人入院的前一天,男人写着:“近来总是觉得身体不适,担心无法再照顾她和三个孩子,但我是个幸福的人,能和所爱的人共渡一辈子,我不知道她到底爱不爱我,只担心我有没有耽误她,使她错过她真爱的那个人。
|
文章收藏 乱闪 发表于 2005/1/19 12:30:59 |
| |
新闻联播
|
1、xxx在钓鱼台国宾馆亲切会见了xxx,宾主进行了亲切友好的会谈。 2、xxx出访xxx,接见了xxx,高度赞赏两国关系,欢迎xx支持xx的立场。 3、外交部发言人xxx就xxx发表声明,对xxx表示遗憾,提出抗议,继续关注。 4、“七五”计划期间,我国xxx重点工程,突破xxx课题,创造效益xxx,实现利税xxx。
5、xx省xx市xx县xx村加强学习“三个代表”的重要精神,切实为农民解决实事。 6、xxx海关加大打击走私力度,破获一起特大的走私案件,查获xxx共xxx,价值人民币x xx元。 7、今天是xxx纪念日,我国各地群众、学生纷纷走上街头,宣传普及xx知识,加强xx教 育。 8、xxx事件的原因已经查明,有关责任人被刑事拘留。 9、今天是xxx诞辰xxx周年纪念日,xxx举行座谈会,深入探讨xxxx,缅怀这位xxxx家。 10、xx国群众不满xxxx,举行抗议示威活动。 11、xx国议会以xx票支持,xx票反对,xx票弃权通过一项xxxx决议。 12、xxxx,xxxx,请看今晚19:45分播出的《焦点访谈》----“xxxxxxxx” 。 今天的新闻联播节目播送完了,观众朋友们,再见 |
文章收藏 乱闪 发表于 2005/1/14 23:38:33 |
| |
精神病人的苦恼
|
疯人院新任院长走到一个病人面前,问他何以进入疯人院。 “医生,是这样的。我娶了一个有成年女儿的寡妇。我父亲却娶了她的女儿为妻,所以我太太成了她公公的岳母,她的女儿成了我的继女和继母。继母生了个儿子,这个孩子成了我的弟弟和我太太的外孙 。我也有了一个儿子,他成了他祖父的内弟,和他自己叔父的叔父。另一方面,我的父亲提到他外孙的时候,说是他的内弟,我的儿子叫他的姐姐作祖母。我现在认为我是我母亲的父亲,我孙子的哥哥,我太太是她女婿的女儿,是她孙子的姐姐。现在我不知道我是自己的祖父,我弟弟的父亲,还是我儿子的侄子,因为我的儿子是我父亲的内弟。院长,这就是我来这里的原因。我觉得在这里比家里平静。”
|
文章收藏 乱闪 发表于 2005/1/14 23:08:46 |
| |
台湾六个极品笑话
|
1、李登辉、连战、陈水扁同坐直升机巡视。 李登辉说:“如果我丢一千块下去,捡到那一个人一定很高兴。“连战说:“如果我丢两张五百元下去,那就有两个人很高兴了。陈水扁说:“如果我丢十张一百元下去,就有十个人很高兴了。”这个时候 ........?驾驶员喃喃自语地说:“何不把自己都丢下去,让两千一百万人都高兴呢?
2、总统阿扁希望提高自己的声望,想要发行一款有自己肖像的邮票..... 发行过了一个多月之后,阿扁想要问看看视察看看销路如何..... 阿扁:“销售情形怎么样?” 邮政总局局长:“还算不错,只不过常常有人抱怨黏不牢!” 阿扁:“怎么会呢?” 阿扁随手拿了一张邮票,涂了一点口水在邮票背面,便试贴在信封上.... 阿扁:“这样不是黏得很紧吗?” 邮政总局局长:“可是......大家....都把口水吐在正面啊......”
3、深夜,阿扁总统要去帮阿珍买夜宵。 结果在路上遇到抢匪… 抢匪拿着枪指着阿扁说:“把身上的钱交出来!” 阿扁勃然大怒说:“你这什么态度?我可是堂堂总统耶!” 抢匪:“喔,那……把我的钱还来。”
4、某天,总统、五院院长...等大官一起参加一个会议,结果发生连环车祸。送至医院急 救,记者们闻风赶至医院 .... 稍久,医生出来了,记者忙着问:“医生!医生!总统有救吗?” 医生沮丧的摇摇头说:“唉..总统没救了...”记者又问:“医生!医生!行政院长有救吗?” 医生又沮丧的摇摇头说:“唉...也没救了...” 记者就问:“那...到底谁有救?” 医生精神一振说:“台湾有救了!”
5、有一天陈水扁总统前往某家精神病院视察, 所有的病患都站在走廊上高声欢呼,陈水扁万岁!陈水扁万岁!只有一名病患面无表情,对总统不理不睬。陈水扁看到了, 于是问院长说:“那位病人为什么不对我欢呼呢?” 院长:“因为他今天精神非常正常。“
6、一辆竞选车载着陈水扁竞选团队开到乡村去造势,不幸在山间小路上翻车,正在农田里干活的老农民看见这情景,就赶到出事地点,可是车上的人都死光了,于是他挖了一个土坑,把几个政客都埋了。过了几天,负责事故勘察的警察找到那个老农民,问他那几个政客到哪里去了,老农民说己经埋了,警察赶紧追问:“他们都死了吗?” 老农回答说:“嗯~我看到陈水扁在我埋他的时候大叫说他还没死。” 警察说:“那你怎么也把他埋了? “老农说:“你知道的嘛~这个陈水扁从不说实话的... |
文章收藏 乱闪 发表于 2005/1/14 22:21:14 |
| |
|