logbasenavicat连接mysql报错报错怎么解决

周热销排行
用户评论(0)
在此可输入您对该资料的评论~
添加成功至
资料评价:LogBase运维安全系统运维用户手册(运维方式)_图文_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
LogBase运维安全系统运维用户手册(运维方式)
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩39页未读,
定制HR最喜欢的简历
你可能喜欢https://blog.csdn.net/
https://static-blog.csdn.net/images/logo.gif
https://blog.csdn.net/taromong
https://blog.csdn.net/
https://blog.csdn.net/taromong/article/details/1451607
https://blog.csdn.net/taromong/article/details/1451607
  我们知道,ASP.net应用程序事实是在服务器上运行的,用户的请求要不断地送往远程的服务器,服务器执行完本地的程序后把重新装载页面再发送客户端。所以就出现了不断刷新的问题,页面不断闪烁。用户不厌其烦,运行效率也大大4降低,服务器的负荷加重。事实,客户端的请求在某一时刻只是通过向 Web 服务器提交新的请求来检索对用户输入所做的响应。这种情况下,开发人员可以使用 JavaScript 在客户端上加载所有响应,从而提供更好的用户体验。遗憾的是,在很多情况下,不必将所有响应都返回或加载到 JavaScript 要更好,只返回所要的结果,执行过程仍然在服务器上运行。 提供了一种新的中间选择,能够在维持及时响应和灵活性的同时利用基于服务器的应用程序。
  依靠服务器作为中介来分发和处理请求。为了完成这项工作,.net封装类依赖于客户端的请求对象,而xmlHttpRequest对象被大部分的浏览器支持,因此使用这个对象是一个不错的解决方案。
  因此,为了实现不刷新的页面,我们的客户端页面做成静态页面。静态页面通过Ajax.net调用.net类的方法。这是一种最简洁又高效的解决方案。
  二、 如何应用Ajax.net
  1.在工程中引入Ajax.dll文件。
  Ajax.dll是微软开发的应用在asp.net上的一个类库文件。该类库封装了XmlHttpRequest请求服务器的实现细节,是Ajax知识应用在asp.net平台上的解决技术。在.net项目中,添加上对其的引用,然后就可以开始使用ajax.dll封装进行开发了。
  2.在web.config中设置HttpHandle
  为了使其可以工作,第一步必须做的是在web.config中安装设置封装包的HttpHandle,不去详细解释HttpHandle是如何工作的,我们只需要了解他们可以用来处理asp.net请求。例如,所有的目的为*.aspx的请求可以通过System.Web.UI.PageHandlerFactory类发送到控制句柄,简单的说,我们把任何向ajax/*.ashx的请求发送到Ajax.PageHandlerFactory的请求处理句柄。
  3.编写服务端函数
  现在我们编写服务器端函数,他们可以被客户端异步的调用。尽管现在还不能支持全部的返回类型,我们仍坚持服务器端添加功能。在codebehind文件的页面类里,添加下面的方法:
[Ajax.AjaxMethod()] public int ServerSideAdd(int firstNumber, int secondNumber) {  return firstNumber + secondN }
  注意,这个函数有Ajax.AjaxMethod()定制属性,属性服务会告知ajax封装类为此方法创建一个javascript代理,这样才能被客户端调用。
  三、 应用实例(点击下载源码)
  我们的应用程序主要是对数据库的操作,数据库的数据通过页面的表格呈现,页面完成增加、删除、更新、查询等功能。更主要的是它是一个通用的并且实现方法极为巧妙的例子。任何页面没有刷新现象并且代码十分精巧。下面的就通过Ajax技术实现这些功能。
  ·建立工程HttpForAjax,并在您的工程中引入Ajax.dll文件。
  ·在您的Web.config中加上。
<httpHandlers> <add verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory, Ajax"/> </httpHandlers>   ·建立您的HTML页。
  1. 向工程里添加HTML页InfoClass.htm。该页面完成查询、常用工具及数据展现等功能。
  页面主要放了四个DIV,一个是树" divTree "。一个是查询区叫"divFindTable"的,一个是工具栏叫"divToolbar"的,一个是数据区叫"divDataGrid"的。如下图:
  2. 在 <HEAD>与</HEAD>间加入一些引用如下:
<script src=js/Xml.js></script> <link href="css/myStyle.css" type="text/css" rel="stylesheet"> <script src="/HttpForAjax/ajax/common.ashx" type="text/javascript"></script> <script src="/HttpForAjax/ajax/Ttyu.AjaxData,HttpForAjax.ashx" type="text/javascript"></script>
  说明:Xml.js是用javascript写的一些客户端程序。
  myStyle.css为样式风格文件。
  common.ashx为调用Ajax的公用方法。
  HttpForAjax.ashx为下面我们要用Ajax编写的类的引用。其中HttpForAjax为工程的命名空间。
  Ttyu.AjaxData为自己开发的类,其中Ttyu为命名空间,AjaxData为类名。
 3. 用javascript编写脚本方法,
function Init() {  DomTree=new dhtmlXTreeObject(document.getElementById('divTree'),"100%","100%",0);  DomTree.setImagePath("imgs/");  DomTree.enableDragAndDrop(true)  DomTree.setDragHandler(myDragHandler);  DomTree.setOnClickHandler(SelectTreeNode);  var s= AjaxData.GetXmlTree().  DomTree.loadXMLString(s);  DomTree.openItem("R_1");  SelectTreeNode("R_1");  divToolbar.innerHTML=AjaxData.GetToolBarTable(TableName).  divDataGrid.innerHTML=GetTableOuterHTML(TableName);
  Init方法通过Ajax的GetXmlTree方法得到树的内容,GetToolBarTable取得工具栏的内容。通过GetTableOuterHTML方法取得物理表tInfoClass的所有数据并通过表格展现出来。
function Find() {  var Table=AjaxData.GetXmlFindTable("年级名称 like '%"+txtName.value +"%'");  divDataGrid.innerHTML=Table. }
  查询方法Find()是通过Ajax的GetXmlFindTable方法按年级名称查询并把结果展现出来。
function OpenAddWeb() {  var RetID =OpenAddWin('InfoClass_edit.aspx?IsAdd=true',370,300);  if(RetID==-1)  InsertRow(DataGrid1,RetID); }
  OpenAddWeb方法打开InfoClass_edit.aspx页在该页上完成增加数据的功能。如果返回值不为-1则表示有新数据增加的并把数据插入到表格的最后一行。RetID表示最后一行的ID. function OpenEditWeb(ThisCell) {  var ID=ThisCell.previousSibling.previousSibling.innerT
 var RetID =OpenAddWin("InfoClass_edit.aspx?ID="+ID+"&IsAdd=false",370,300);  if(RetID==-1)  //有更新行  var CurrRow=ThisCell.parentElement  SetRowText(CurrRow);  // SetRowText(CurrRow,RetDataRow); }
  OpenEditWeb方法是当用户点击的单元格后打开InfoClass_edit.aspx页在该页上完成编辑该行数据的功能。如有更新行则把当前行的内容更换..
  ·建立Ajax类。(见文件AjaxData.cs)命名空间为Ttyu,类名为AjaxData。
  1. 定义静态变量mDt。mDt是读取到物理表的数据并保存在内存中的数据表对象。我们的主要操作都是靠它完成。定义为静态的是我们不希望反复访问数据库。我们一次性读取,永久使用。
static public DataTable mDt;
  2.定义我们的主要方法。在每个方法的上行加上[Ajax.AjaxMethod()]。
//得到表TableName的所得数据,以XML字符串返回 [Ajax.AjaxMethod()] public string GetTableOuterHTML(string TableName) {  DataTable dt=db.DB.GetDataTable(TableName);  mDt=  return db.GetTableOuterHTML(dt.DefaultView); }
  GetTableOuterHTML方法是由物理表名读取到内存中并通过其视图得到以XML格式的Table。这里我们读取后保存在mDt中。用数据表的视图是我们的查询也通过该方法呈现数据。
//得到表TableName的所得数据,以XML字符串返回 [Ajax.AjaxMethod()] public string GetXmlFindTable(string RowFilter) {
 DataTable Dt=mDt;  DataView dv=Dt.DefaultV  dv.RowFilter=RowF  return db.GetTableOuterHTML(dv); }
  GetXmlFindTable是按查询条件从mDt中查询到数据并返回给客户端。
//删除行 [Ajax.AjaxMethod()] public bool DeleteRow(string TableName,int ID) {
 string SQL = "delete from " + TableName + " where ID=" + ID;  bool isSuccess= db.DB.ExecuteSQL(SQL);  if(isSuccess)  {   DataRow dr=mDt.Select("ID="+ID)[0];   mDt.Rows.Remove(dr);  }  return isS }
  DeleteRow是删除物理表的一行,并在mDt中也同步地删除。
//把数据行转化为数组返回 [Ajax.AjaxMethod()] public object GetDataRow(int iID) {
 DataRow dr=mDt.Select("ID="+iID)[0];
 return dr.ItemA//数字类型不能为空
} GetDataRow是从内存表mDt得到ID号为iID的一行,通过数组方式返回给客户端。 [Ajax.AjaxMethod()] public string GetToolBarTable(string TableName) {  return db.GetToolBarTable(TableName); }
  GetToolBarTable是组织成工具栏的内容返回给客户端。
  ·建立业务数据类ttyuPKData。(见文件ttyuPKData.cs)命名空间为Ttyu,类名为ttyuPKData。
  该类中有些常用的方法。
  public bool InsertDataRow(DataRow dr,int BeginColumnIndex)为向物理表中把数据行dr插入,BeginColumnIndex表示从开始的列插入。
  public bool UpdateDataRow(DataRow dr,int BeginColumnIndex,string Filter) 为向物理表中把数据行dr的数据更新,BeginColumnIndex表示开始更新的列。Filter表示所要更新的行。是一筛选条件。
  public string GetTableOuterHTML(DataView dv)是个通用的把数据视图展现为Table的方法。并通过class定义样式。
//由一个数据视图得到该表的表头及所有数据,以XML格式的表字符串返回 public string GetTableOuterHTML(DataView dv) { StringBuilder ret = new StringBuilder(); ret.Append("<table class='DataGrid' id='DataGrid1' cellspacing=1 cellpadding=4>" ); ret.Append("<tr class='DataGridHeaderStyle'>");
ret.Append("<td width='5'> <input type='checkbox' onclick='SelectAll(this)'></td> "); //标题 foreach(System.Data.DataColumn dc in dv.Table.Columns ) {
if(dc.Ordinal==0) //该列隐藏 ret.Append("<td class='IDColumn'>"+dc.ColumnName+"</td>"); else ret.Append("<td>"+dc.ColumnName+"</td>"); } ret.Append("</tr>"); //这时是视图中筛选后的数据
foreach(DataRowView drv in dv) {
DataRow dr=drv.R//dv.Table.Rows[i]; ret.Append(GetRowOuterHTML(dr)); } ret.Append("</table>"); return ret.ToString (); }
  ·建立页面数据编辑类(见文件PageEdit.cs)命名空间为Ttyu.Web,类名为PageEdit。
  该类是个通用的通过继承的技巧实现了所有编辑页(包括增加、修改数据)功能的统一处理。页中不需要一行代码。
  Ajax技术可以给客户端提供丰富的客户体验,而ajax.net为您容易的实现这样强大的功能提供了可能。静态页面是不出现刷新问题的。我们的静态页面通过Ajax完全可与asp.net结合起来。通过.net进行后台的管理。前台通过javascript调用。这样完美的结合是解决问题的最佳方法。
作者:taromong 发表于
https://blog.csdn.net/taromong/article/details/1451607
https://blog.csdn.net/taromong/article/details/1449200
https://blog.csdn.net/taromong/article/details/1449200
【IT168 专稿】AJAX是若干成熟技术的组合,旨在让用户从Web应用中获得更加满意的用户体验。本文回顾了企业应用体系结构的进化历程,试图阐述AJAX是B/S架构发展的必然产物,但是,由于AJAX赖以生存的编程语言的先天不足,AJAX似乎又前途堪忧。本文作者从中间件的角度,对AJAX的未来作出了自己的预测。
1. 什么是AJAX
AJAX的全称是Asynchronous JavaScript and XML,即异步JavaScript和XML。这是一种多项成熟技术的组合,其目的是让Web应用获得与用户快速、即时交互的能力。AJAX所组合的技术,包括:
o JavaScript,Java脚本语言(注意,此Java非Sun公司的Java)
o DHTML,Dynamic HTML,动态HTML
o XML,Extensible Markup Language,可扩展标记语言
o ,Cascading Style Sheets,层叠样式表单
o DOM,Document Object Model,文档对象模型
o 微软的称为XMLHttpRequest的对象
在AJAX技术下,用户会感觉到网页与普通桌面应用一样,响应迅速,而不是像传统网页那样,任何操作都需要等待页面的刷新。AJAX是如何做到这一点的呢?有两个秘密:第一,其实AJAX也会刷新页面,只不过,AJAX可以只刷新部分页面,而不是整个页面;第二,AJAX的页面刷新是异步的,就是说,用户可以继续他的其他操作,而不必等候刷新完成。
当用户浏览一个基于AJAX的Web应用时,用户的请求被提交给一个称为AJAX引擎(AJAX Engine)的代理,这个AJAX引擎负责接收用户请求,从Web服务器上获取响应,并更新浏览器内容。形象地说,传统的Web应用中,浏览器是直接和Web服务器打交道的,而在AJAX应用中,浏览器和Web服务器之间出现了一个来回跑腿的“中介”,而且这个 “中介”相当的勤快,所以,能够给浏览器提供更好的服务,从而使用户获得更满意的应用体验。
AJAX应用的例子,Google Map是一个典型。打开Google Map网站(),会看到一张地图,对地图进行放大、缩小以及拖动等操作,网页的响应十分迅速,看起来好像浏览器事先加载了整张地图。其实,浏览器只是根据你的操作,向服务器请求你所看到的那些数据,并异步地更新你的浏览器内容,这一切,都拜AJAX所赐。
JavaScript和微软的XMLHttpRequest对象,是AJAX 引擎的两条腿。当与浏览器交互时,AJAX引擎使用JavaScript语言;而当与Web服务器交互时,则使用微软的XMLHttpRequest对象。由于AJAX引擎依赖微软的XMLHttpRequest对象技术,所以,早期只有微软的IE浏览器支持AJAX。现在,随着采用AJAX技术的Web应用的不断涌现,所有主流的浏览器,例如Firefox、Netscape、Opera、Safari等,也都支持AJAX了。
2. 企业应用体系结构的进化历程
在笔者看来,AJAX的出现,并非偶然。为了说明这一点,让我们来回顾一下,计算机应用体系结构的发展历史,这或许有助于我们揭示AJAX的来历。
最早的计算机应用,是单机程序,运行在一台计算机上,那时还没有计算机与计算机之间相互通信的概念,因为单机应用已经足以满足人们的需要。因此,两台计算机即使放在同一个实验室,也是“机”犬相闻,老死不相往来。
人的欲望是永远也不会满足的,单机应用没有持续多久,两台计算机之间交换数据的需求,就随着计算机应用范围的扩展而出现了。在PC领域,最初的计算机数据交互形式是串口通信,后来,随着Novell公司著名的NetWare网络技术的推出,运行在两台不同机器上的程序,有了可以更方便地交互的渠道,于是出现了客户机和服务器,即所谓的Client/Server结构,简称C/S结构。C/S结构因其将应用划分为两个部分的特点,也被称为“二端”体系结构。
C/S结构流行若干年后,人们发现,仅仅划分“客户端”和“服务器”两个角色,已经不敷使用,因为随着应用复杂度的不断增加,客户端和服务器都变得越来越庞大,于是,三端体系结构冒了出来,在服务器和客户机之间增加了一个称为“中间件(MiddleWare)”的“端”。在三端体系结构中,原来散布在“客户端”和“服务器”上的一些功能(主要是应用逻辑),慢慢转移到了中间件上,这样就有效地减轻了“客户端”和“服务器”日益沉重的负担,系统的架构重新趋于平衡。
三端体系结构现在仍是企业应用的事实上的标准,这是由三端体系结构的适应性决定的。三个端中,中间件最为灵活,一方面可以担负一部分客户端的任务,有助于打造低成本的“瘦”客户端;另一方面,一些通用的服务也可以从服务器上挪到中间件上,让服务器的功能更加专一,以提高性能。中间件技术,作为三端体系结构的核心技术,催生了很多以中间件为主要产品的软件公司,激烈的竞争,使得中间件技术日趋成熟。
此后虽然出现了所谓的多端(nTier)体系结构,本质上还是三端的,其区别只是一个应用中包含了不只一个中间件和服务器,而是多个中间件,多个服务器,甚至多种客户端。
3. AJAX是B/S结构向三端体系结构进化的产物吗
在“客户端/服务器”体系结构向“客户端/中间件/服务器”体系结构演变的过程中,随着互联网技术的广泛应用,一种更简便的体系结构出现了,那就是所谓的“浏览器/服务器(Browser/Server)”体系结构,简称B/S结构。B/S结构一经出现,就因其无需开发客户端,能大幅度降低企业应用中客户端部署和维护的成本等优点,迅速获得了软件企业及其客户的青睐。现在,B/S结构是最流行的应用体系结构,不论是大型的企业应用,还是小型的个人应用,B/S结构都是首选的体系结构,几乎成了IT界的“默认”选择,甚至我们在谈起某某应用时,都不需要特别说明是什么体系结构了。
如果将B/S结构看作是C/S结构的变种(可能有人不同意,呵呵,只是笔者个人见解而已),那么,我们可以发现,B/S结构不是三端体系结构。在B/S结构中,作为“客户端”的浏览器和作为“服务端”的Web服务器,是直接交互的,并没有中间件的介入,企业应用的业务逻辑,要么驻留在服务器(包括Web服务器、服务器等)上,要么以浏览器作为容器,没有其他去处。因此,从“端”的角度看,B/S结构其实是“二端”的,像C/S结构一样。
如果这个论点是成立的,那么,C/S结构从“二端”向“三端”的演变,是否预示了,B/S结构也会按照同样的方式进化,从而在浏览器和客户端之间,产生出一个“中间件”呢?
AJAX的出现,似乎是对这种预示作出的响应。仔细观察,我们可以在AJAX身上发现中间件的某些特征。首先,AJAX所承载的功能,原本是分布在Web服务器和浏览器上的,AJAX的介入,减轻了客户端和服务器的负担,许多原本需要重载整个页面的请求-响应处理,现在只需重载部分页面了;其次,AJAX部分地接管了浏览器和Web服务器的通信,而通信拦截是中间件的重要特征之一。一方面,AJAX对浏览器的请求进行预分析,另一方面,AJAX对Web服务器的响应进行预处理,AJAX在浏览器和Web服务器之间,扮演了一个“中介”的角色,与三端体系结构中的中间件非常相似。
有趣的是,中间件的出现时机和AJAX的出现时机,也大致相同。C/S结构进入企业应用领域若干年后,中间件出现了,而AJAX的出现,也是在B/S结构开始流行后的若干年。具体的时间长度已经不可考证了,不过,可以留意到的是,中间件是在C/S结构应用大量涌现,客户端和服务器日益膨胀的背景下诞生的,而AJAX也是在B/S结构应用如雨后春笋般冒出,网页上Flash和广告群魔乱舞,用户不再满足于平淡和迟钝的应用体验的情形下,在Web应用中崭露头角的。
4. AJAX有没有未来
如果问一下,Web世界里谁是炙手可热的红人,不少人一定会选择AJAX了。不错,AJAX现在确实非常火爆,自从Google开创了AJAX应用的先河之后,在Web领域,应用不论大小,程度不分高低,只要和Web沾边的,人也好物也好,都要披上一件AJAX的时尚外衣,以示自己没有落到潮流的后面。AJAX就像一桌美味佳肴,虽然选材未必精良,但色香味俱全,在这样的诱惑下,程序员们要保持冷静的态度和清醒的头脑,殊非不易。其实,洗净AJAX表面的各味调料,将AJAX的真材实料展示在食客的眼前,我们就会感觉到,AJAX的未来并不明朗。
理由之一,虽然从企业应用体系结构发展的历史来看,AJAX的作为B/S结构的中间件出现,有其必然性,但别忘了,这是有假设条件的,这个假设条件就是,B/S结构可以作为二端结构来看待。这个假设不是所有人都同意的,因为也有一种观点,是将B/S结构看作三端结构。很简单,只要将Web服务器往前提一提,B/S结构就变成三端结构了:浏览器是客户端,数据库是服务器端,而Web服务器是中间件。这是非常典型的Web企业应用架构,可是在这个架构下,AJAX没有地位。AJAX的一部分在浏览器,另一部分在Web服务器,并没有独立出来,它必须依附浏览器和Web服务器而存在,因此,AJAX还不能单独成为一个端,当然,也就更谈不上成为中间件了。
理由之二,即便大家都同意B/S结构可以视为二端结构,AJAX想要攀升到中间件的地位,仍然面临许多悬而未决的问题。首先,AJAX赖以生存的编程语言是JavaScript,这是一个脚本语言,是解释性语言,虽然简单、灵活并且容易上手,但具有解释性语言的先天不足,比如,执行效率就是JavaScript的一个大问题,在浏览器上玩些花样尚可,如果要作为中间件的编程语言,那就有点勉为其难了;其次,脚本语言结构管理能力的低下,也是JavaScript成为中间件编程语言的障碍,用JavaScript很难写出像C++或Java那样规范、可靠、合理而优美的程序,而且,现今广为接受的面向对象的编程思想,在JavaScript下要运用起来,似乎也不是特别的自然。
如此看来,AJAX的未来确实非常迷茫,即使受到越来越多AJAX支持者的追捧,但如果想要走得更远,似乎也心有余而力不足。AJAX问题的症结,就在于JavaScript语言。对于这种语言,一直有两股势力在对抗。一种是看好JavaScript,认为其简单易学、灵活多变而且功能强大;另一种则对JavaScript不屑一顾,甚至根本不愿意承认它是一种编程语言。我见过一些非常资深的程序员,对JavaScript的态度,可以用“仇视”二字来描述。一种语言同时受到如此截然相反两种对待,我所知道的,也就只有JavaScript了。
JavaScript遭受到的如此冰火两重天的待遇,注定了建立在JavaScript之上的AJAX的尴尬地位。AJAX的未来,很大程度上取决于JavaScript的前途。胜者王侯败者寇,现在AJAX最关心的,莫过于JavaScript面前水火不相容的两股势力,谁会是最后的赢家。AJAX和JavaScript,一根线上的两只蚂蚱,它们的未来,已经牢牢地绑定在一起,谁又能把它们分开呢?
作者:taromong 发表于
https://blog.csdn.net/taromong/article/details/1449200
https://blog.csdn.net/taromong/article/details/1449194
https://blog.csdn.net/taromong/article/details/1449194
C# 出来也有些日子了,最近由于编程的需要,对 C# 的类型转换做了一些研究,在学习中整理了一份在这里与大家分享,很适用哦!
其内容涉及 C# 的装箱/拆箱/别名、数值类型间相互转换、字符的 ASCII 码和 Unicode 码、数值字符串和数值之间的转换、字符串和字符数组/字节数组之间的转换、各种数值类型和字节数组之间的转换、十六进制数输出以及日期型数据的一些转换处理。1. 装箱、拆箱还是别名
许多 C# 的书上都有介绍 int -& Int32 是一个装箱的过程,反之则是拆箱的过程。许多其它变量类型也是如此,如:short &-& Int16,long &-& Int64 等。对于一般的程序员来说,大可不必去了解这一过程,因为这些装箱和拆箱的动作都是可以自动完成的,不需要写代码进行干预。但是我们需要记住这些类型之间的关系,所以,我们使用“别名”来记忆它们之间的关系。
C# 是全面向对象的语言,比 Java 的面向对象都还彻底——它把简单数据类型通过默认的装箱动作封装成了类。Int32、Int16、Int64 等就是相应的类名,而那些我们熟悉的、简单易记的名称,如 int、short、long 等,我们就可以把它称作是 Int32、Int16、Int64 等类型的别名。
那么除了这三种类型之外,还有哪些类有“别名”呢?常用的有如下一些:
bool -& System.Boolean (布尔型,其值为 true 或者 false)
char -& System.Char (字符型,占有两个字节,表示 1 个 Unicode 字符)
byte -& System.Byte (字节型,占 1 字节,表示 8 位正整数,范围 0 ~ 255)
sbyte -& System.SByte (带符号字节型,占 1 字节,表示 8 位整数,范围 -128 ~ 127)
ushort -& System.UInt16 (无符号短整型,占 2 字节,表示 16 位正整数,范围 0 ~ 65,535)
uint -& System.UInt32 (无符号整型,占 4 字节,表示 32 位正整数,范围 0 ~ 4,294,967,295)
ulong -& System.UInt64 (无符号长整型,占 8 字节,表示 64 位正整数,范围 0 ~ 大约 10 的 20 次方)
short -& System.Int16 (短整型,占 2 字节,表示 16 位整数,范围 -32,768 ~ 32,767)
int -& System.Int32 (整型,占 4 字节,表示 32 位整数,范围 -2,147,483,648 到 2,147,483,647)
long -& System.Int64 (长整型,占 8 字节,表示 64 位整数,范围大约 -(10 的 19) 次方 到 10 的 19 次方)
float -& System.Single (单精度浮点型,占 4 个字节)
double -& System.Double (双精度浮点型,占 8 个字节)
我们可以用下列代码做一个实验:
private void TestAlias() {
// this.textBox1 是一个文本框,类型为 System.Windows.Forms.TextBox
// 设计中已经将其 Multiline 属性设置为 true
byte a = 1; char b = 'a'; short c = 1;
int d = 2; long e = 3; uint f = 4; bool g =
this.textBox1.Text = "";
this.textBox1.AppendText("byte -& " + a.GetType().FullName + "/n");
this.textBox1.AppendText("char -& " + b.GetType().FullName + "/n");
this.textBox1.AppendText("short -& " + c.GetType().FullName + "/n");
this.textBox1.AppendText("int -& " + d.GetType().FullName + "/n");
this.textBox1.AppendText("long -& " + e.GetType().FullName + "/n");
this.textBox1.AppendText("uint -& " + f.GetType().FullName + "/n");
this.textBox1.AppendText("bool -& " + g.GetType().FullName + "/n");
在窗体中新建一个按钮,并在它的单击事件中调用该 TestAlias() 函数,我们将看到运行结果如下:
byte -& System.Byte
char -& System.Char
short -& System.Int16
int -& System.Int32
long -& System.Int64
uint -& System.UInt32
bool -& System.Boolean
这足以说明各别名对应的类!
2. 数值类型之间的相互转换
这里所说的数值类型包括 byte, short, int, long, fload, double 等,根据这个排列顺序,各种类型的值依次可以向后自动进行转换。举个例来说,把一个 short 型的数据赋值给一个 int 型的变量,short 值会自动行转换成 int 型值,再赋给 int 型变量。如下例:
private void TestBasic() {
byte a = 1; short b = int c =
long d = float e = double f =
this.textBox1.Text = "";
this.textBox1.AppendText("byte a = " + a.ToString() + "/n");
this.textBox1.AppendText("short b = " + b.ToString() + "/n");
this.textBox1.AppendText("int c = " + c.ToString() + "/n");
this.textBox1.AppendText("long d = " + d.ToString() + "/n");
this.textBox1.AppendText("float e = " + e.ToString() + "/n");
this.textBox1.AppendText("double f = " + f.ToString() + "/n");
编译顺利通过,运行结果是各变量的值均为 1;当然,它们的类型分别还是 System.Byte 型……System.Double 型。现在我们来试试,如果把赋值的顺序反过来会怎么样呢?在 TestBasic() 函数中追加如下语句:
int g = 1;
this.textBox1.AppendText("h = " + h.ToString() + "/n");
结果编译报错:
G:/Projects/Visual C#/Convert/Form1.cs(118): 无法将类型“int”隐式转换为“short”
其中,Form1.cs 的 118 行即 short h = g 所在行。
这个时候,如果我们坚持要进行转换,就应该使用强制类型转换,这在 C 语言中常有提及,就是使用“(类型名) 变量名”形式的语句来对数据进行强制转换。如上例修改如下:
short g = 1;
byte h = (byte) // 将 short 型的 g 的值强制转换成 short 型后再赋给变量 h
this.textBox1.AppendText("h = " + h.ToString() + "/n");
编译通过,运行结果输出了 h = 1,转换成功。
但是,如果我们使用强制转换,就不得不再考虑一个问题:short 型的范围是 -32768 ~ 23767,而 byte 型的范围是 0 ~ 255,那么,如果变量 g 的大小超过了 byte 型的范围又会出现什么样的情况呢?我们不妨再一次改写代码,将值改为 265,比 255 大 10
short g = 265; //265 = 255 + 10
byte h = (byte)
this.textBox1.AppendText("h = " + h.ToString() + "/n");
编译没有出错,运行结果却不是 h = 265,而是 h = 9。
因此,我们在进行转换的时候,应当注意被转换的数据不能超出目标类型的范围。这不仅体现在多字节数据类型(相对,如上例的 short) 转换为少字节类型(相对,如上例的 byte) 时,也体现在字节数相同的有符号类型和无符号类型之间,如将 byte 的 129 转换为 sbyte 就会溢出。这方面的例子大同小异,就不详细说明了。
3. 字符的 ASCII 码和 Unicode 码
很多时候我们需要得到一个英文字符的 ASCII 码,或者一个汉字字符的 Unicode 码,或者从相关的编码查询它是哪一个字符的编码。很多人,尤其是从 VB 程序序转过来学 C# 的人,会报怨 C# 里为什么没有提供现成的函数来做这个事情——因为在 VB 中有 Asc() 函数和 Chr() 函数用于这类转换。
但是如果你学过 C,你就会清楚,我们只需要将英文字符型数据强制转换成合适的数值型数据,就可以得到相应的 ASCII 码;反之,如果将一个合适的数值型数据强制转换成字符型数据,就可以得到相应的字符。
C# 中字符的范围扩大了,不仅包含了单字节字符,也可以包含双字节字符,如中文字符等。而在字符和编码之间的转换,则仍延用了 C 语言的做法——强制转换。不妨看看下面的例子
private void TestChar() {
char ch = 'a'; short ii = 65;
this.textBox1.Text = "";
this.textBox1.AppendText("The ASCII code of /'" + ch + "/' is: " + (short) ch + "/n");
this.textBox1.AppendText("ASCII is " + ii.ToString() + ", the char is: " + (char) ii + "/n");
char cn = '中'; short uc = 22478;
this.textBox1.AppendText("The Unicode of /'" + cn + "/' is: " + (short) cn + "/n");
this.textBox1.AppendText("Unicode is " + uc.ToString() + ", the char is: " + (char) uc + "/n");
它的运行结果是
The ASCII code of 'a' is: 97
ASCII is 65, the char is: A
The Unicode of '中' is: 20013
Unicode is 22478, the char is: 城
从这个例子中,我们便能非常清楚的了解——通过强制转换,可以得以字符的编码,或者得到编码表示的字符。如果你需要的不是 short 型的编码,请参考第 1 条进行转换,即可得到 int 等类型的编码值。
4. 数值字符串和数值之间的转换
首先,我们得搞明白,什么是数值字符串。我们知道,在 C# 中,字符串是用一对双引号包含的若干字符来表示的,如 "123"。而 "123" 又相对特殊,因为组成该字符串的字符都是数字,这样的字符串,就是数值字符串。在我们的眼中,这即是一串字符,也是一个数,但计算机却只认为它是一个字符串,不是数。因此,我们在某些时候,比如输入数值的时候,把字符串转换成数值;而在另一些时候,我们需要相反的转换。
将数值转换成字符串非常简单,因为每一个类都有一个 void ToString() 方法。所有数值型的 void ToString() 方法都能将数据转换为数值字符串。如 123.ToSting() 就将得到字符串 "123"。
那么反过来,将数值型字符串转换成数值又该怎么办呢?我们仔细查找一下,会发现 short, int, float 等数值类型均有一个 static Parse() 函数。这个函数就是用来将字符串转换为相应数值的。我们以一个 float 类型的转换为例: float f = float.Parse("543.21"); 其结果 f 的值为 543.21F。当然,其它的数值类型也可以使用同样的方法进行转换,下面的例子可以更明确的说明转换的方法:
private void TestStringValue() {
float f = 54.321F;
string str = "123";
this.textBox1.Text = "";
this.textBox1.AppendText("f = " + f.ToString() + "/n");
if (int.Parse(str) == 123) {
this.textBox1.AppendText("str convert to int successfully.");
this.textBox1.AppendText("str convert to int failed.");
运行结果:
f = 54.321
str convert to int successfully.
5. 字符串和字符数组之间的转换
字符串类 System.String 提供了一个 void ToCharArray() 方法,该方法可以实现字符串到字符数组的转换。如下例:
private void TestStringChars() {
string str = "mytest";
char[] chars = str.ToCharArray();
this.textBox1.Text = "";
this.textBox1.AppendText("Length of /"mytest/" is " + str.Length + "/n");
this.textBox1.AppendText("Length of char array is " + chars.Length + "/n");
this.textBox1.AppendText("char[2] = " + chars[2] + "/n");
例中以对转换转换到的字符数组长度和它的一个元素进行了测试,结果如下:
Length of "mytest" is 6
Length of char array is 6
char[2] = t
可以看出,结果完全正确,这说明转换成功。那么反过来,要把字符数组转换成字符串又该如何呢?
我们可以使用 System.String 类的构造函数来解决这个问题。System.String 类有两个构造函数是通过字符数组来构造的,即 String(char[]) 和 String[char[], int, int)。后者之所以多两个参数,是因为可以指定用字符数组中的哪一部分来构造字符串。而前者则是用字符数组的全部元素来构造字符串。我们以前者为例,在 TestStringChars() 函数中输入如下语句:
char[] tcs = {'t', 'e', 's', 't', ' ', 'm', 'e'};
string tstr = new String(tcs);
this.textBox1.AppendText("tstr = /"" + tstr + "/"/n");
运行结果输入 tstr = "test me",测试说明转换成功。
实际上,我们在很多时候需要把字符串转换成字符数组只是为了得到该字符串中的某个字符。如果只是为了这个目的,那大可不必兴师动众的去进行转换,我们只需要使用 System.String 的 [] 运算符就可以达到目的。请看下例,再在 TestStringChars() 函数中加入如如下语名:
char ch = tstr[3];
this.textBox1.AppendText("/"" + tstr + "/"[3] = " + ch.ToString());
正确的输出是 "test me"[3] = t,经测试,输出正确。
6. 字符串和字节数组之间的转换
如果还想从 System.String 类中找到方法进行字符串和字节数组之间的转换,恐怕你会失望了。为了进行这样的转换,我们不得不借助另一个类:System.Text.Encoding。该类提供了 bye[] GetBytes(string) 方法将字符串转换成字节数组,还提供了 string GetString(byte[]) 方法将字节数组转换成字符串。
System.Text.Encoding 类似乎没有可用的构造函数,但我们可以找到几个默认的 Encoding,即 Encoding.Default(获取系统的当前 ANSI 代码页的编码)、Encoding.ASCII(获取 7 位 ASCII 字符集的编码)、Encoding.Unicode(获取采用 Little-Endian 字节顺序的 Unicode 格式的编码)、Encoding.UTF7(获取 UTF-7 格式的编码)、Encoding.UTF8(获取 UTF-8 格式的编码) 等。这里主要说说 Encoding.Default 和 Encoding.Unicode 用于转换的区别。
在字符串转换到字节数组的过程中,Encoding.Default 会将每个单字节字符,如半角英文,转换成 1 个字节,而把每个双字节字符,如汉字,转换成 2 个字节。而 Encoding.Unicode 则会将它们都转换成两个字节。我们可以通过下列简单的了解一下转换的方法,以及使用 Encoding.Default 和 Encodeing.Unicode 的区别:
private void TestStringBytes() {
string s = "C#语言";
byte[] b1 = System.Text.Encoding.Default.GetBytes(s);
byte[] b2 = System.Text.Encoding.Unicode.GetBytes(s);
string t1 = "", t2 = "";
foreach (byte b in b1) {
t1 += b.ToString("") + " ";
foreach (byte b in b2) {
t2 += b.ToString("") + " ";
this.textBox1.Text = "";
this.textBox1.AppendText("b1.Length = " + b1.Length + "/n");
this.textBox1.AppendText(t1 + "/n");
this.textBox1.AppendText("b2.Length = " + b2.Length + "/n");
this.textBox1.AppendText(t2 + "/n");
运行结果如下,不说详述,相信大家已经明白了。
b1.Length = 6
67 35 211 239 209 212
b2.Length = 8
67 0 35 0 237 139 0 138
将字节数组转换成字符串,使用 Encoding 类的 string GetString(byte[]) 或 string GetString(byte[], int, int) 方法,具体使用何种 Encoding 还是由编码决定。在 TestStringBytes() 函数中添加如下语句作为实例:
byte[] bs = {97, 98, 99, 100, 101, 102};
string ss = System.Text.Encoding.ASCII.GetString(bs);
this.textBox1.AppendText("The string is: " + ss + "/n");
运行结果为:The string is: abcdef
7. 各种数值类型和字节数组之间的转换
在第 1 条中我们可以查到各种数值型需要使用多少字节的空间来保存数据。将某种数值类型的数据转换成字节数组的时候,得到的一定是相应大小的字节数组;同样,需要把字节数组转换成数值类型,也需要这个字节数组大于相应数值类型的字节数。
现在介绍此类转换的主角:System.BitConverter。该类提供了 byte[] GetBytes(...) 方法将各种数值类型转换成字节数组,也提供了 ToInt32、ToInt16、ToInt64、ToUInt32、ToSignle、ToBoolean 等方法将字节数组转换成相应的数值类型。
由于这类转换通常只是在需要进行较细微的编码/解码操作时才会用到,所以这里就不详细叙述了,仅把 System.BitConverter 类介绍给大家。
8. 转换成十六进制
任何数据在计算机内部都是以二进制保存的,所以进制与数据的存储无关,只与输入输出有关。所以,对于进制转换,我们只关心字符串中的结果。
在上面的第 4 条中提到了 ToString() 方法可以将数值转换成字符串,不过在字符串中,结果是以十进制显示的。现在我们带给它加一些参数,就可以将其转换成十六进制——使用 ToString(string) 方法。
这里需要一个 string 类型的参数,这就是格式说明符。十六进制的格式说明符是 "x" 或者 "X",使用这两种格式说明符的区别主要在于 A-F 六个数字:"x" 代表 a-f 使用小写字母表示,而 "X" 而表示 A-F 使用大字字母表示。如下例:
private void TestHex() {
int a = 188;
this.textBox1.Text = "";
this.textBox1.AppendText("a(10) = " + a.ToString() + "/n");
this.textBox1.AppendText("a(16) = " + a.ToString("x") + "/n");
this.textBox1.AppendText("a(16) = " + a.ToString("X") + "/n");
运行结果如下:
a(10) = 188
a(16) = bc
a(16) = BC
这时候,我们可能有另一种需求,即为了显示结果的整齐,我们需要控制十六进制表示的长度,如果长度不够,用前导的 0 填补。解决这个问题,我们只需要在格式说明符“x”或者“X”后写上表示长度的数字就行了。比如,要限制在 4 个字符的长度,可以写成“X4”。在上例中追加一句:
this.textBox1.AppendText("a(16) = " + a.ToString("X4") + "/n");
其结果将输出 a(16) = 00BC。
现在,我们还要说一说如何将一个表示十六进制数的字符串转换成整型。这一转换,同样需要借助于 Parse() 方法。这里,我需要 Parse(string, System.Globalization.NumberStyles) 方法。第一个参数是表示十六进制数的字符串,如“AB”、“20”(表示十进制的 32) 等。第二个参数 System.Globalization.NumberStyles 是一个枚举类型,用来表示十六进制的枚举值是 HexNumber。因此,如果我们要将“AB”转换成整型,就应该这样写:int b = int.Parse("AB", System.Globalization.NumberStyles.HexNumber),最后得到的 b 的值是 171。
9. 日期型数据和长整型数据之间的转换
为什么要将日期型数据转换为长整型数据呢?原因很多,但就我个人来说,经常将它用于的日期存储。由于各种数据库对日期型的定义和处理是不一样的,各种语言对日期型数据的定义的处理也各不相同,因为,我宁愿将日期型数据转换成长整型再保存到数据库中。虽然也可以使用字符串来保存,但使用字符串也会涉及到许多问题,如区域等问题,而且,它需要比保存长整型数据更多的空间。
日期型数据,在 C# 中的参与运算的时候,应该也是转换为长整型数据来运算的。它的长整型值是自 0001 年 1 月 1 日午夜 12:00 以来所经过时间以 100 毫微秒为间隔表示时的数字。这个数在 C# 的 DateTime 中被称为 Ticks(刻度)。DateTime 类型有一个名为 Ticks 的长整型只读属性,就保存着这个值。如此,要从一个 DataTime 型数据得到 long 型值就非常简单了,只需要读出 DataTime 对象的 Ticks 值即可,如:
long longDate = DateTime.Now.T
DateTime 的构造函数中也提供了相应的,从长整型数据构造 DateTime 型数据的函数:DateTime(long)。如:
DateTime theDate = new DateTime(longDate);
但这样对于很多 VB6 程序员来说,是给他们出了一道难题,因为 VB6 中的日期型数据内部是以 Double 型表示的,将其转换为长整型后得到的仅仅是日期,而没有时间。如何协调这两种日期类型呢?
System.DateTime 提供了 double ToOADate() 和 static DateTime FromOADate(double) 两个函数来解决这个问题。前者将当前对象按原来的 double 值输出,后者则从一个 double 值获得一个 System.DateTime 对象。举例如下:
private void TestDateTimeLong() {
double doubleDate = DateTime.Now.ToOADate();
DateTime theDate = DateTime.FromOADate(doubleDate);
this.textBox1.Text = "";
this.textBox1.AppendText("Double value of now: " + doubleDate.ToString() + "/n");
this.textBox1.AppendText("DateTime from double value: " + theDate.ToString() + "/n");
运行结果:
Double value of now: 713
DateTime from double value:
10. 格式化日期型数据
编程的过程中,通常需要将日期型数据按照一定的格式输出,当然,输出结果肯定是字符串。为此,我们需要使用 System.DateTime 类的 ToString() 方法,并为其指定格式字符串。
MSDN 中,System.Globalization.DateTimeFormatInfo 类的概述里对模式字符串有非常详细的说明,因此,这里我只对常用的一些格式进行说明,首先请看下表:
d 月中的某一天。一位数的日期没有前导零。
dd 月中的某一天。一位数的日期有一个前导零。
ddd 周中某天的缩写名称,在 AbbreviatedDayNames 中定义。
dddd 周中某天的完整名称,在 DayNames 中定义。
M 月份数字。一位数的月份没有前导零。
MM 月份数字。一位数的月份有一个前导零。
MMM 月份的缩写名称,在 AbbreviatedMonthNames 中定义。
MMMM 月份的完整名称,在 MonthNames 中定义。
y 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示不具有前导零的年份。
yy 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示具有前导零的年份。
yyyy 包括纪元的四位数的年份。
h 12 小时制的小时。一位数的小时数没有前导零。
hh 12 小时制的小时。一位数的小时数有前导零。
H 24 小时制的小时。一位数的小时数没有前导零。
HH 24 小时制的小时。一位数的小时数有前导零。
m 分钟。一位数的分钟数没有前导零。
mm 分钟。一位数的分钟数有一个前导零。
s 秒。一位数的秒数没有前导零。
ss 秒。一位数的秒数有一个前导零。
为了便于大家的理解,不妨试试下面的程序:
private void TestDateTimeToString() {
DateTime now = DateTime.N
this.textBox1.Text = "";
format = "yyyy-MM-dd HH:mm:ss";
this.textBox1.AppendText(format + ": " + now.ToString(format) + "/n");
format = "yy年M日d日";
this.textBox1.AppendText(format + ": " + now.ToString(format) + "/n");
这段程序将输出结果:
yyyy-MM-dd HH:mm:ss:
yy年M日d日: 02年8日26日
这时候,又出现一个问题,如果要输出的文本信息中包含格式字符怎么办?如
format = "year: yyyy, month: MM, day: dd";
this.textBox1.AppendText(now.ToString(format) + "/n");
2ear: 2002, 4on下5: 08, 26a2: 26
这并不是我想要的结果,怎么办呢?有办法——
format = "/"year/": yyyy, /'month/': MM, /'day/': dd";
this.textBox1.AppendText(now.ToString(format) + "/n");
看,这次运行结果对了:
year: 2002, month: 08, day: 26
可以看出,只需要使用单引号或者双引号将文本信息括起来就好。
作者:taromong 发表于
https://blog.csdn.net/taromong/article/details/1449194
https://blog.csdn.net/taromong/article/details/1448672
https://blog.csdn.net/taromong/article/details/1448672
asc 按升序排列desc 按降序排列下列语句部分是Mssql语句,不可以在access中使用。
SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)
首先,简要介绍基础语句:1、说明:创建数据库CREATE DATABASE database-name 2、说明:删除数据库drop database dbname3、说明:备份sql server--- 创建 备份数据的 deviceUSE masterEXEC sp_addumpdevice 'disk', 'testBack', 'c:/mssql7backup/MyNwind_1.dat'--- 开始 备份BACKUP DATABASE pubs TO testBack 4、说明:创建新表create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)根据已有的表创建新表: A:create table tab_new like tab_old (使用旧表创建新表)B:create table tab_new as select col1,col2… from tab_old definition only5、说明:删除新表drop table tabname 6、说明:增加一个列Alter table tabname add column col type注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。7、说明:添加主键: Alter table tabname add primary key(col) 说明:删除主键: Alter table tabname drop primary key(col) 8、说明:创建索引:create [unique] index idxname on tabname(col….) 删除索引:drop index idxname注:索引是不可更改的,想更改必须删除重新建。9、说明:创建视图:create view viewname as select statement 删除视图:drop view viewname10、说明:几个简单的基本的sql语句选择:select * from table1 where 范围插入:insert into table1(field1,field2) values(value1,value2)删除:delete from table1 where 范围更新:update table1 set field1=value1 where 范围查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!排序:select * from table1 order by field1,field2 [desc]总数:select count as totalcount from table1求和:select sum(field1) as sumvalue from table1平均:select avg(field1) as avgvalue from table1最大:select max(field1) as maxvalue from table1最小:select min(field1) as minvalue from table111、说明:几个高级查询运算词A: UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 B: EXCEPT 运算符 EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 C: INTERSECT 运算符INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 注:使用运算词的几个查询结果行必须是一致的。 12、说明:使用外连接 A、left outer join: 左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.cB:right outer join: 右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 C:full outer join: 全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
其次,大家来看一些不错的sql语句1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1&&1法二:select top 0 * into b from a
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)insert into b(a, b, c) select d,e,
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件例子:..from b in '"&Server.MapPath(".")&"/data.mdb" &"' where..
4、说明:子查询(表名1:a 表名2:b)select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)
5、说明:显示文章、提交人和最后回复时间select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
6、说明:外连接查询(表名1:a 表名2:b)select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
7、说明:在线视图查询(表名1:a )select * from (SELECT a,b,c FROM a) T where t.a & 1;
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括select * from table1 where time between time1 and time2select a,b,c, from table1 where a not between 数值1 and 数值2
9、说明:in 的使用方法select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)
10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
11、说明:四表联查问题:select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
12、说明:日程安排提前五分钟提醒 SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())&5
13、说明:一条sql 语句搞定数据库分页select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
14、说明:前10条记录select top 10 * form table1 where 范围
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表(select a from tableA ) except (select a from tableB) except (select a from tableC)
17、说明:随机取出10条数据select top 10 * from tablename order by newid()
18、说明:随机选择记录select newid()
19、说明:删除重复记录Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
20、说明:列出数据库里所有的表名select name from sysobjects where type='U'
21、说明:列出表里的所有的select name from syscolumns where id=object_id('TableName')
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type显示结果:type vender pcs电脑 A 1电脑 A 1光盘 B 2光盘 A 2手机 B 3手机 C 3
23、说明:初始化表table1
TRUNCATE TABLE table1
24、说明:选择从10到15的记录select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc  随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)  对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环: Randomize RNumber = Int(Rnd*499) +1  While Not objRec.EOF If objRec("ID") = RNumber THEN ... 这里是执行脚本 ... end if objRec.MoveNext Wend    这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了?   采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示: Randomize RNumber = Int(Rnd*499) + 1  SQL = "SELECT * FROM Customers WHERE ID = " & RNumber  set objRec = ObjConn.Execute(SQL) Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")    不必写出RNumber 和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。 再谈随机数   现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。   为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录: SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3    假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里的ID 是自动生成的号码): SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"
  注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。
 随机读取若干条记录,测试过Access语法:SELECT top 10 * From 表名 ORDER BY Rnd(id)Sql server:select top n * from 表名 order by newid()mysqlelect * From 表名 Order By rand() Limit nAccess左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)语法elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...使用SQL语句 用...代替过长的字符串显示语法:SQL数据库:select case when len(field)&10 then left(field,10)+'...' else field end as news_name,news_id from tablenameAccess数据库:SELECT iif(len(field)&2,left(field,2)+'...',field) FROM  Conn.Execute说明Execute方法  该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种:
1.执行SQL查询语句时,将返回查询得到的记录集。用法为:    Set 对象变量名=连接对象.Execute("SQL 查询语言")   Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。
    2.执行SQL的操作性语言时,没有记录集的返回。此时用法为:    连接对象.Execute "SQL 操作性语句" [, RecordAffected][, Option]      ·RecordAffected 为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。      ·Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。
·BeginTrans、RollbackTrans、CommitTrans方法  这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。  事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。  BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生,事务处理失败。Error集合中的每一个Error对象,代表一个错误信息。
作者:taromong 发表于
https://blog.csdn.net/taromong/article/details/1448672
https://blog.csdn.net/taromong/article/details/1448653
https://blog.csdn.net/taromong/article/details/1448653
本文档的状况
  本节描述本文档发布时的状况。其它的文档也许会取代本文档。W3C负责维护本文档系列的最新状况。本文档由W3C的成员和一些对此感兴趣的团体审阅,并经主管认可而成为W3C推荐标准。 这是一个稳定的文档,可以作为参考材料或在其它文档中作为标准引用。W3C制定本推荐标准的目的就是使大家注意到本规范说明书,使之广泛传播,增强Web的功能和互用性。
  1. 什么是 XHTML?
  XHTML是一系列当前和将来的文档类型和程序块,它由HTML 4 [HTML]再生和扩展而来,HTML 4是其子集。XHTML系列文档基于XML,最终被设计用来与基于XML的用户代理程序一起工作。XHTML家族的详情及其发展过程在未来趋势一节中详述。
  XHTML 1.0(本规范书)是XHTML家族的第一个文档。它是将3种HTML 4文档类型应用到XML 1.0 [XML]之后重新形成的。其意图是,作为一种语言,它的内容既符合XML,并且如果依照一些简单的指导方针,也能被HTML4用户代理程序识别。开发者将它们的文档移植成为XHTML 1.0,会得到以下好处:
  XHTML文档遵从XML。这样,用标准的XML工具很容易查看,编辑和检验它们。
  XHTML文档可以在现有的HTML4代理用户程序中使用,也可以在新的XHTML用户代理程序中使用,在后者中可以达到与前者同样或更好的效果。
  XHTML 文档中使用的应用程序(如script 和 applet) 可以是HTML 的文档对象模型(Document Object Model) ,也可以是 XML 的文档对象模型 [DOM]。
  随着 XHTML 家族的发展,遵从XHTML 1.0的文档更有可能运用在各种XHTML环境中。
  XHTML家族是Internet发展的下一步。 将现在将文档移植成XML,开发者在确保他们的文档向前后兼容的同时,还能享有进入XML世界带来的好处。
  1.1 什么是HTML 4?
  HTML 4 [HTML] 是SGML (Standard Generalized Markup Language) 的一个应用,遵从国际标准ISO 8879,被广泛的当作 World Wide Web上的标准出版语言。
  SGML是一种描述标记语言,特别是那些用于电子文档交换,文档管理和文档发布语言的语言。HTML是SGML定义的语言的一个实例。
  SGML出现在80年代中期,一直保持得很稳定。稳定是原因是它有丰富的特征和具有灵活性。但是,灵活性的带来一定程度的复杂性,限制了它在多种环境下的适应性,包括World Wide Web。
  HTML最初的构想是作为一种交换科学和其它技术文档的一种语言,供那些不熟悉书写文档的专家使用。HTML规定一小套结构语义标签,适于书写相对简单的文档,从而解决了SGML复杂性的问题。除了简化了文档结构外,HTML还加入了对超文本的支持,以后还增加了媒体功能。
  在非常短的时间内,HTML变得广泛流行,并且很快超出了其原来的目的。HTML(标准)内部的新元素以很快的速度创造出来,HTML也被很快的改编以用于垂直的,高度专门化的市场。多余的新元素导致文档在跨平台时的兼容问题。
  随着软件和平台不一致性增加,很显然,“经典的”HTML 4在这些平台上使用的适用性就会受到一些限制。
  1.2 什么是 XML?
  XML[XML]是Extensible Markup Language的缩写,创造XML的目的是重新获得SGML的能力和灵活性,而去除其大部分复杂的东西。尽管是一个受限制SGML的形式,但是XML仍保留了SGML的大部分功能和丰富性,还保留了SGML的所有常用特性。
  在保留这些有用的特性的同时,XML去掉了SMGL中很多更复杂的特性,这些特性使得书写和设计合适的软件既困难又昂贵。
  1.3 为什么需要XHTML?
  上面已经提到了移植到XHTML的好处,一般来说,移植到XHTML的好处有:
  文档开发者和用户代理程序设计商常常用新方法,新标签来表达它们的想法。用XML导入新元素和新的元素属性相对来说更容易。XHTML家族被设计用来提供这些扩展,通过XHTML模块和开发新的遵从XHTML的模块的技术。(将在即将出台的XHTML模块化规范说明书中描述)。在开发文档和设计新用户代理程序时,这些模块将允许混合使用现有的和新的特性集。
  各种替代的访问Internet的方法不断的被提出。一些人估计,到2002年,internet上75%的文档会在这些替代的平台上被查看。XHTML 在设计时就考虑到用户代理程序的协同工作性。通过一个新的用户代理程序和文档协议机制,服务器、代理程序和用户代理程序将能够最佳地满足传输,最后,有可能开发出遵循XHTML的文档,能被任何遵循XHTML的用户代理程序使用。
  2. 定义
  2.1 术语
  本规范书要用到下面的词条。这些词条基于ISO/IEC 0 [POSIX.1]中类似的定义,并扩展定义在[RFC2119]中:
  执行定义(Implementation-defined)
  一个值或行为被执行定义时,它由执行来定义相应的需要以正确解释文档。
  可以(May)
  在执行时,词“可以”被解释为一个可选的特性,在本规范书中不是必须的,但是可以提供。对于文档一致性来说,词”可以”的意思是不能使用可选的特性. ”可选的”(optional)和”可以”的定义是相同的。
  必须(Must)
  在本规范书中,“必须”被解释为,在执行时或对于严格遵循XHTML的文档的强制需要。词条”应当”(shall)和”必须”的定义相同。.
  保留(Reserved)
  一个值或行为未被指定,但是不允许用于符合规范的文档,也不被符合规范的用户代理程序支持。
  应该(Should)
  在执行时,”应该”被解释为一个执行时的建议,但不是一个必须。对于文档来说,“应该”被解释为:编程练习时是推荐使用的,对于严格遵循XHTML的文档,则是必须的。
  被支持(Supported)
  本规范书中某些功能是可选的,如果一个功能被支持,它的行为被本规范书规定。
  未指定(Unspecified)
  一个值或行为未被指定时,规范书不定义一个功能的可移植性要求,即使文档中使用了这个功能。在这种情况下,一个需要指定的行为的文档,而不是在使用这个功能时允许任何行为,不是一个严格遵循XHTML的文档。
  2.2 常见词条
  属性(Attribute)
  属性是在DTD中声明过的某个元素的一个参数。属性的类型和取值范围,包括它可能的缺省值,在DTD中定义。
  一个 DTD,又称文档类型定义,是一个XML声明集合,在其中定义遵从DTD的文档中使用的合法的结构,元素和属性。
  文档(Document)
  文档是一个数据流,还包括它引用的其它数据流。文档的结构是用相关的DTD定义的元素组织起来来保存信息。更多信息,请参看 Document Conformance 。
  元素(Element)
  元素是在DTD中声明的文档的结构单位。元素的内容模型在DTD中定义,额外的语义可以在另外的元素描述中定义。
  功能(Facilities)
  功能包括元素,属性和与元素属性相关的语义。支持这些功能的执行说成提供了所需的功能。
  执行(Implementation)
  执行是指系统提供了功能和服务集以支持本规范书。更多信息,请参看User Agent Conformance。
  分析(Parsing)
  分析是扫描文档的动作,文档包含的信息被过滤成元素的上下文结构包含的信息。
  显示(Rendering)
  显示是文档信息被呈现的动作。显示以最适合环境的形式完成(如声觉,视觉,打印)。
  用户代理程序(User Agent)
  用户代理程序是执行程序,获取并处理XHTML文档。更多信息,请查看User Agent Conformance。
  验证(Validation)
  验证是用相关的DTD检验文档的过程,以确信结构,元素的使用,属性的使用和DTD中的定义一致。
  格式良好(Well-formed)
  一个格式良好的文档的结构依照XML1.0推荐标准[XML]中2.1节Section 2.1的规定。基本上,这个定义规定了元素必须有起始和结束标签,要正确的互相嵌套。
  3. XHTML 1.0的标准定义
  3.1 文档一致性
  本版本 XHTML 提供了严格的遵循XHTML文档的定义,受限于XHTML名址提供的标签和属性。使用XHTML其它名址空间的信息,如RDF表达的元数据,请参看Section 3.1.2 。
  3.1.1 严格遵循的文档。
  一个严格遵循XHTML的文档只需要本规范书描述的强制性功能,必须依照下列标准:
  它必须经过附录A Appendix A中的3中DTD之一的验证。
  文档的根元素必须是&html&。
  文档的根元素必须用xmlns属性[XMLNAMES]指定XHTML名址。XHTML的名址在中定义。
  在根元素之前,必须有一个DOCTYPE 声明。DOCTYPE声明中包含的公共标识符必须引用附录A Appendix A中的3中DTD的一种,每种DTD有各自的正式公共标识符。系统标识符可以改变以适应本地系统。
&!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd"&
&!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"DTD/xhtml1-transitional.dtd"&
&!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
"DTD/xhtml1-frameset.dtd"&
  下面是一个最小的XHTML文档示例:
&?xml version="1.0" encoding="UTF-8"?&&!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd"&&html xmlns="" xml:lang="en" lang="en"&
&title&Virtual Library&/title&
&p&Moved to &a href="&
&/body&&/html&
  注意在这个例子中含有XML声明。 XML声明并不是在所有的XML文档中都是必须的。XHTML被强烈建议使用XML声明。当字符编码不是缺省的UTF-8或UTF-6时,这样的声明是必须的。
  3.1.2 在XHTML中使用其它名址空间
  在XHTML名址空间中可以用[XMLNAMES]使用其它XML名址空间,尽管这样文档会不是严格遵循XHTML的文档。W3C将在以后致力为多名址空间指定一致性的问题。
  下面的例子说明XHTML1.0和MathML推荐标准联合使用的方法。
&html xmlns="" xml:lang="en" lang="en"&
&title&A Math Example&/title&
&p&The following is MathML markup:&/p&
&math xmlns=""&
&apply& &log/&
&cn& 3 &/cn&
&/logbase&
&ci& x &/ci&
&/body&&/html&
  下面的例子说明XHTML1.0和其它XML名址空间联合使用的方法:
&?xml version="1.0" encoding="UTF-8"?&&!-- initially,the default namespace is "books" --&&book xmlns='urn:loc.gov:books'
xmlns:isbn='urn:ISBN:0-395-36341-6' xml:lang="en" lang="en"&
&title&Cheaper by the Dozen&/title&
&isbn:number&&/isbn:number&
&!-- make HTML the default namespace for a hypertext commentary --&
&p xmlns='http://www.w3.org/1999/xhtml'&
This is also available &a href="&.
&/notes&&/book&
  3.2 用户代理程序一致性
  一个遵从的用户代理程序必须遵照下面所有标准:
  为和XML1.0推荐标准一致 [XML],用户代理程序必须分析和评估XHTML文档的编排良好性。如果用户代理程序宣称自己是一个带验证能力的用户代理,它还必须依照[XML]安文档引用的DTD来验证文档。
  当用户代理程序宣称支持本规范书定义的功能facilities时,它必须按功能的定义来支持。
  当用户代理程序按一般的XML来处理XHTML文档时,它应当只将ID类型的属性(如多数XHTML元素的ID属性)识别成片段标识符。
  如果用户代理程序遇到一个它不识别的元素,它必须显示元素的内容。
  如果用户代理程序遇到一个它不识别的属性,它必须忽略整个属性的定义(即属性及其值)。
  如果用户代理程序遇到一个它不识别的属性值,它必须使用使用属性的缺省值。
  如果它遇到一个实体引用(不是预定义了的实体),用户代理程序没有处理过其声明(如果声明是在用户代理程序没有读到的外部子集中就会发生),实体引用应该以字符显示(以&符号开始,以半冒号结束),以编排成实体引用。
  在显示内容时,用户代理程序如果遇到它不认识的字符或认识但不能显示字符实体引用,它应该以显眼的方式告诉用户发生了异常显示。
  下面的字符在 [XML]中被定义为 空白(whitespace)字符:
  空格 ( )   Tab (	)   回车 (
)   换行 (
)
  XML处理程序将不同系统的行结束码规格化为单个换行附传递给应用。因此XHTML还必须将下列字符看成空白字符:
  换页 ()   0宽度空格 (​)   对 'xml:space' 属性被设为”保留”的元素,用户代理程序必须保持所有空白字符的原样 (引导和结尾处空白字符除外,这些字符应该被删除). 否则,按下列规则处理空白字符:
  所有块元素周围的空白字符应该被删除。   注释全部去除,不影响空白符的处理。注释两旁的一个空白符被处理为两个空白符引导和结尾处空白字符应该被删除块元素内的换行字符必须转换成空格 ('xml:space' 属性被设为”保留”时例外)。
  一串连续的空白字符必须减少为单个空格 ('xml:space' 属性被设为”保留”时例外)。
  在显示时,用户代理程序应该以恰当的方式显示文档内容为文档内容书写的语言。在主要是拉丁书写体的语言中,ASCII空格典型的用来编码语法上的词的分界和印刷上的空白; 在和Nagari书写体相关的语言中 (如梵语,泰语等),语法上的边界可以用ZW空格字符编码,但是在显示输出时一般不用印刷上的空格表示; 用阿拉伯语形式书写体的语言,可以用空格字符编码印刷上的空白,单不能用ZW空格定界内部的文法分界(如,在英语看来是一个词的'kitAbuhum' = 'kitAbu-hum' = 'book them' == their book ,在阿拉伯语中编码为几个词); 中文书写体习惯则一般既不用这种方式编码分界也不使用印刷上的空白。
  属性的值中的空白符的处理方式按照[XML]。
  4. 与HTML 4的区别
  因为XHTML是XML的一个应用,一些在基于SGML的HTML 4中完全合法的习惯在XHTML中必须改变。
  4.1 文档必须是编排良好的
  编排良好性Well-formedness是[XML]引入的一个新概念。从本质上说,这意味着元素必须有结束标签,或者必须以特殊方式书写(在下面说明)。
  元素必须嵌套,尽管SGML规定层叠非法,但现有的浏览器普遍允许层叠。
  正确:嵌套元素。  &p&here is an emphasized &em&paragraph&/em&.&/p&
  不正确:层叠元素。  &p&here is an emphasized &em&paragraph.&/p&&/em&
  4.2 元素和属性名必须小写
  对所有HTML元素和属性名,XHTML 文档必须使用小写。 因为XML是大小写敏感的,所以这个差别是必须的。如 &li& 和 &LI& 是不同的标签。
  4.3 对非空元素,必须使用结束标签
  在基于 SGML的 HTML 4 中,一些隐含结束意义的元素允许忽略结束标签。而在基于XML的XHTML中,这种忽略不被允许。除了在DTD中被声明为空的元素,所有元素必须有结束标签。
正确:结束了的元素。&p&here is a paragraph.&/p&&p&here is another paragraph.&/p&
不正确:未结束元素。&p&here is a paragraph.&p&here is another paragraph.
  4.4 属性值必须在引号中
  所有的属性必须用引号,即使是数字。
正确:在引号中的属性值&table rows="3"&
不正确:不在引号中的属性值。&table rows=3&
  4.5 属性最小化
  XML 不支持属性最小化. 属性值对必须写全。象compact,checked这样的属性名不能不指定属性值而在元素中出现。
正确:没有最小化的属性&dl compact="compact"&
不正确:最小化属性&dl compact&
  4.6 空元素
  空元素要么必须有结束标签,要么起始标签以/&结束. 例如,&br/&或&hr&&/hr&. 请参看HTML兼容性指导 HTML Compatibility Guidelines 中的信息,以保证向后兼容HTML 4用户代理程序
正确:结束的空元素&br/&&hr/&
错误:未结束的空标签&br&&hr&
  4.7 属性值中的空白字符处理
  对属性值,用户代理程序将删去引导和后序空白符,将一个或多个空白符(包括换行)转换成单个字符间空间(在西方书写体中是一个ASCII空格) See Section 3.3.3 of [XML]。
  4.8 Script and Style 元素
  在XHTML中,script和style元素声明为#PCDATA内容形式,因此,& 和 & 被看作是标识的开始,&lt和&amp 这样的实体被XML处理程序看作为实体引用而分别被认为是& 和 & . 将script和style元素的内容包裹在CDATA记号部分中避免了这些实体的扩张。
&script& &![CDATA[ ... unescaped script content ... ]]& &/script&
  CDATA 部分被 XML 处理程序识别,是文档对象模型中一个结点。请参看1.3节Section 1.3的DOM LEVEL 1推荐标准[DOM]。
  替代的方式是使用外部script和style文档。
  4.9 SGML 禁止
  SGML 给作者的DTD可以指定在一个元素内部禁止出现的元素。这样的禁止在XML中是不可能的。
  例如,严格的 HTML 4 DTD 禁止任何深度的’a’元素对另一’a’元素的嵌套。在XML中无法写出这样的禁止。尽管这些禁止不能在DTD中定义,一些元素不应该被嵌套。在标准化的附录B Appendix B中是这些元素的汇总。
  4.10 具有 'id' 和 'name' 属性的元素
  HTML 4 定义了name属性的元素有 a,applet,form,frame,iframe,img,and map. HTML 4还引入了 id 属性. 这两个属性都是被设计作为片段标识符。
  在XML中,片段标识符是ID类型,每个元素只能有一个ID类型的属性。因此,在XHTML1.0中,id属性被定义为ID类型。为保证XHTML1.0文档是结构良好的XML文档,在定义一个片段标识符时,XHTML文档必须使用id属性,即使是对那些以前用name属性的元素。请参看 HTML Compatibility Guidelines 的信息,确保XHTML文档以text/html媒体类型使用时,这些”锚”能向后兼容。
  注意,在XHTML 1.0中,name 属性不被正式支持,在以后的XHTML版本中将被删除。
  5. 兼容性问题
  尽管XHTML不必和已有的用户代理程序兼容,在操作上它很容易实现。创建兼容文档的指导方针在Appendix C中。
  5.1 Internet 媒体类型
  在本推荐标准发布时,基于XML的应用的通用MIME标签问题还未被解决。
  虽然如此,依照Appendix C中指导方针的XHTML文档可以标为"text/html"媒体类型,因为这被大多数浏览器兼容。本文档对XHTML文档的其它MIME标签不做推荐。
  6. 未来趋势
  XHTML 1.0 提供了一类文档类型的基础,此类文档将扩展xhtml和包含XHTML子集。为了广泛的支持新设备和新应用,定义模块和指定联合这些模块的机制。 这个机制将用统一的方式定义新模块,以扩展和子集XHTML。
  6.1 模块化 HTML
  因为XHTML的应用从传统的桌面用户代理程序转移到其它平台,显然,在所有的平台上不一定要用到所有的XHTML元素。 例如,手上设备或蜂窝电话可以只支持XHTML元素的一个子集。
  模块化的过程将XHTML分为一系列小的元素集。在不同的情况需要时,它们又可以重新联合起来。
  这些模块将在以后的W3c文档中定义。
  6.2 子集和可扩展性
  模块化带来几个好处:
  提供了子集化XHTML的正式机制。   提供了扩展XHTML的正式机制。   简化了文档类型间的转化。   促进在新文档类型中的模块重用。
  6.3 文档 协议
  文档 协议指明了一组文档的句法和语义。遵循文档协议提供了保证文档互用性的基础。文档协议指定处理此类文档所需的功能,如,可以使用哪种图像文件类型,脚本的级别,样式表的支持情况,等等。
  对于产品设计者,这可以使不同的团体定义他们自己的标准协议。
  对于作者. 这可以使他们避免为不同的客户写不同的文档版本。
  对于专业群体,如化学家,医生或数学家,这可以允许用标准的HTML元素加上一组适合专家需要的元素来建立一个特殊的协议。
  附录A. DTDs
  本附录是标准化的.
  这些 DTD 和实体构成了本规范书的一个标准化的部分。本规范书完全的 DTD 文件集以及XML声明和SGML开放目录在一个zip file文件中。
  A.1 文档类型定义(Document Type Definitions)
  这些 DTD 类似 HTML 4 的DTD. 当DTD模块化之后,构件DTD使用的方法也许更能和HTML 4相对应。
  XHTML-1.0-Strict   XHTML-1.0-Transitional   XHTML-1.0-Frameset
  A.2 实体集
  XHTML的实体集和HTML 4的相同,但是被修饰成有效的XML 1.0实体声明。注意欧洲货币符号的实体 (& or € 或 €) 是在特殊符号部分定义。
  Latin-1 characters   Special characters   Symbols
  附录 B. 禁止元素
  This appendix is normative.
  下面的元素在包含其它元素时有禁止(参看 Section 4.9)。 这些禁止应用于所有深度的嵌套,即,保括子元素。
  不能包含其它 a 元素。
  不能包含 img,object,big,small,sub,或 sup 元素。
  button
  不能包含 input,select,textarea,label,button,form,fieldset,iframe 或 isindex 元素。
  不能包含其它label 元素。
  不能包含其它 form 元素。
  附录 C. HTML兼容性指导
  This appendix is informative.
  本附录总结设计时的方针,指导作者书写可在现有HTML用户代理程序中显示的XHTML文档。
  C.1 处理说明
  一些用户代理程序会显示处理说明。但是,注意当文档中没有XML声明时,文档只能用缺省的字符编码UTF-8 或 UTF-16。
  C.2 空元素
  在空元素结束符 / 和 & 前加一个空格,如 &br /&,&hr /& 和 &img src="http://blog.netbei.com/karen.jpg" alt="Karen" /&. 还有,使用最小化的标签语法,如&br /&,因为另一种XML允许的语法 &br&&/br& 在很多现有用户代理程序会导致不可靠的结果。
  C.3 元素最小化和空元素内容
  内容模型不是空的元素,在为空的场合(如空title或空段落),不要用最小化形式(如 用 &p& &/p&,不用 &p /&).
  C.4 嵌入的样式表和Script
  如果你的样式表使用 & 或 & 或 ]]& 或 --,用外部样式表。如果你的script用 & 或 & 或 ]]& 或 --,用外部script。 注意XML分析程序会在不告知的情况下除去注释的内容。因此,以前用注释的方法”隐藏”script和样式表的习惯使文档可以向后兼容,但是可能在基于XML的执行时不能按预期工作。
  C.5 在属性值内部分行
  在属性值中避免使用分行和多个空格符。用户代理程序处理这些情况时不一致。
  C.6 Isindex
  在文档的head部分不要使用超过一个 isindex 元素. isindex 元素不被赞成使用,赞成使用input元素。
  C.7 lang 和 xml:lang 属性
  在指定元素的语言时同时使用 lang 和 xml:lang 属性。xml:lang 属性在前。
  C.8 片段标识符
  在 XML中,以"#foo"形式结束片段标识符URI [RFC2396] 不是指元素有一个属性name="foo",而是指元素有一个被定义为ID类型的属性,如,HTML 4中的id属性。很多HTML客户程序不以这种方式支持ID类型属性,所以,可以将相同的值同时附给这两个属性,以保证最大程度的向后和向前兼容。(如 &a id="foo" name="foo"&...&/a&).
  此外,因为ID类型属性的合法值集比CDATA类型属性的值集小得多,name属性被改为NMTOKEN。这个属性被限制为只有和ID类型或XML1.0 2.5节中的Name产品同样的值。不幸的是,XHTML的DTD不能表示出这个限制。因为这个改变,在转换现有的HTML文档时要加以注意。 如果在转换时值可能会改变,这些属性的值在文档中必须是唯一的,有效的,任何对这些片段标识符的引用(不管是内部还是外部)必须更新。
  最后,注意不赞成在 a,applet,form,frame,iframe,img,和 map 元素中使用name属性,在以后的XHTML版本中,它将被去除。
  C.9 字符编码
  要指定文档中的字符编码,同时在xml声明中使用编码属性指定 (如. &?xml version="1.0" encoding="EUC-JP"?&) 和在meta中用 http-equiv 语句 (如 &meta http-equiv="Content-type" content='text/ charset="EUC-JP"' /&).xml处理指令的编码属性值在前。
  C.10 布尔属性
  一些HTML用户代理程序在布尔属性以完全(非最小化)形式出现时不能解释它们,而这是XML1.0必须的。注意这个问题不会影响用户代理程序对HTML 4的兼容。包括以下一些属性: compact,nowrap,ismap,declare,noshade,checked,disabled,readonly,multiple,selected,noresize,defer.
  C.11 文档对象模型和 XHTML
  文档对象模型 level 1 推荐标准 [DOM] 定义XML和HTML 4的文档对象模型。 HTML 4 文档对象模型规定HTML元素名和属性名以大写形式返回。XML文档对象模型规定元素名和属性名以它们被指定的形式返回。在 XHTML 1.0中,元素和属性指定为小写形式。对这个显著的差别可以用两种方式处理:
  通过DOM访问text/html internet媒体类型XHTML文档的应用程序可以使用HTML DOM,还可以依赖这些界面返回的大写的元素名和属性名。
  通过DOM访问text/xml或application/xml internet媒体类型XHTML文档的应用程序也可以使用XML DOM. 元素名和属性名将以小写形式返回。 并且,一些 XHTML 元素可以也可以不出现在对象树中,因为在内容模型中它们是可选的(如table中的 tbody 元素). 在HTML 4中,一些元素可以允许被最小化以至于它们的开始标签和结束标签都被忽略(SGML特性),所以可以发

我要回帖

更多关于 oracle数据库连接报错 的文章

 

随机推荐