posts - 24,comments - 3,trackbacks - 0

下面都是我收集的一些比较常用的正则表达式,因为平常可能在表单验证的时候,用到的比较多。特发出来,让各位朋友共同使用。呵呵。

匹配中文字符的正则表达式: [u4e00-u9fa5]同济网 Tongji.Net�wNnfV)O0z.a
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

匹配双字节字符(包括汉字在内):[^x00-xff]同济网 Tongji.NetpEk"}$e6u1`
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

匹配空白行的正则表达式:ns*r同济网 Tongji.Net�m3]*\+s \:DW�qO
评注:可以用来删除空白行

匹配HTML标记的正则表达式:< (S*?)[^>]*>.*?|< .*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:^s*|s*$
z c!j3} L8H;L:q$~yl0 评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式


匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
评注:表单验证时很实用

匹配网址URL的正则表达式:[a-zA-z]+://[^s]*同济网 Tongji.Net2XI2l4CV@'WS
评注:网上流传的版本功能很有限,上面这个基本可以满足需求

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用

匹配国内电话号码:d{3}-d{8}|d{4}-d{7}
评注:匹配形式如 0511-4405222 或 021-87888822

匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始

匹配中国邮政编码:[1-9]d{5}(?!d)
评注:中国邮政编码为6位数字

匹配身份证:d{15}|d{18}同济网 Tongji.Net7GdVR!k+v'S
评注:中国的身份证为15位或18位

匹配ip地址:d+.d+.d+.d+同济网 Tongji.Nets9w7{~ TM
评注:提取ip地址时有用

匹配特定数字:
^[1-9]d*$    //匹配正整数
^-[1-9]d*$   //匹配负整数
^-?[1-9]d*$   //匹配整数
^[1-9]d*|0$  //匹配非负整数(正整数 + 0)同济网 Tongji.Net$T*Ps7e d&u
^-[1-9]d*|0$   //匹配非正整数(负整数 + 0)同济网 Tongji.Net@sB] P8s5z�aq+{:F
^[1-9]d*.d*|0.d*[1-9]d*$   //匹配正浮点数同济网 Tongji.Net+G#AC3?\/n5v%h4w C
^-([1-9]d*.d*|0.d*[1-9]d*)$  //匹配负浮点数
^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$  //匹配浮点数
^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$  //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正

匹配特定字符串:
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串同济网 Tongji.Net5mw-Q8_w%P
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
` \%r2Fj y]s0 ^[a-z]+$  //匹配由26个英文字母的小写组成的字符串同济网 Tongji.NetUh6p2]0Y
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串同济网 Tongji.Net+iT&l1@owd
^w+$  //匹配由数字、26个英文字母或者下划线组成的字符串

在使用RegularExpressionValidator验证控件时的验证功能及其验证表达式介绍如下:

只能输入数字:“^[0-9]*$”
只能输入n位的数字:“^d{n}$”同济网 Tongji.Net ~WVM0w&ae
只能输入至少n位数字:“^d{n,}$”
只能输入m-n位的数字:“^d{m,n}$”
只能输入零和非零开头的数字:“^(0|[1-9][0-9]*)$”同济网 Tongji.Netht1J2LS ~]
只能输入有两位小数的正实数:“^[0-9]+(.[0-9]{2})?$”
j |[ KK?4{4_0 只能输入有1-3位小数的正实数:“^[0-9]+(.[0-9]{1,3})?$”同济网 Tongji.Net%\%D TKe
只能输入非零的正整数:“^+?[1-9][0-9]*$”
只能输入非零的负整数:“^-[1-9][0-9]*$”同济网 Tongji.Net [.fK#dWU P(s$~ {
只能输入长度为3的字符:“^.{3}$”
5s k ]@ ^ zQ0 只能输入由26个英文字母组成的字符串:“^[A-Za-z]+$”
只能输入由26个大写英文字母组成的字符串:“^[A-Z]+$”
只能输入由26个小写英文字母组成的字符串:“^[a-z]+$”
只能输入由数字和26个英文字母组成的字符串:“^[A-Za-z0-9]+$”同济网 Tongji.Netx~Y8o}
只能输入由数字、26个英文字母或者下划线组成的字符串:“^w+$”同济网 Tongji.NetXwN5["^+q
验证用户密码:“^[a-zA-Z]w{5,17}$”正确格式为:以字母开头,长度在6-18之间,

只能包含字符、数字和下划线。
[ b~u9@O0 验证是否含有^%&’,;=?$”等字符:“[^%&',;=?$x22]+”
只能输入汉字:“^[u4e00-u9fa5],{0,}$”
验证Email地址:“^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$”
验证InternetURL:“^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$”
验证电话号码:“^((d{3,4})|d{3,4}-)?d{7,8}$”

正确格式为:“XXXX-XXXXXXX”,“XXXX-XXXXXXXX”,“XXX-XXXXXXX”,

“XXX-XXXXXXXX”,“XXXXXXX”,“XXXXXXXX”。同济网 Tongji.Net q&Nb&s}#D!{]
验证身份证号(15位或18位数字):“^d{15}|d{}18$”同济网 Tongji.Net8o5O9~!c2CLvo
验证一年的12个月:“^(0?[1-9]|1[0-2])$”正确格式为:“01”-“09”和“1”“12”
验证一个月的31天:“^((0?[1-9])|((1|2)[0-9])|30|31)$”

正确格式为:“01”“09”和“1”“31”。

匹配中文字符的正则表达式: [u4e00-u9fa5]同济网 Tongji.Net7K#s b\6y"L
匹配双字节字符(包括汉字在内):[^x00-xff]
匹配空行的正则表达式:n[s| ]*r
TV]$?? G&cm^F0 匹配HTML标记的正则表达式:/< (.*)>.*|< (.*) />/
匹配首尾空格的正则表达式:(^s*)|(s*$)同济网 Tongji.Net t$p%G"v(o y1g AW
匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
匹配网址URL的正则表达式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?

(1)应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
g9Td@n @2p0 String.prototype.len=function(){return this.replace([^x00-xff]/g,”aa”).length;}

(2)应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现
String.prototype.trim = function()同济网 Tongji.Net7@0Z9F-tRU
{
return this.replace(/(^s*)|(s*$)/g, “”);
ZJ%X W} OT6l0 }
(3)应用:利用正则表达式分解和转换IP地址
function IP2V(ip) //IP地址转换成对应数值同济网 Tongji.Net*X'gt\Gq/v!a
{同济网 Tongji.Net\`9z&C J/f R
re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正则表达式
if(re.test(ip))
{
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
{
throw new Error(”Not a valid IP address!”)
}
}
(4)应用:从URL地址中提取文件名的javascript程序同济网 Tongji.Net*L W3wlFb9NE
s=”http://www.9499.net/page1.htm”;同济网 Tongji.Net!Gb CY,zh Z
s=s.replace(/(.*/){0,}([^.]+).*/ig,”$2″) ; //Page1.htm同济网 Tongji.Nett0K.p `V#@%e:n T
(5)应用:利用正则表达式限制网页表单里的文本框输入内容
用正则表达式限制只能输入中文:onkeyup=”value=”/blog/value.replace(/["^u4E00-u9FA5]/g,”) ” nbeforepaste=”clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^u4E00-u9FA5]/g,”))”
用正则表达式限制只能输入全角字符: nkeyup=”value=”/blog/value.replace(/["^uFF00-uFFFF]/g,”) ” nbeforepaste=”clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^uFF00-uFFFF]/g,”))”
用正则表达式限制只能输入数字:onkeyup=”value=”/blog/value.replace(/["^d]/g,”) “onbeforepaste= “clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^d]/g,”))”
posted @ 2010-06-30 11:10 Genchill 阅读(31) 评论(0) 编辑
另一个走向极端的错误
满怀信心的新手们可能为自己所掌握的部分知识陶醉不已,刚接触数据库库事 务处理的准开 发者们也一样,踌躇满志地准备将事务机制应用到他的数据处理程序的每一个模块每一条语句中去。的确,事务机制看起来是如此的诱人——简洁、美妙而又实用, 我当然想用它来避免一切可能出现的错误——我甚至想用事务把我的数据操作从头到尾包裹起来。
看着吧,下面我要从创建一个数据库开始:
using System;
using System.Data;
using System.Data.SqlClient;
namespace Aspcn
{
  public class DbTran
  {
file://执行事务处理
public void DoTran()
{
  file://建立连接并打开
  SqlConnection myConn=GetConn();
  myConn.Open();
  SqlCommand myComm=new SqlCommand();
  SqlTransaction myTran;
  myTran=myConn.BeginTransaction();
  file://下面绑定连接和事务对象
  myComm.Connection=myConn;
  myComm.Transaction=myTran;
  file://试图创建数据库TestDB
  myComm.CommandText="CREATE database TestDB";
  myComm.ExecuteNonQuery();
  file://提交事务
  myTran.Commit();
}
file:// 获取数据连接
private SqlConnection GetConn()
{
  string strSql="Data Source=localhost;Integrated Security=SSPI;user id=sa;password=";
  SqlConnection myConn=new SqlConnection(strSql);
  return myConn;
}
  }
  public class Test
  {
public static void Main()
{
  DbTran tranTest=new DbTran();
  tranTest.DoTran();
  Console.WriteLine("事务处理已经成功完成。");
  Console.ReadLine();
}
  }
}
   //---------------

未处理的异常: System.Data.SqlClient.SqlException: 在多语句事务内不允许使用 CREATE DATABASE 语句。

at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at Aspcn.DbTran.DoTran()
at Aspcn.Test.Main()

注 意,如下的SQL语句不允许出现在事务中:

ALTER DATABASE修改数据库
BACKUP LOG备份日志
CREATE DATABASE创建数据库
DISK INIT创建数据库或事务日志设备
DROP DATABASE删除数据库
DUMP TRANSACTION转储事务日志
LOAD DATABASE装载数据库备份复本
LOAD TRANSACTION装载事务日志备份复本
RECONFIGURE更新使用 sp_configure 系统存储过程更改的配置选项的当前配置(sp_configure 结果集中的 config_value 列)值。
RESTORE DATABASE还原使用BACKUP命令所作的数据库备份
RESTORE LOG还原使用BACKUP命令所作的日志备份
UPDATE STATISTICS在指定的表或索引视图中,对一个或多个统计组 (集合)有关键值分发的信息进行更新

除了这些语句以外,你可以在你的数据库事务中使用任何合 法的SQL语句。

事务回滚

事务的四个特性之一是原子性,其含义是指对于特定操作序列组成的事务,要么全部完 成,要么就一件也不做。如果在事务处理的过程中,发生未知的不可预料的错误,如何保证事务的原子性呢?当事务中止时,必须执行回滚操作,以便消除已经执行 的操作对数据库的影响。
一般的情况下,在异常处理中使用回滚动作是比较好的想法。前面,我们已经得到了一个更新数据库的程序,并且验证了它的正确 性,稍微修改一下,可以得到:

//RollBack.cs
using System;
using System.Data;
using System.Data.SqlClient;
namespace Aspcn
{
  public class DbTran
  {
file://执行事务处理
public void DoTran()
{
  file://建立连接并打开
  SqlConnection myConn=GetConn();
  myConn.Open();
  SqlCommand myComm=new SqlCommand();
  SqlTransaction myTran;
  file://创建一个事务
  myTran=myConn.BeginTransaction();
  file://从此开始,基于该连接的数据操作都被认为是事务的一部分
  file://下面绑定连接和事务对象
  myComm.Connection=myConn;
  myComm.Transaction=myTran;
  try
  {
file:// 定位到pubs数据库
myComm.CommandText="USE pubs";
myComm.ExecuteNonQuery();
myComm.CommandText="UPDATE roysched SET royalty = royalty * 1.10 WHERE title_id LIKE 'Pc%'";
myComm.ExecuteNonQuery();
file:// 下面使用创建数据库的语句制造一个错误
myComm.CommandText="Create database testdb";
myComm.ExecuteNonQuery();
myComm.CommandText="UPDATE roysched SET royalty = royalty * 1.20 WHERE title_id LIKE 'Ps%'";
myComm.ExecuteNonQuery();
file:// 提交事务
myTran.Commit();
  }
  catch(Exception err)
  {
myTran.Rollback();
Console.Write(" 事务操作出错,已回滚。系统信息:"+err.Message);
  }
}
file://获取数据连接
private SqlConnection GetConn()
{
  string strSql="Data Source=localhost;Integrated Security=SSPI;user id=sa;password=";
  SqlConnection myConn=new SqlConnection(strSql);
  return myConn;
}
  }
  public class Test
  {
public static void Main()
{
  DbTran tranTest=new DbTran();
  tranTest.DoTran();
  Console.WriteLine("事务处理已经成功完成。");
  Console.ReadLine();
}
  }
}

首 先,我们在中间人为地制造了一个错误——使用前面讲过的Create database语句。然后,在异常处理的catch块中有如下语句:
myTran.Rollback();
当 异常发生时,程序执行流跳转到catch块中,首先执行的就是这条语句,它将当前事务回滚。在这段程序可以看出,在Create database之前,已经有了一个更新数据库的操作——将pubs数据库的roysched表中的所有title_id字段以“PC”开头的书籍的 royalty字段的值都增加0.1倍。但是,由于异常发生而导致的回滚使得对于数据库来说什么都没有发生。由此可见,Rollback()方法维护了数 据库的一致性及事务的原子性。

posted @ 2010-06-25 09:57 Genchill 阅读(27) 评论(0) 编辑
使用存储点
事务只是一种最坏情况下的保障措施,事实上,平时系统的运行可靠性都是相当高的,错误很少发生,因 此,在每次事务执行之前都检查其有效性显得代价太高——绝大多数的情况下这种耗时的检查是不必要的。我们不得不想另外一种办法来提高效率。
事 务存储点提供了一种机制,用于回滚部分事务。因此,我们可以不必在更新之前检查更新的有效性,而是预设一个存储点,在更新之后,如果没有出现错误,就继续 执行,否则回滚到更新之前的存储点。存储点的作用就在于此。要注意的是,更新和回滚代价很大,只有在遇到错误的可能性很小,而且预先检查更新的有效性的代 价相对很高的情况下,使用存储点才会非常有效。
使用.net框架编程时,你可以非常简单地定义事务存储点和回滚到特定的存储点。下面的语句定义了 一个存储点“NoUpdate”:
myTran.Save("NoUpdate");
当你在程序中创建同名的存储点时,新创建的存储点将 替代原有的存储点。
在回滚事务时,只需使用Rollback()方法的一个重载函数即可:
myTran.Rollback("NoUpdate");
下 面这段程序说明了回滚到存储点的方法和时机:
using System;
using System.Data;
using System.Data.SqlClient;
namespace Aspcn
{
  public class DbTran
  { 
file://执行事务处理
public void DoTran()
{
  file://建立连接并打开
  SqlConnection myConn=GetConn();
  myConn.Open();
  SqlCommand myComm=new SqlCommand();
  SqlTransaction myTran;
  file://创建一个事务
  myTran=myConn.BeginTransaction();
  file://从此开始,基于该连接的数据操作都被认为是事务的一部分
  file://下面绑定连接和事务对象
  myComm.Connection=myConn;
  myComm.Transaction=myTran;
  try
  {
myComm.CommandText="use pubs";
myComm.ExecuteNonQuery();
myTran.Save("NoUpdate");
myComm.CommandText="UPDATE roysched SET royalty = royalty * 1.10 WHERE title_id LIKE 'Pc%'";
myComm.ExecuteNonQuery();
file:// 提交事务
myTran.Commit();
  }
  catch(Exception err)
  {
file:// 更新错误,回滚到指定存储点
myTran.Rollback("NoUpdate");
throw new ApplicationException("事务操作出错,系统信息:"+err.Message);
  }
}
file:// 获取数据连接
private SqlConnection GetConn()
{
  string strSql="Data Source=localhost;Integrated Security=SSPI;user id=sa;password=";
  SqlConnection myConn=new SqlConnection(strSql);
  return myConn;
}
  }
  public class Test
  {
public static void Main()
{
  DbTran tranTest=new DbTran();
  tranTest.DoTran();
  Console.WriteLine("事务处理已经成功完成。");
  Console.ReadLine();
}
  }
}
很 明显,在这个程序中,更新无效的几率是非常小的,而且在更新前验证其有效性的代价相当高,因此我们无须在更新之前验证其有效性,而是结合事务的存储点机 制,提供了数据完整性的保证。

隔离级别的概念
企业级的数据库每一秒钟都可能应付成千上万的并发访问,因而带来了并发 控制的问题。由数据库理论可知,由于并发访问,在不可预料的时刻可能引发如下几个可以预料的问题:
脏读:包含未提交数据的读取。例 如,事务1 更改了某行。事务2 在事务1 提交更改之前读取已更改的行。如果事务1 回滚更改,则事务2 便读取了逻辑上从未存在过的行。
不 可重复读取:当某个事务不止一次读取同一行,并且一个单独的事务在两次(或多次)读取之间修改该行时,因为在同一个事务内的多次读取之间修改了该 行,所以每次读取都生成不同值,从而引发不一致问题。
幻象:通过一个任务,在以前由另一个尚未提交其事务的任务读取的行的范围中插 入新行或删除现有行。带有未提交事务的任务由于该范围中行数的更改而无法重复其原始读取。
如 你所想,这些情况发生的根本原因都是因为在并发访问的时候,没有一个机制避免交叉存取所造成的。而隔离级别的设置,正是为了避免这些情况的发生。事务准备 接受不一致数据的级别称为隔离级别。隔离级别是一个事务必须与其它事务进行隔离的程度。较低的隔离级别可以增加并发,但代价是降低数据的正确性。相反,较 高的隔离级别可以确保数据的正确性,但可能对并发产生负面影响。
根据隔离级别的不同,DBMS为并行访问提供不同的互斥保证。在SQL Server数 据库中,提供四种隔离级别:未提交读、提交读、可重复读、可串行读。这四种隔离级别可以不同程度地保证并发的数据完整性:

隔离级别脏 读不可重复读取幻 像
未提交读
提 交读
可重复读
可 串行读

可以看出,“可串行 读”提供了最高级别的隔离,这时并发事务的执行结果将与串行执行的完全一致。如前所述,最高级别的隔离也就意味着最低程度的并 发,因此,在此隔离级别下,数据库的服务效率事实上是比较低的。尽管可串行性对于事务确保数据库中的数据在所有时间内的正确性相当重要,然而许多事务并不 总是要求完全的隔离。例如,多个作者工作于同一本书的不同章节。新章节可以在任意时候提交到项目中。但是,对于已经编辑过的章节,没有编辑人员的批准,作 者不能对此章节进行任何更改。这样,尽管有未编辑的新章节,但编辑人员仍可以确保在任意时间该书籍项目的正确性。编辑人员可以查看以前编辑的章节以及最近 提交的章节。这样,其它的几种隔离级别也有其存在的意义。
在.net框架中,事务的隔离级别是由枚举 System.Data.IsolationLevel所定义的: 

[Flags]
[Serializable]
public enum IsolationLevel

其成员及相应的含义如下:

成 员含 义
Chaos无 法改写隔离级别更高的事务中的挂起的更改。
ReadCommitted在正在读取数据时保持共享 锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复的读取或幻像数据。
ReadUncommitted可 以进行脏读,意思是说,不发布共享锁,也不接受独占锁。
RepeatableRead在查询中使 用的所有数据上放置锁,以防止其他用户更新这些数据。防止不可重复的读取,但是仍可以有幻像行。
Serializable在 DataSet上放置范围锁,以防止在事务完成之前由其他用户更新行或向数据集中插入行。
Unspecified正 在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。
显而意见,数据库的四个隔离级 别在这里都有映射。
默认的情况下,SQL Server使用ReadCommitted(提交读)隔离级别。
关于隔离级别的最后一点就是 如果你在事务执行的过程中改变了隔离级别,那么后面的命名都在最新的隔离级别下执行——隔离级别的改变是立即生效的。有了这一点,你可以在你的事务中更灵 活地使用隔离级别从而达到更高的效率和并发安全性。
posted @ 2010-06-25 09:57 Genchill 阅读(16) 评论(0) 编辑
基于以上认识,下面我们就开始动手写我们的第一个事务处理程序。我们可以很熟练地写出下面这一段程序:
//DoTran.csusing System;
using System.Data;
using System.Data.SqlClient;
namespace Aspcn
{
  public class DbTran
  {
file://执行事务处理
public void DoTran()
{
  file://建立连接并打开
  SqlConnection myConn=GetConn();
  myConn.Open();
  SqlCommand myComm=new SqlCommand();
  SqlTransaction myTran=new SqlTransaction();
  try
  {
  myComm.Connection=myConn;
  myComm.Transaction=myTran;
file:// 定位到pubs数据库 
myComm.CommandText="USE pubs";
myComm.ExecuteNonQuery();
file:// 更新数据
file://将所有的计算机类图书
myComm.CommandText="UPDATE roysched SET royalty = royalty * 1.10 WHERE title_id LIKE 'Pc%'";
myComm.ExecuteNonQuery();// 提交事务
myTran.Commit();
  }
  catch(Exception err)
  {
throw new ApplicationException("事务操作出错,系统信息:"+err.Message);
  }
  finally
  {
myConn.Close();
  }
}
file://获取数据连接
private SqlConnection GetConn()
{
  string strSql="Data Source=localhost;Integrated Security=SSPI;user id=sa;password=";
  SqlConnection myConn=new SqlConnection(strSql);
  return myConn;
}
  }
  public class Test{public static void Main()
  {
DbTran tranTest=new DbTran();
tranTest.DoTran();
Console.WriteLine("事务处理已 经成功完成。");
Console.ReadLine();
  }
}
}

显 然,这个程序非常简单,我们非常自信地编译它,但是,出乎意料的结果使我们的成就感顿时烟消云散:
   error CS1501: 重载"SqlTransaction"方法未获取"0"参数
是什么原因呢?注意到我们初始化的代码:
SqlTransaction myTran=new SqlTransaction();

显 然,问题出在这里,事实上,SqlTransaction类并没有公共的构造函数,我们不能这样新建一个SqlTrancaction类型的变量。在事务 处理之前确实需要有一个SqlTransaction类型的变量,将该变量关联到SqlCommand类的Transcation属性也是必要的,但是初 始化方法却比较特别一点。在初始化SqlTransaction类时,你需要使用SqlConnection类的BeginTranscation()方 法:
SqlTransaction myTran; myTran=myConn.BeginTransaction();

该方法返回一个 SqlTransaction类型的变量。在调用BeginTransaction()方法以后,所有基于该数据连接对象的SQL语句执行动作都将被认为是事务MyTran的一部分。同 时,你也可以在该方法的参数中指定事务隔离级别和事务名称,如:
SqlTransaction myTran;
myTran=myConn.BeginTransaction(IsolationLevel.ReadCommitted,"SampleTransaction");

关 于隔离级别的概念我们将在随后的内容中探讨,在这里我们只需牢记一个事务是如何被启动,并且关联到特定的数据链接的。
先不要急着去搞懂我们的事务 都干了些什么,看到这一行:
myTran.Commit();

是 的,这就是事务的提交方式。该语句执行后,事务的所有数据库操作将生效,并且为数据库事务的持久性机制所保持--即 使系统在这以后发生致命错误,该事务对数据库的影响也不会消失。
对上面的程序做了修改之后我们可以得到如下代码(为了节约篇幅,重复之处已省略, 请参照前文):
//DoTran.cs……}
file://执行事务处理
public void DoTran()
{
  file://建立连接并打开
  SqlConnection myConn=GetConn();
  myConn.Open();
  SqlCommand myComm=new SqlCommand();
  file://SqlTransaction myTran=new SqlTransaction();
  file://注意,SqlTransaction类无公开的构造函数
  SqlTransaction myTran;
  file://创建一个事务
  myTran=myConn.BeginTransaction();
  try
  {
file://从此开始,基于该连接的数 据操作都被认为是事务的一部分
file://下面绑定连接和事务对象
myComm.Connection=myConn;
myComm.Transaction=myTran; file://定位到pubs数据库
myComm.CommandText="USE pubs";
myComm.ExecuteNonQuery();// 更新数据
file://将所有的计算机类图书
myComm.CommandText="UPDATE roysched SET royalty = royalty * 1.10 WHERE title_id LIKE 'Pc%'";
myComm.ExecuteNonQuery();
file:// 提交事务
myTran.Commit();
  }
  catch(Exception err)
  {
throw new ApplicationException("事务操作出错,系统信息:"+err.Message);
  }
  finally
  {
myConn.Close();
  }
}
……
posted @ 2010-06-25 09:47 Genchill 阅读(27) 评论(0) 编辑

数据库事务
数 据库事务是指作为单个逻辑工作单元执行的一系列操作。
设想网上购物的一次交易,其付款过程至少包括以下几步数据库操作:
· 更新客户所购商品的库存信息
· 保存客户付款信息--可能包括与银行系统的交互
· 生成订单并且保存到数据库中
· 更新用户相关信息,例如购物数量等等
正 常的情况下,这些操作将顺利进行,最终交易成功,与交易相关的所有数据库信息也成功地更新。但是,如果在这一系列过程中任何一个环节出了差错,例如在更新 商品库存信息时发生异常、该顾客银行帐户存款不足等,都将导致交易失败。一旦交易失败,数据库中所有信息都必须保持交易前的状态不变,比如最后一步更新用 户信息时失败而导致交易失败,那么必须保证这笔失败的交易不影响数据库的状态--库存信息没有被更新、用户也没有付款,订单也没有生成。否则,数据库的信 息将会一片混乱而不可预测。
数据库事务正是用来保证这种情况下交易的平稳性和可预测性的技术。
数据库事务的ACID属性
事 务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元, 可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性: 
原 子性
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。通常,与某个事务关联的操作具有共同的目标,并且是相互依 赖的。如果系统只执行这些操作的一个子集,则可能会破坏事务的总体目标。原子性消除了系统处理操作子集的可能性。
一致性
事 务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结 构(如 B 树索引或双向链表)都必须是正确的。某些维护一致性的责任由应用程序开发人员承担,他们必须确保应用程序已强制所有已知的完整性约束。例如,当开发用于转 帐的应用程序时,应避免在转帐过程中任意移动小数点。 
隔离性
由并发事务所作的修改必须与任何其它并发事务所作的修改隔 离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行 性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。当事务可序列化时将获得最高的隔离级别。在此级别 上,从一组可并行执行的事务获得的结果与通过连续运行每个事务所获得的结果相同。由于高度隔离会限制可并行执行的事务数,所以一些应用程序降低隔离级别以 换取更大的吞吐量。
持久性
事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。
DBMS 的责任和我们的任务
企 业级的数据库管理系统(DBMS)都 有责任提供一种保证事务的物理完整性的机制。就常用的SQL Server2000系统而言,它具备锁定设备隔离事务、记录设备保证事务持久性等机制。因此,我们不必关心数据库事务的物理完整性,而应该关注在什么情 况下使用数据库事务、事务对性能的影响,如何使用事务等等。
本文将涉及到在.net框架下使用C#语言操纵数据库事务的各个方面。

体 验SQL语言的事务机制
作为大型的企业级数据库,SQL Server2000对事务提供了很好的支持。我们可以使用SQL语句来定义、提交以及回滚一个事务。
如下所示的SQL代码定义了一个事务,并且 命名为"MyTransaction":

DECLARE @TranName VARCHAR(20)
SELECT @TranName = 'MyTransaction'
BEGIN TRANSACTION @TranNameGOUSE pubs
GO
UPDATE roysched
SET royalty = royalty * 1.10
WHERE title_id LIKE 'Pc%'
GO
COMMIT TRANSACTION MyTransaction
GO

这里用到了SQL Server2000自带的示例数据库pubs,提交事务后,将为所有畅销计算机书籍支付的版税增加 10%。
打开SQL Server2000的查询分析器,选择pubs数据库,然后运行这段程序,结果显而易见。
可 是如何在C#程序中运行呢?我们记得在普通的SQL查询中,一般需要把查询语句赋值给SalCommand.CommandText属性,这里也就像普通 的SQL查询语句一样,将这些语句赋给SqlCommand.CommandText属性即可。要注意的一点是,其中的"GO"语句标志着SQL批处理的 结束,编写SQL脚本是需要的,但是在这里是不必要的。我们可以编写如下的程序来验证这个想法:
//TranSql.csusing System;
using System.Data;
using System.Data.SqlClient;
namespace Aspcn
{
  public class DbTranSql
  {
file://将事务放到SQL Server中执行
public void DoTran()
{
  file://建立连接并打开
  SqlConnection myConn=GetConn();myConn.Open();
  SqlCommand myComm=new SqlCommand();
  try
  {
myComm.Connection=myConn;
myComm.CommandText="DECLARE @TranName VARCHAR(20) ";
myComm.CommandText+="SELECT @TranName = 'MyTransaction' ";
myComm.CommandText+="BEGIN TRANSACTION @TranName ";
myComm.CommandText+="USE pubs ";
myComm.CommandText+="UPDATE roysched SET royalty = royalty * 1.10 WHERE title_id LIKE 'Pc%' ";
myComm.CommandText+="COMMIT TRANSACTION MyTransaction ";
myComm.ExecuteNonQuery();
  }
  catch(Exception err)
  {
throw new ApplicationException("事务操作出错,系统信息:"+err.Message);
  }
  finally
  {
myConn.Close();
  }
}
file://获取数据连接
private SqlConnection GetConn()
{
  string strSql="Data Source=localhost;Integrated Security=SSPI;user id=sa;password=";
  SqlConnection myConn=new SqlConnection(strSql);
  return myConn;
}
  }
  public class Test
  {
public static void Main()
{
  DbTranSql tranTest=new DbTranSql();
  tranTest.DoTran();
  Console.WriteLine("事务处理已经成功完成。");
  Console.ReadLine();
}
  }
}


注 意到其中的SqlCommand对象myComm,它的CommandText属性仅仅是前面SQL代码字符串连接起来即可,当然,其中 的"GO"语句已经全部去掉了。这个语句就像普通的查询一样,程序将SQL文本事实上提交给DBMS去处理了,然后接收返回的结果(如果有结果返回的 话)。
很自然,我们最后看到了输出"事务处理已经成功完成",再用企业管理器查看pubs数据库的roysched表,所有title_id字段 以"PC"开头的书籍的royalty字段的值都增加了0.1倍。
这里,我们并没有使用ADO.net的事务处理机制,而是简单地将执行事务的 SQL语句当作普通的查询来执行,因此,事实上该事务完全没有用到.net的相关特性。

了解.net中的事务机制
如你所知, 在.net框架中主要有两个命名空间(namespace)用于应用程序同数据库系统的交互: System.Data.SqlClient和System.Data.OleDb。前者专门用于连接Microsoft公司自己的SQL Server数据库,而后者可以适应多种不同的数据库。这两个命名空间中都包含有专门用于管理数据库事务的类,分别是 System.Data.SqlClient.SqlTranscation类和System.Data.OleDb.OleDbTranscation 类。

就像它们的名字一样,这两个类大部分功能是一样的,二者之间的主要差别在于它们的连接机制,前者提供一组直接调用 SQL Server 的对象,而后者使用本机 OLE DB 启用数据访问。 事实上,ADO.net 事务完全在数据库的内部处理,且不受 Microsoft 分布式事务处理协调器 (DTC) 或任何其他事务性机制的支持。本文将主要介绍System.Data.SqlClient.SqlTranscation类,下面的段落中,除了特别注 明,都将使用System.Data.SqlClient.SqlTranscation类。

事务的开启和提交
现在我们对 事务的概念和原理都了然于心了,并且作为已经有一些基础的C#开发者,我们已经熟知编写数据库 交互程序的一些要点,即使用SqlConnection类的对象的Open()方法建立与数据库服务器的连接,然后将该连接赋给SqlCommand对象 的Connection属性,将欲执行的SQL语句赋给它的CommandText属性,于是就可以通过SqlCommand对象进行数据库操作了。对于 我们将要编写的事务处理程序,当然还需要定义一个SqlTransaction类型的对象。并且看到SqlCommand对象的Transcation属 性,我们很容易想到新建的SqlTransaction对象应该与它关联起来。
posted @ 2010-06-25 09:41 Genchill 阅读(29) 评论(0) 编辑

1.jQuery(expression,context)
jQuery中的一切都构建于这个函数之上,或者说都是在以某种方式使用这个函数。
等同:$(expression,context)
expression可以是CSS表达式,XPath表达式
context(可选)作为上下文的DOM元素,文档或jQuery对象。比如document.forms[0]

2.jQuery(elements)
等同:$(elements)
elements是DOM元素
比如:$("#myID")找ID为myID的 ,$("div"),$(".myClass"),$("*")找所有的,$("#myID,div,.myClass")
返回是封装了指定dom元素的JQuery对象
(转义字符为:// 比如要找myID.entry[1]这个ID,这要写成: myID//.entry//[1//])

3.jQuery(html)
等同:$(html)
html:一般是用于动态创建DOM元素的HTML标记字符串
返回的JQuery对象一般常用的方法有:appendTo(dom对象)


4.jQuery(fn)=$(fn)=$(document).ready()

方法和属性

CSS相关
1.css(name)取得第一个匹配元素的样式属性
2.css(key, value)设置一个样式属性的值。
3.css(properties)设置多个样式属性的值。 例如:$("p").css({ color: "red", background: "blue" });
4.height(val),width(val) 设置CSS高度或宽度属性的值。如果没有明确指定单位(如:em或%),使用px。
5.height(),width()  取得高度或宽度

封闭了DOM对象的JQuery对象的属性和方法
1. attr(name) 取得第一个匹配元素的属性值
2. addClass(class) 为每个匹配的元素添加指定的类名。
3. attr(key, value),attr(key, fn)为所有匹配的元素设置一个属性值。
4. attr(properties) 为所有匹配的元素设置多个属性值。
5. removeAttr(name) removeClass(class) 从每一个匹配的元素中删除一个属性或类名。
6. html(),text(),val(),  html(val),text(val),val(val)访问第一个或设置所有的匹配的值,其中html()不能用于XML文档.
7. toggleClass(class) 如果存在(不存在)就删除(添加)一个类。
8. offset( ) 例子:var p = $("p:last");var offset = p.offset();p.html( "left: " + offset.left + ", top: " + offset.top );
9. eq(index)得到第index个DOM
10. hasClass( class ) 判断是否含有指定的css类,有返回true
11. filter( expr:#id .class ) 筛选出符合条件的dom对象,如: .filter(".middle")
12. is(expr:#id .class)  用一个表达式来检查当前选择的元素集合,如果其中至少有一个元素符合这个给定的表达式就返回true。
13. not(elems要从匹配的jQuery元素集合中删除的元素集合) 例子:$("p").not( $("div p.selected") ) 删除所有符合条件的多个元素集合,
not(expr用于匹配要删除元素的表达式)一个jQuery对象中删除一个或多个元素 例子: $("p").not("#selected"),
not(el要删除的元素 )删除一个元素 $("p").not( $("#selected")[0] )
14. slice( start, [end] ) 选择匹配的元素
15. after(content),before(content)在每个匹配的元素之后或前插入内容 
insertAfter(expr),insertBefore(expr) 把所有匹配的元素插入到指定的元素元素集合的前面。
16  prepend(content),prependTo(expr) 向每个匹配的元素内部前置内容
17. empty() 删除匹配的元素集合中所有的子节点。 remove(expr) 从DOM中删除所有匹配的元素。
18. clone(deep) 克隆匹配的DOM元素并且选中这些克隆的副本
19. wrap(elem) wrap(html)把所有匹配的元素用其他元素的结构化标记包装起来。
20. get(),get(num)取得其中一个匹配的元素。 num表示取得第几个匹配的元素.或者全部元素.
21. length 当前匹配的元素数量。  size() 当前匹配的元素数量。
22. lt(pos) 将匹配的元素集合缩减为给定位置之前的所有元素 gt(pos)  将匹配的元素集合缩减为给定位置之后的所有元素

对事件的支持
1.ready( fn ) 当DOM载入就绪可以查询及操纵时绑定一个要执行的函数。例子:$(document).ready()
2.bind(type,data,fn) 为每一个匹配元素的特定事件(像click,blur,change...............)绑定一个事件处理器函数。
3.unbind(type,fn) 删除绑定的事件.  $("p").unbind()删除所有绑定,$("p").unbind("click")
4.one(type,data,fn) 只绑定一次
5.trigger(type)在每一个匹配的元素上触发某类事件。 这样就可以不用blur(fn),blur()这样的方法了.
6.triggerHandler( type, [data] ) 删除以前的绑定,重新绑定
7.click(),click(fn),blur(),blur(fn),change(),change(fn).................................


动画效果Effects
1.show( ),show(speed,callback),hide(),hide(speed,callback),
fadeIn(speed,callback),fadeOut(speed,callback),fadeTo(speed,opacity,callback)
以优雅的动画显示或隐藏所有匹配的元素,并(可选)在显示完成后可选地触发一个回调函数。
speed:slow,normal,fast,1000
slideUp(speed, callback) 通过高度变化(向上减小)来动态地隐藏所有匹配的元素
slideDown(speed,callback) 通过高度变化(向下增大)来动态地显示所有匹配的元素
slideToggle(speed,callback)使匹配的元素以“滑动”的方式隐藏或显示。
toggle() 切换元素的可见状态。如果元素是可见的,切换为隐藏的;如果元素是隐藏的,切换为可见的。
2.animate(params,speed,easing,callback) 用于创建自定义动画的函数
params (Hash): 一组包含作为动画属性和终值的样式属性和及其值的集合
speed (String|Number): (可选) 三种预定速度之一的字符串("slow", "normal", or "fast")或表示动画时长的毫秒数值(如:1000)
easing (String): (可选) 要使用的擦除效果的名称(需要插件支持).
callback (Function): (可选) 在动画完成时执行的函数
$("p").animate({height:200, width:400, opacity: .5}, 1000, "linear", function(){alert("all done");} );

animate( params, options )
$("p").animate({left: "50px", opacity: 1}, { duration: 500, queue: false });
$("p").animate({"opacity": "show"}, { "duration": "slow", "easing": "easein" });

Ajax

Ajax Requests:

1.$.ajax(properties) 返回值是XMLHttpRequest,properties是属性值对 $.ajaxSetup(settings)作为全局设置
type: "POST"或"GET",
url:getdata.php
cache: false,
dataType:"xml" OR "html" OR "text" OR "json" OR "jsonp" OR "script",
data: "name=John&location=Boston",
success: function(msg){alert( "Data Saved: " + msg );

2. $.get( url, [data], [callback], [type] )
$.get("test.cgi", { name: "John", time: "2pm" },function(data){alert("Data Loaded: " + data);});
3. $.post( url, [data], [callback], [type] )
$.post("test.php", { name: "John", time: "2pm" },  function(data){process(data);}, "xml");
4. $.getJSON( url, [data], [callback] )
$.getJSON("test.js", { name: "John", time: "2pm" }, function(json){alert("JSON Data: " + json.users[3].name);});
5. $.getScript(url, callback) 用GET方式装入并执行一个远程JavaScript文件。
6. load(url, params, callback)  $("#links").load("/Main_Page #p-Getting-Started li");


Ajax Events:
1. ajaxStart( callback ) 绑定一个(当AJAX请求开始并且还没有开始运行时)执行的函数
2. ajaxSend(callback)  绑定一个Ajax请求发送时执行的函数。
$("#msg").ajaxSend(function(evt, request, settings){$(this).append("request at "+settings.url);});
3. ajaxComplete( callback ) 当AJAX请求完成时执行一个函数。
$("#msg").ajaxComplete(function(request, settings){$(this).append("<li>Request Complete.</li>");});
4. ajaxSuccess( callback ) 绑定一个当AJAX请求顺利完成时执行的函数。
$("#msg").ajaxSuccess(function(evt, request, settings){$(this).append("<li>Successful Request!</li>");});
5. ajaxError( callback ) 绑定一个当一个AJAX请求失败时执行的函数。
$("#msg").ajaxError(function(event, request, settings){$(this).append("Errorpage " + settings.url);});
6. serialize() 把Input元素的内容连接成为一个请求字符串
7. serializeArray( ) 把Input元素的内容格式为JSON格式


JAVASCRIPT

1. $.browser  version,safari,opera,msie,mozilla
2. $.each(obj, fn) 这个函数与$().each()不同,$().each()是专门用于迭代和执行jQuery对象的函数。而这个函数可以用于迭代任何对象和数组。 这个函数的回调中包含两个参数:第一个是key(对象)或index(数组),第二个是值。
3. $.extend(target,prop1,propN)
4. $.grep(array,fn,inv) 使用筛选函数,从一个数组中筛选项目。 其中筛选函数必须传递两个参数:数组中的当前项目和数组中项目的索引。如果要保持数组中的项目,这个函数必须返回true;如果返回false,就会删除项目。
5. $.makeArray( obj ) 转成数组   var arr = jQuery.makeArray(document.getElementsByTagName("div"));
6. map( callback ) 把一组DOM对象转成数组 $("input").map(function(){return $(this).val();})
7. $.inArray( value, array ) 返回value在array中的索引
8. jQuery.unique( array ) 去掉相同的元素。
9. jQuery.isFunction( obj ) 返回BOOL值,判断是否是函数
10.jQuery.trim( str ) 返回去空格的字符串

注: jQuery的简写是$

Reference:  http://cache.baidu.com/c?m=9d78d513d99b02e80faddf690c66c0171343f3642bd6a0020fa0843e94732b4b5012e0af60624e0b89833a2516ae3a41f7a0682f621420c0ca89de16cabbe57478ce3a7f2157d51d47824af4d61565907acb1ebeb219e5b8fa2f91a4cfd0d44953cf58037083f49c5a77478b2dba&p=8263c64ad29a11a058e8886f5b0e&user=baidu

posted @ 2009-10-22 14:14 Genchill 阅读(346) 评论(0) 编辑

jQuery 由 John Resig 创建于 2006 年初,对于任何使用 JavaScript 代码的程序员来说,它是一个非常有用的 JavaScript 库。无论您是刚刚接触 JavaScript 语言,并且希望获得一个能解决文档对象模型(Document Object Model,DOM)脚本和 Ajax 开发中一些复杂问题的库,还是作为一个厌倦了 DOM 脚本和 Ajax 开发中无聊的重复工作的资深 JavaScript 专家,jQuery 都会是您的首选。

jQuery 能帮助您保证代码简洁易读。您再也不必编写大堆重复的循环代码和 DOM 脚本库调用了。使用 jQuery,您可以把握问题的要点,并使用尽可能最少的代码实现您想要的功能。

毫无疑问,jQuery 的原理是独一无二的:它的目的就是保证代码简洁并可重用。当您理解并体会这一原理后,便可以开始学习本教程了,看看 jQuery 对我们的编程方式有多少改进吧。


1×1


回页首


一些简单的代码简化

下面是一个简单示例,它说明了 jQuery 对代码的影响。要执行一些真正简单和常见的任务,比方说为页面的某一区域中的每个链接附加一个单击(click)事件,您可以使用纯 JavaScript 代码和 DOM 脚本来实现,如 清单 1 所示。


清单 1. 没有使用 jQuery 的 DOM 脚本
                
var external_links = document.getElementById('external_links');
var links = external_links.getElementsByTagName('a');
for (var i=0;i < links.length;i++) {
var link = links.item(i);
link.onclick = function() {
return confirm('You are going to visit: ' + this.href);
};
}

清单 2 显示了使用 jQuery 实现的相同的功能。


清单 2. 使用了 jQuery 的 DOM 脚本
                
$('#external_links a').click(function() {
return confirm('You are going to visit: ' + this.href);
});

是不是很神奇? 使用 jQuery,您可以把握问题的要点,只让代码实现您想要的功能,而省去了一些繁琐的过程。无需对元素进行循环,click() 函数将完成这些操作。同样也不需要进行多个 DOM 脚本调用。您只需要使用一个简短的字符串对所需的元素进行定义即可。

理解这一代码的工作原理可能会有一点复杂。首先,我们使用了 $() 函数 —— jQuery XX能最强大的函数。通常,我们都是使用这个函数从文档中选择元素。在本例中,一个包含有一些层叠样式表(Cascading Style Sheet,CSS)语法的字符串被传递给函数,然后 jQuery 尽可能高效地把这些元素找出来。

如果您具备 CSS 选择器的基本知识,那么应该很熟悉这些语法。在 清单 2 中,#external_links 用于检索 idexternal_links 的元素。a 后的空格表示 jQuery 需要检索 external_links 元素中的所有 <a> 元素。用英语说起来非常绕口,甚至在 DOM 脚本中也是这样,但是在 CSS 中这再简单不过了

$() 函数返回一个含有所有与 CSS 选择器匹配的元素的 jQuery 对象。jQuery 对象 类似于数组,但是它附带有大量特殊的 jQuery 函数。比方说,您可以通过调用 click 函数把 click 处理函数指定给 jQuery 对象中的所有元素。

还可以向 $() 函数传递一个元素或者一个元素数组,该函数将把这些元素封装在一个 jQuery 对象中。您可能会想要使用这个功能将 jQuery 函数用于一些对象,比方说 window 对象。例如,我们通常会像下面这样把函数分配给加载事件:

window.onload = function() {
// do this stuff when the page is done loading
};

使用 jQuery 编写的功能相同的代码:

$(window).load(function() {
// run this when the whole page has been downloaded
});

您可能有所体会,等待窗口加载的过程是非常缓慢而且令人痛苦的,这是因为必须等整个页面加载完所有的内容,包括页面上所有的的图片。有的时候,您希 望首先完成图片加载,但是在大多数情况下,您只需加载超文本标志语言(Hypertext Markup Language,HTML)就可以了。通过在文档中创建特殊的 ready 事件,jQuery 解决了这个问题,方法如下:

$(document).ready(function() {
// do this stuff when the HTML is all ready
});

这个代码围绕 document 元素创建了一个 jQuery 对象,然后建立一个函数,用于在 HTML DOM 文档就绪的时候调用实例。可以根据需要任意地调用这个函数。并且能够以真正的 jQuery 格式,使用快捷方式调用这个函数。这很简单,只需向 $() 函数传递一个函数就可以了:

$(function() {
// run this when the HTML is done downloading
});

到目前以止,我已经向大家介绍了 $() 函数的三种用法。第四种方法可以使用字符串来创建元素。结果会产生一个包含该元素的 jQuery 对象。清单 3 显示的示例在页面中添加了一个段落。


清单 3. 创建和附加一个简单的段落
                
$('<p></p>')
.html('Hey World!')
.css('background', 'yellow')
.appendTo("body");

在前一个例子中您可能已经注意到,jQuery 中的另一个功能强大的特性就是方法链接(method chaining)。每次对 jQuery 对象调用方法时,方法都会返回相同的 jQuery 对象。这意味着如果您需要对 jQuery 对象调用多个方法,那么您不必重新键入选择器就可以实现这一目的:使 Ajax 变得简单

$('#message').css('background', 'yellow').html('Hello!').show();


1×1


回页首


 

使用 jQuery 将使 Ajax 变得及其简单。jQuery 提供有一些函数,可以使简单的工作变得更加简单,复杂的工作变得不再复杂。

Ajax 最常见的用法就是把一块 HTML 代码加载到页面的某个区域中去。为此,只需简单地选择所需的元素,然后使用 load() 函数即可。下面是一个用于更新统计信息的示例:

$('#stats').load('stats.html');

通常,我们只需简单地把一些参数传递给服务器中的某个页面。正如您所预料的,使用 jQuery 实现这一操作非常地简单。您可以使用 $.post() 或者 $.get(),这由所需的方法决定。如果需要的话,您还可以传递一个可选的数据对象和回调函数。清单 4 显示了一个发送数据和使用回调的简单示例。


清单 4. 使用 Ajax 向页面发送数据
                
$.post('save.cgi', {
text: 'my string',
number: 23
}, function() {
alert('Your data has been saved.');
});

如果您确实需要编写一些复杂的 Ajax 脚本,那么需要用到 $.ajax() 函数。您可以指定 xmlscripthtml 或者 json,jQuery 将自动为回调函数准备合适的结果,这样您便可以立即使用该结果。还可以指定 beforeSenderrorsuccess 或者 complete 回调函数,向用户提供更多有关 Ajax 体验的反馈。此外,还有一些其它的参数可供使用,您可以使用它们设置 Ajax 请求的超时,也可以设置页面 “最近一次修改” 的状态。清单 5 显示了一个使用一些我所提到的参数检索 XML 文档的示例。


清单 5. $.ajax() 使 Ajax 由复杂变简单
                
$.ajax({
url: 'document.xml',
type: 'GET',
dataType: 'xml',
timeout: 1000,
error: function(){
alert('Error loading XML document');
},
success: function(xml){
// do something with xml
}
});

当 success 回调函数返回 XML 文档后,您可以使用 jQuery 检索这个 XML 文档,其方式与检索 HTML 文档是一样的。这样使得处理 XML 文档变得相当地容易,并且把内容和数据集成到了您的 Web 站点里面。清单 6 显示了 success 函数的一个扩展,它为 XML 中的每个 <item> 元素都添加了一个列表项到 Web 页面中。


清单 6. 使用 jQuery 处理 XML 文档
                
success: function(xml){
$(xml).find('item').each(function(){
var item_text = $(this).text();

$('<li></li>')
.html(item_text)
.appendTo('ol');
});
}


1×1


回页首


为 HTML 添加动画

可以使用 jQuery 处理基本的动画和显示效果。animate() 函数是动画代码的核心,它用于更改任何随时间变化的数值型的 CSS 样式值。比方说,您可以变化高度、宽度、不透明度和位置。还可以指定动画的速度,定为毫秒或者预定义的速度:慢速,中速或快速。

下面是一个同时变化某个元素高度和宽度的示例。请注意,这些参数没有开始值,只有最终值。开始值取自元素的当前尺寸。同时我也附加了一个回调函数。

$('#grow').animate({ height: 500, width: 500 }, "slow", function(){
alert('The element is done growing!');
});

jQuery 的内置函数使更多常见的动画更容易完成。可以使用 show()hide() 元素,立即显示或者以特定的速度显示。还可以通过使用 fadeIn()fadeOut(),或者 slideDown()slideUp() 显示和隐藏元素,这取决于您所需要的显示效果。下面的示例定义了一个下滑的导航菜单。

$('#nav').slideDown('slow');


1×1


回页首


DOM 脚本和事件处理

或许 jQuery 最擅长的就是简化 DOM 脚本和事件处理。遍历和处理 DOM 非常简单,同时附加、移除和调用事件也十分容易,且不像手动操作那样容易出错。

从本质上说,jQuery 可以使 DOM 脚本中的常用操作变得更加容易。您可以创建元素并且使用 append() 函数把它们与其它的一些元素链接到一起,使用 clone() 复制元素,使用 html() 设置内容,使用 empty() 函数删除内容,使用 remove() 函数删除所有的元素,即便是使用 wrap() 函数,用其他元素将这些元素包装起来。

通过遍历 DOM,一些函数可以用于更改 jQuery 对象本身的内容。可以获得元素所有的 siblings()parents()children()。还可以选择 next()prev() 兄弟元素。find() 函数或许是功能最强大的函数,它允许使用 jQuery 选择器搜索 jQuery 对象中元素的后代元素。

如果结合使用 end() 函数,那么这些函数将变得更加强大。这个函数的功能类似于 undo 函数,用于返回到调用 find()parents() 函数(或者其它遍历函数)之前的 jQuery 对象。

如果配合方法链接(method chaining)一起使用,这些函数可以使复杂的操作看上去非常简单。清单 7 显示了一个示例,其中包含有一个登录表单并处理了一些与之有关的元素。


清单 7. 轻松地遍历和处理 DOM
                
$('form#login')
// hide all the labels inside the form with the 'optional' class
.find('label.optional').hide().end()

// add a red border to any password fields in the form
.find('input:password').css('border', '1px solid red').end()

// add a submit handler to the form
.submit(function(){
return confirm('Are you sure you want to submit?');
});

不管您是否相信,这个示例只是一行满是空白的被链接的代码。首先,选择登录表单。然后,发现其中含有可选标签,隐藏它们,并调用 end() 返回表单。然后,我创建了密码字段,将其边界变为红色,再次调用 end() 返回表单。最后,我在表单中添加了一个提交事件处理程序。其中尤为有趣的就是(除了其简洁性以外),jQuery 完全优化了所有的查询操作,确保将所有内容很好地链接在一起后,不需要对一个元素执行两次查询。

处理常见事件就像调用函数(比方说 click()submit()mouseover())和为其传递事件处理函数一样简单。此外,还可以使用 bind('eventname', function(){}) 指定自定义的事件处理程序。可以使用 unbind('eventname') 删除某些事件或者使用 unbind() 删除所有的事件。有关这些函数的使用方法的完整列表,请参阅 参考资料 中的 jQuery 应用程序编程接口(Application Program Interface,API)文档。


1×1


回页首


释放 jQuery 选择器的强大能量

我们经常会使用 ID 来选择元素,比如 #myid,或者通过类名,比如 div.myclass 来选择元素。然而,jQuery 提供了更为复杂和完整的选择器语法,允许我们在单个选择器中选择几乎所有的元素组合。

jQuery 的选择器语法主要是基于 CSS3 和 XPath 的。对 CSS3 和 XPath 了解的越多,使用 jQuery 时就越加得心应手。有关 jQuery 选择器的完整列表,包括 CSS 和 XPath,请参阅 参考资料 中的链接。

CSS3 包含一些并不是所有浏览器都支持的语法,因此我们很少使用它。然而,我们仍然可以在 jQuery 中使用 CSS3 选择元素,因为 jQuery 具备自己的自定义选择器引擎。比方说,要在表格中的每一个空列中都添加一个横杠,可以使用::empty 伪选择器(pseudo-selector):

$('td:empty').html('-');

如果需要找出所有含特定类的元素呢? CSS3 同样提供了一个语法可以完成这个目的,使用 :not 伪选择器: 如下代码显示了如何隐藏所有不含 required 类的输入内容:

$('input:not(.required)').hide();

与在 CSS 中一样,可以使用逗号将多个选择器连接成一个。下面是一个同时隐藏页面上所有类型列表的简单示例:

$('ul, ol, dl').hide();

XPath 是一种功能强大的语法,用于在文档中搜寻元素。它与 CSS 稍有区别,不过它能实现的功能略多于 CSS。要在所有复选框的父元素中添加一个边框,可以使用 XPath 的 /.. 语法:

$("input:checkbox/..").css('border', '1px solid #777');

jQuery 中也加入了一些 CSS 和 XPath 中没有的选择器。比方说,要使一个表更具可读性,通常可以在表格的奇数行或偶数行中附加一个不同的类名 —— 也可以称作把表分段(striping)。使用 jQuery 不费吹灰之力就可以做到这点,这需要归功于 odd 伪选择器。下面这个例子使用 striped 类改变了表格中所有奇数行的背景颜色:

$('table.striped > tr:odd').css('background', '#999999');

我们可以看到强大的 jQuery 选择器是如何简化代码的。不论您想处理什么样的元素,不管这个元素是具体的还是模糊的,都有可能找到一种方法使用一个 jQuery选择器对它们进行定义。


1×1


回页首


使用插件扩展 jQuery

与大多数软件不同,使用一个复杂的 API 为 jQuery 编写插件并不是非常困难。事实上,jQuery 插件非常易于编写,您甚至希望编写一些插件来使代码更加简单。下面是可以编写的最基本的 jQuery 插件:

$.fn.donothing = function(){
return this;
};

虽然非常简单,但是还是需要对这个插件进行一些解释。首先,如果要为每一个 jQuery 对象添加一个函数,必须把该函数指派给 $.fn。第二,这个函数必须要返回一个 this(jQuery 对象),这样才不至于打断 方法链接(method chaining)

可以轻松地在这个示例之上构建。要编写一个更换背景颜色的插件,以替代使用 css('background'),可以使用下面的代码:

$.fn.background = function(bg){
return this.css('background', bg);
};

清注意,可以只从 css() 返回值,因为已经返回了 jQuery 对象。因此,方法链接(method chaining)仍然运作良好。

我建议在需要重复工作的时候使用 jQuery 插件。比方说,如果您需要使用 each() 函数反复执行相同的操作,那么可以使用一个插件来完成。

由于 jQuery 插件相当易于编写,所以有上百种可供你选择使用。jQuery 提供的插件可用于制表、圆角、滑动显示、工具提示、日期选择器,以及我们可以想到的一切效果。有关插件的完整列表,请参阅 参考资料

最为复杂、使用最为广泛的插件要属界面(Interface),它是一种动画插件,用于处理排序、拖放功能、复杂效果、以及其它有趣和复杂的用户界 面(User Interface,UI)。界面对于 jQuery 来说就如 Scriptaculous 对于 Prototype 一样。

表单插件也同样流行且非常有用,通过它可以使用 Ajax 在后台中轻松地提交表单。这个插件用于处理一些常见的情况:您需要截获某个表单的提交事件,找出所有不同的输入字段,并使用这些字段构造一个 Ajax 调用。

引用地址: http://blog.zwsky.com/html/diary/showlog.vm?sid=63&log_id=5...(复制地址)
posted @ 2009-07-14 09:59 Genchill 阅读(668) 评论(1) 编辑

<?xml version="1.0"?>
<!--Webconfig的一般执行顺序:
1.当前文件夹
2.父文件夹
3.Framework自定义的两个config文件(web.config和machine.config)
注意:
子目录的配置设置可以提供除从父目录继承的配置信息以外的配置信息,也可以重写或修改父目录中定义的设置。
运行时对Web.config文件的修改不需要重启服务就可以生效(注:<processModel> 节例外);
Web.config文件是可以扩展的。你可以自定义新配置参数并编写配置节处理程序以对它们进行处理;
web.config配置文件(默认的配置设置)以下所有的代码都应该位于<system.web></system.web>之间

-->
<configuration>
 <!--configuration 节根元素,其它节都是在它的内部-->
 <!--配置节处理程序声明 特点:位于配置文件的顶部,包含在<configSections>-->
 <!--自定义Web.config文件配置节过程分为两步。
 1.在配置文件顶部 <configSections> 和 </configSections>标记之间声明配置节的名称和处理该节中配置数据的 .NET Framework 类的名称。
 2.是在 <configSections> 区域之后为声明的节做实际的配置设置。
 -->
 <configSections>
  <section name="enterpriseLibrary.ConfigurationSource" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ConfigurationSourceSection, Microsoft.Practices.EnterpriseLibrary.Common, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  <section name="exceptionHandling" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration.ExceptionHandlingSettings, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  <section name="ore.SiebelWrite" type="ORE.SiebelWrite.DataAccess.Bases.NetTiersServiceSection, ORE.SiebelWrite.DataAccess" allowDefinition="MachineToApplication" restartOnExternalChanges="true"/>
  <!--配置节组
  特点: 用用<sectionGroup>标记,可以自定义分组,可以放到<configSections>内部或其它<sectionGroup>标记的内部
  -->
  <sectionGroup name="ore">
   <section name="data" type="ORE.Framework.Providers.ProviderConfigurationHandler, ORE.Framework"/>
   <section name="scheduling" type="ORE.Framework.Providers.ProviderConfigurationHandler, ORE.Framework"/>
  </sectionGroup>
  <!--示例:创建一个节存储数据库连接字符串-->
  <section name="appSettings" type="System.Configuration.NameValueFileSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
 </configSections>
 <enterpriseLibrary.ConfigurationSource selectedSource="File Configuration Source">
  <sources>
   <add name="File Configuration Source" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource, Microsoft.Practices.EnterpriseLibrary.Common, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" filePath="entlib.config"/>
  </sources>
 </enterpriseLibrary.ConfigurationSource>
 <loggingConfiguration name="Logging Application Block" tracingEnabled="true" defaultCategory="General" logWarningsWhenNoCategoriesMatch="true">
  <listeners>
   <add databaseInstanceName="ORE" writeLogStoredProcName="WriteLog" addCategoryStoredProcName="AddCategory" formatter="Text Formatter" listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Database.Configuration.FormattedDatabaseTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging.Database, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" traceOutputOptions="None" type="Microsoft.Practices.EnterpriseLibrary.Logging.Database.FormattedDatabaseTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging.Database, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" name="Database Trace Listener"/>
  </listeners>
  <formatters>
   <add template="Timestamp: {timestamp} Message: {message} Category: {category} Priority: {priority} EventId: {eventid} Severity: {severity} Title:{title} Machine: {machine} Application Domain: {appDomain} Process Id: {processId} Process Name: {processName} Win32 Thread Id: {win32ThreadId} Thread Name: {threadName} Extended Properties: {dictionary({key} - {value} )}" type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" name="Text Formatter"/>
  </formatters>
  <categorySources>
   <add switchValue="All" name="General">
    <listeners>
     <add name="Database Trace Listener"/>
    </listeners>
   </add>
  </categorySources>
  <specialSources>
   <allEvents switchValue="All" name="All Events"/>
   <notProcessed switchValue="All" name="Unprocessed Category"/>
   <errors switchValue="All" name="Logging Errors &amp; Warnings">
    <listeners>
     <add name="Database Trace Listener"/>
    </listeners>
   </errors>
  </specialSources>
 </loggingConfiguration>
 <exceptionHandling>
  <exceptionPolicies>
   <add name="General Policy">
    <exceptionTypes>
     <add type="System.Exception, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" postHandlingAction="NotifyRethrow" name="Exception">
      <exceptionHandlers>
       <add logCategory="General" eventId="91" severity="Error" title="Enterprise Library Exception Handling" formatterType="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.TextExceptionFormatter, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" priority="0" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" name="Logging Handler"/>
      </exceptionHandlers>
     </add>
    </exceptionTypes>
   </add>
  </exceptionPolicies>
 </exceptionHandling>
 <connectionStrings>
  <!--<add name="ORE" connectionString="data source=TEST-SERVER-DATA;Integrated Security=SSPI;Database=SSET_US_P25;" providerName="System.Data.SqlClient"/>-->
  <add name="ORE" connectionString="data source=CARLO-PC;Integrated Security=SSPI;Database=SSET_US_P25;" providerName="System.Data.SqlClient"/>
 </connectionStrings> 
 <ore>
  <data defaultProvider="SqlDataProvider">
   <providers>
    <clear/>
    <add name="SqlDataProvider" type="ORE.Data.SqlDataProvider, ORE.SqlDataProvider" connectionStringName="ORE" upgradeConnectionString="" providerPath="~\Providers\DataProviders\SqlDataProvider\" objectQualifier="oq_" databaseOwner="dbo"/>
   </providers>
  </data>
  <scheduling defaultProvider="MSScheduler">
   <providers>
    <clear/>
    <add name="MSScheduler" type="ORE.Services.Scheduling.MSScheduling.MSScheduler, ORE.Services.Scheduling" providerPath="~\Providers\MSScheduler\" debug="false" maxThreads="1"/>
   </providers>
  </scheduling>
 </ore>
 <ore.SiebelWrite defaultProvider="SqlNetTiersProvider">
  <providers>
   <add name="SqlNetTiersProvider" type="ORE.SiebelWrite.DataAccess.SqlClient.SqlNetTiersProvider, ORE.SiebelWrite.DataAccess.SqlClient" connectionStringName="ORE" providerInvariantName="System.Data.SqlClient" entityFactoryType="ORE.SiebelWrite.Entities.EntityFactory" useEntityFactory="true" enableEntityTracking="true" enableMethodAuthorization="true" useStoredProcedure="false" defaultCommandTimeout="30"/>
  </providers>
 </ore.SiebelWrite>
 <appSettings><add key="scon" value="server=localhost;database=Northwind;uid=sa;pwd=123"/></appSettings>
 <!--访问Web.config文件你可以通过使用ConfigurationSettings.AppSettings 静态字符串集合来访问 Web.config 文件示例
 protected static string Isdebug = ConfigurationManager.AppSettings["scon"]-->
 <appSettings>
  <!--appSettings此节用于定义应用程序设置项。对一些不确定设置,还可以让用户根据自己实际情况自己设置-->
  <add key="Conntction" value="server=192.168.85.66;userid=sa;password=;database=Info;"/> & lt;!--定义了一个连接字符串常量,并且在实际应用时可以修改连接字符串,不用修改程式代码-->.
  <add key="ErrPage" value="Error.aspx"/><!--定义了一个错误重定向页面-->
  <!--<add key="SiebelUrl" value="https://swsiis2.parttest.extranettest.microsoft.com"/>-->
  <!--<add key="SiebelUrl" value="https://mssws.partners.extranet.microsoft.com"/>-->
  <add key="SiebelUrl" value="https://msswspreprod.partners.extranet.microsoft.com"/>
  <add key="ViewOppInSiebelLink" value="https://siebelpreprod.partners.extranet.microsoft.com/sales_enu/start.swe?SWECmd=GotoView&amp;SWEView=Opportunity+List+View&amp;SWERF=1&amp;SWEBU=1&amp;SWEApplet0=Opportunity+List+Applet&amp;SWERowId0="/>
  <add key="ViewAccountInSiebelLink" value="https://siebelpreprod.partners.extranet.microsoft.com/sales_enu/start.swe?SWECmd=GotoView&amp;SWEView=Account+List+View&amp;SWERF=1&amp;SWEBU=1&amp;SWEApplet0=Account+List+Applet&amp;SWERowId0="/>
  <add key="UsCustomerDocStore" value="http://usprofiling1:100/CustomerDocStore/default.aspx"/>
  <add key="Deployment" value="UAT"/>
  <add key="CutOffDate" value="2007/1/1"/>
  <add key="TestTeam" value="hoptjw.w-ojrps.w-{oofq.w-jmhopi.w-yzoobe.w-ymobut.w-pbhnbt.w-fitjz.w"/>
  <add key="Webserver" value="http://test-server-app:8020"/>
  <add key="applicationName" value="{0} Opportunity Resource Engine"/>
  <add key="applicationNameShort" value="{0} ORE"/>
  <add key="IntroFile" value="D:\inetpub\ORE SE\documents\Intro.htm"/>
  <add key="TestServer" value="True"/>
  <!--Switch to specify whether an admin user should be notified about unhandled exceptions via email (true/false)-->
  <add key="enableErrorNotification" value="true"/>
  <!--Email addresses used for error notification-->
  <add key="errorMessageFromEmailAddress" value="SSET US&lt;sset@microsoft.com&gt;"/>
  <!--The email address(es) to appear in the To field. Separate with semicolons.-->
  <add key="errorMessageToEmailAddresses" value="i-paalex@microsoft.com"/>
  <!--Specifies the BCC address(es) for new opportunity requests (if any).If specifiying multiple addresses, separate with semicolons.-->
  <add key="newRequestBCCEmailAddresses" value=""/>
  <!--The default site coordinator details.These details will be used if a coordinator hasn't been selected from the list of Specialists.-->
  <add key="defaultCoordinatorName" value="ORE Helpdesk"/>
  <add key="defaultCoordinatorAlias" value="Help4US"/>
  <add key="NotifierEmailAddress" value="ore@microsoft.com"/>
  <!--Siebel location search filter-->
  <add key="swsMSLocationFilter" value="United States"/>
  <!--Specifies whether wildcards (*) are implicit in the Siebel Search (true/false)-->
  <add key="useImplicitWildcards" value="False"/>
  <!--If using implicit wildcards, specifies whether to prepend the wildcard to the search criterion (true/false)-->
  <add key="addLeadingWildcard" value="False"/>
  <!--Specifies whether to raise an error if the search returns 100 results (true/false)-->
  <add key="raiseErrorIfExcessResults" value="True"/>
  <!-- Specifies the default number of days to add to todays date in order to calulate the Request Due Date for a new request-->
  <add key="defaultDueDateDaysToAdd" value="7"/>
  <!-- Specifies the SMTP Server to use when sending emails-->
  <add key="smtpServer" value="smtphost.redmond.corp.microsoft.com"/>
  <!--The following key defines the list of acceptable character codes that should NOT be encoded by the IOSec.HtmlEncode method-->
  <add key="allowedCharacterCodes" value="148,153,132,142,129,154,225,33,35,36,37,38,40,41,43,44,45,46,47,58,59,61,63,92,8211"/>
  <!-- Database Settings for Siebel Upload-->
  <add key="DatabaseServerUpload" value="test-server-data"/>
  <add key="DatabaseCatalogUpload" value="SSET_US_P25"/>
  <add key="DatabasePersistSecurityInfoUpload" value="false"/>
  <!-- Version: Dev | Live | Config -->
  <add key="Version" value="Dev"/>
  <add key="NotificationFilter" value="pi{id.w-jfm{.w-ofitz.w-vidze.w-fitjz.w-hoptjw.w-ymobut.w-ojrps.w-{oofq.w-pbhfm.w-jmhopi.w-yzoobe.w"/>
  <add key="LocalPort" value="10079"/>
  <add key="RemotePort" value="10086"/>
  <add key="AppointmentPage" value="CreateAppointment.aspx"/>
 </appSettings>


 <!--<system.Web>节,控制asp.net运行时的行为-->
 <system.web>
  <httpHandlers>
   <add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false"/>
  </httpHandlers>
  <pages validateRequest="false" enableViewStateMac="true" enableEventValidation="false">
   <controls>
    <add tagPrefix="data" namespace="ORE.SiebelWrite.Web.Data" assembly="ORE.SiebelWrite.Web"/>
    <add tagPrefix="data" namespace="ORE.SiebelWrite.Web.UI" assembly="ORE.SiebelWrite.Web"/>
   </controls>
  </pages>
  
  <httpModules>
   <add name="SiebelWriteEntityTransactionModule" type="ORE.SiebelWrite.Web.Data.EntityTransactionModule"/>
  </httpModules>

  <!--<compilation>节作用:配置 asp.NET 使用的所有编译设置。默认的debug属性为“True”.在程序编译完成交付使用之后应将其设为False-->
  <compilation debug="true" defaultLanguage="c#">
   <!--default language: 定义后台代码语言,可以选择c#和vb.net两种语言
    debug : 为true时,启动aspx调试;为false不启动aspx调试,因而可以提高应用程序运行时的性能。一般程序员在开发时设置为true,交给客户时设置为false.
   -->
   <assemblies>
    <add assembly="System.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="Xceed.Compression.Formats, Version=1.0.5357.0, Culture=neutral, PublicKeyToken=BA83FF368B7563C6"/>
    <add assembly="System.Runtime.Remoting, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="Xceed.Compression, Version=2.3.5357.0, Culture=neutral, PublicKeyToken=BA83FF368B7563C6"/>
    <add assembly="System.Configuration.Install, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.ServiceProcess, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Management, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.Messaging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="Microsoft.ApplicationBlocks.Data, Version=1.8.0.0, Culture=neutral, PublicKeyToken=BB47406E8B145095"/>
    <add assembly="Microsoft.Web.Services2, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add assembly="System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.Xml, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.Web.Services, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Configuration.Install, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Web, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Security, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.ServiceProcess, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="MS.Alchemy.CommonPlatform, Version=1.8.0.0, Culture=neutral, PublicKeyToken=BB47406E8B145095"/>
    <add assembly="MS.Alchemy.Core, Version=1.8.0.0, Culture=neutral, PublicKeyToken=BB47406E8B145095"/>
    <add assembly="MS.Alchemy.GlobalStore, Version=1.8.0.0, Culture=neutral, PublicKeyToken=BB47406E8B145095"/>
    <add assembly="MS.Alchemy.LocalStore, Version=1.8.0.0, Culture=neutral, PublicKeyToken=BB47406E8B145095"/>
    <add assembly="stdole, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="Microsoft.ReportViewer.Common, Version=8.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="Microsoft.Office.Interop.Excel, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71E9BCE111E9429C"/>
   </assemblies>
   <buildProviders>
    <add extension=".rdlc" type="Microsoft.Reporting.RdlBuildProvider, Microsoft.ReportViewer.Common, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
   </buildProviders>
  </compilation>
  

  <!--mode : 具有On,Off,RemoteOnly 3种状态。On表示始终显示自定义的信息; Off表示始终显示详细的asp.net错误信息; RemoteOnly表示只对不在本地Web服务器上运行的用户显示自定义信息.-->
  <!--<customErrors> 为 asp.NET 应用程序提供有关自定义错误信息的信息。它不适用于 xml Web services 中发生的错误。-->
  <customErrors mode="RemoteOnly" defaultRedirect="Error.aspx">
   <error statusCode="440" redirect="err440.aspx"/>
   <error statusCode="550" redirect="err550.aspx"/>
  </customErrors>
  
  <!--authentication 作用:配置 asp.NET 身份验证支持(为Windows、Forms、PassPort、None四种)。该元素只能在计算机、站点或应用程序级别声明。< authentication> 元素必需与<authorization> 节配合使用。-->
  <!--<authentication mode="Windows"/>-->
  <!--Windows: 使用IIS验证方式
  Forms: 使用基于窗体的验证方式
  Passport: 采用Passport cookie验证模式
  None: 不采用任何验证方式-->
  <authentication mode="Forms">
   <forms name=".ASPUSERDEMO" loginUrl="Login.aspx" protection="All" timeout="30" />
  </authentication>
  <!--.Name: 指定完成身份验证的Http cookie的名称.
  LoginUrl: 如果未通过验证或超时后重定向的页面URL,一般为登录页面,让用户重新登录
  Protection: 指定 cookie数据的保护方式.
    可设置为: All None Encryption Validation四种保护方式
    a. All表示加密数据,并进行有效性验证两种方式
    b. None表示不保护Cookie.
    c. Encryption表示对Cookie内容进行加密
    d. validation表示对Cookie内容进行有效性验证
  TimeOut: 指定Cookie的失效时间. 超时后要重新登录.-->
  <!--<authorization> 节
   作用:控制对 URL 资源的客户端访问(如允许匿名用户访问)。此元素可以在任何级别(计算机、站点、应用程序、子目录或页)上声明。必需与<authentication> 节配合使用。
   示例:以下示例禁止匿名用户的访问
   注:你可以使用user.identity.name来获取已经过验证的当前的用户名;
   可以使用web.Security.FormsAuthentication.RedirectFromLoginPage方法将已验证的用户重定向到用户刚才请求的页面
  -->
  <authorization>
   <deny users="?"/>
  </authorization>
  <!--asp.net 关于form认证的一般设置:
  1: 在web.config中,加入form认证;
     <authentication mode="Forms">
     <forms name="auth" loginUrl="index.aspx" timeout="30"></forms>
  </authentication>
  <authorization>
    <deny users="?" />
   </authorization>
  2: 如果有注册页面时还应该允许匿名用户调用注册页面进行注册;
  以下代码应该在<configuration><system.web>之间,而不应该包含到<system.web>..</system.web>之间;
  ----------------表示允许匿名用户对 userReg.aspx页面进行访问.
   <location path="userReg.aspx">
   <system.web>
    <authorization>
     <allow users="?" />
    </authorization>
   </system.web>
  </location>
  3 在登录成功后要创建身份验证票, 表明已经通过认证的合法用户;
  if(登陆成功)
  System.Web.Security.FormsAuthentication.SetAuthCookie(用户名称, false);-->

  <!--<identity impersonate="true" userName="registry:HKLM\SOFTWARE\ORE\identity\ASPNET_SETREG,userName" password="registry:HKLM\SOFTWARE\ORE\identity\ASPNET_SETREG,password"/>-->
  <!--<identity impersonate="true" userName="REDMOND\OREPP" password="@ct@BER_3RD"/>-->
  <identity impersonate="true" userName="REDMOND\OREPP" password="nOvbEr_igtH"/>

  <!--<trace> 配置 asp.NET 跟踪服务,主要用来程序测试判断哪里出错。
  示例:以下为Web.config中的默认配置:
  注:
  enabled="false"表示不启用跟踪;
  requestLimit="10"表示指定在服务器上存储的跟踪请求的数目
  pageOutput="false"表示只能通过跟踪实用工具访问跟踪输出;
  traceMode="SortByTime"表示以处理跟踪的顺序来显示跟踪信息
  localOnly="true" 表示跟踪查看器 (trace.axd) 只用于宿主 Web 服务器
  -->
  <trace enabled="false" requestLimit="10" pageOutput="true" traceMode="SortByTime" localOnly="true"/>


  <!--<sessionState> 为当前应用程序配置会话状态设置(如设置是否启用会话状态,会话状态保存位置)。-->
  <sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;user id=sa;password=" cookieless="false" timeout="1440" />
  <!--<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Integrated Security=SSPI" cookieless="false" timeout="1440"/>-->
  <!--.mode: 分为off,Inproc,StateServer,SqlServer几种状态
  mode = InProc 存储在进程中特点:具有最佳的性能,速度最快,但不能跨多台服务器存储共享.
  mode = "StateServer" 存储在状态服务器中特点:   当需要跨服务器维护用户会话信息时,使用此方法。但是信息存储在状态服务器上,一旦状态服务器出现故障,信息将丢失
  mode="SqlServer" 存储在sql server中特点:工作负载会变大,但信息不会丢失.
  
  stateConnectionString : 设置将session信息存储在状态服务中时使用的服务器名称和端口号,默认是本机,当mode的值是StateServer是,这个属性是必需的。例如:"tcpip=127.0.0.1:42424”。
  sqlConnectionString: 设置与sql server连接时的连接字符串。例如"data source= localhost;Integrated Security=SSPI;Initial Catalog=northwind"。当mode的值是 SQLServer时,这个属性是必需的
  Cookieless:设置为true时,表示不使用cookie会话状态来标识客户;否则,相反.
  TimeOut:用来定义会话状态存储的时间,超过期限,将自动终止会话.-->
  <!--asp.NET中客户端session状态的存储
  常有的session模型中,session状态应该存储在两个地方,分别是客户端和服务器端。客户端只负责保存相应网站的SessionID,而其他的session信息则保存在服务器端。
  在asp中,客户端的SessionID实际是以Cookie的形式存储的。如果用户在浏览器的设置中选择了禁用Cookie,那末他也就无法享受session的便利之处了,甚至造成不能访问某些网站。
  为了解决以上问题,在 asp.NET中客户端的session信息存储方式分为:Cookie和Cookieless两种。
  asp.NET中,默认状态下,在客户端还是使用Cookie存储session信息的。如果我们想在客户端使用Cookieless的方式存储session信息的方法如下:
  找到当前Web应用程序的根目录,将cookieless="false"改为:cookieless="true",这样,客户端的session信息就不再使用 Cookie存储了,而是将其通过URL存储。
  重新访问Web应用程序,就会看到类似下面的样子:其中,http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245) /default.aspx中黑体标出的就是客户端的session ID。
  注意,这段信息是由IIS自动加上的,不会影响以前正常的连接。-->

  <!--
当mode的值是InProc时,说明服务器正在使用这种模式。
这种方式和以前asp中的模式一样,就是服务器 将session信息存储在IIS进程中。当IIS关闭、重起后,这些信息都会丢失。但是这种模式也有自己最大好处,就是性能最高。应为所有的 session信息都存储在了IIS的进程中,所以IIS能够很快的访问到这些信息,这种模式的性能比进程外存储session信息或是在sql server中存储session信息都要快上很多。这种模式也是asp.NET的默认方式。

将服务器session信息存储在进程外
(1)打开管理工具->服务,找到名为:asp.NET State Service的服务,启动它。实际上,这个服务就是启动一个要保存session信息的进程。启动这个服务后,你可以从Windows任务管理器 ->进程中看到一个名为 aspnet_state.exe的进程,这个就是我们保存session信息的进程。
(2)将mode的值改为StateServer。
   实际上,这种将session信息存储在进程外的方式不光指可以将信息存储在本机的进程外,还可以将session信息存储在其他的服务器的进程中。这 时,不光需要将mode的值改为StateServer,还需要在stateConnectionString中配置相应的参数。例如你的计算你是 192.168.0.1,你想把session存储在ip为192.168.0.2的计算机的进程中,就需要设置成这样: stateConnectionString="tcpip=192.168.0.2:42424"。当然,不要忘记在192.168.0.2的计算机中 装上.NET Framework,并且启动asp.NET State Services服务。

将服务器session信息存储在sql server中
(1)启动sql server和sql server代理服务。在sql server中执行一个叫做 InstallSqlState.sql的脚本文件。这个脚本文件将在sql server中创建一个用来专门存储session信息的数据库,及一个维护session信息数据库的sql server代理作业。
可以在以下路径中找到那个文件:
[system drive]\winnt\Microsoft.NET\Framework\[version]\
(2) 打开查询分析器,连接到sql server服务器,打开刚才的那个文件并且执行。稍等片刻,数据库及作业就建立好了。这时,可以打开企业管理器,看到新增了一个叫ASPState的数 据库。但是这个数据库中只是些存储过程,没有用户表。实际上session信息是存储在了tempdb 数据库的ASPStateTempSessions表中的,另外一个ASPStateTempApplications表存储了asp中 application对象信息。这两个表也是刚才的那个脚本建立的。另外查看管理->SQL server代理->作业,发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是 每分钟去ASPStateTempSessions 表中删除过期的session信息的。
  接着,我们返回到Web.config文件,修改 mode的值改为SQLServer。注意,还要同时修改sqlConnectionString的值,格式 为:sqlConnectionString="data source=localhost; Integrated Security=SSPI;"
   其中data source是指sql server服务器的ip地址,如果sql server与IIS是一台机子,写127.0.0.1 就行了。Integrated Security=SSPI的意思是使用Windows集成身份验证,这样,访问数据库将以asp.NET的身份进行,通过如此配置,能够获得比使用 sql server验证方式更好的安全性。当然,如果sql server运行于另一台计算机上,你可能会需要通过Active Directory域的方式来维护两边验证的一致性。
-->

  <globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="en-US"/>
  <!--requestEncoding: 它用来检查每一个发来请求的编码,responseEncoding: 用于检查发回的响应内容编码,fileEncoding: 用于检查aspx,asax等文件解析的默认编码-->

  <!--<webServices>
   <soapExtensionTypes>
    <add type="Microsoft.Web.Services2.WebServicesExtension, Microsoft.Web.Services2, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" priority="1" group="0"/>
   </soapExtensionTypes>
  </webServices>-->
  
  <!--<httpRuntime>配置 asp.NET HTTP 运行库设置。该节可以在计算机、站点、应用程序和子目录级别声明。-->
  <!--Eg:控制用户上传文件最大为4M,最长时间为60秒,最多请求数为100-->
  <httpRuntime maxRequestLength="4000" executionTimeout="60" appRequestQueueLimit="100"/>
  <!--<httpRuntime executionTimeout="36000" useFullyQualifiedRedirectUrl="true" maxRequestLength="81920"/>-->

  <!--<pages> 标识特定于页的配置设置(如是否启用会话状态、视图状态,是否检测用户的输入等)。可以在计算机、站点、应用程序和子目录级别声明。-->
  <!-- 示例:不检测用户在浏览器输入的内容中是否存在潜在的危险数据(注:该项默认是检测,如果你使用了不检测,一定要对用户的输入进行编码或验证),在从客户 端回发页时将检查加密的视图状态,以验证视图状态是否已在客户端被篡改。(注:该项默认是不验证)-->
  <pages validateRequest="false" buffer="true" enableViewStateMac="true" />
 </system.web>

 <!--特定应用程序配置 特点: 位于<appSetting>,可以定义应用程序的全局常量设置等信息-->

 <system.runtime.remoting>
  <application>
   <client>
    <wellknown type="ClientStore, LocalTransactionStore" url="http://localhost:8000/ClientStore.rem"/>
   </client>
   <channels>
    <channel ref="http" port="0">
     <clientProviders>
      <formatter ref="binary"/>
     </clientProviders>
    </channel>
   </channels>
  </application>
 </system.runtime.remoting>
 <!--UAT-->
 <ms.alchemy.commonplatform>
  <runtime directory="C:\Program Files\Microsoft Alchemy\Common Platform 1.8\metadata" stsprimary="ACPSTS.partners.extranet.microsoft.com" autodelegate="true" clientname="6E8D3B96-5616-4899-834F-E26ED15F1A33" hostname="" instrumentationlevel="0" minimumcompressionpercent="10" maxdatasize="4000" mode="Native" proxyprocessor="Required" stssecondary="" tracelevel="5" transactionloglevel="Request|Response" ltsmachine="localhost" ltsport="8000" ltsmode="Remoting" serverprocessor="Required"/>
  <cache transactions="120" consumer="36000" user="36000" entity="36000" config="30"/>
  <lts frequency="60" tracing="On" gtsmachine="ACPGTS.partners.extranet.microsoft.com" gtsport="8989" samplerate="1" exceedfrequency="25" maxworkingset="35000"/>
 </ms.alchemy.commonplatform>
 <!--TEST-->
 <!--<ms.alchemy.commonplatform>
  <runtime directory="C:\Program Files\Microsoft Alchemy\Common Platform 1.8\metadata" stsprimary="juacpqa.parttest.extranettest.microsoft.com" autodelegate="true" clientname="oretsa_dec19test2" hostname="" instrumentationlevel="0" minimumcompressionpercent="10" maxdatasize="4000" mode="Native" proxyprocessor="Required" stssecondary="" tracelevel="5" transactionloglevel="Request|Response" ltsmachine="localhost" ltsport="8000" ltsmode="Remoting" serverprocessor="Required"/>
  <cache transactions="120" consumer="36000" user="36000" entity="36000" config="30"/>
  <lts frequency="60" tracing="On" gtsmachine="juacpqa.parttest.extranettest.microsoft.com" gtsport="8989" samplerate="1" exceedfrequency="25" maxworkingset="35000"/>
 </ms.alchemy.commonplatform>-->
 <!--PRODUCTION-->
 <!--<ms.alchemy.commonplatform>
  <runtime directory="C:\Program Files\Microsoft Alchemy\Common Platform 1.8\metadata" stsprimary="ACPSTS.partners.extranet.microsoft.com" autodelegate="true" clientname="09FCF9C4-546F-43C5-B1A2-4FE77A8BD0DC" hostname="" instrumentationlevel="0" minimumcompressionpercent="10" maxdatasize="4000" mode="Native" proxyprocessor="Required" stssecondary="" tracelevel="5" transactionloglevel="Request|Response" ltsmachine="localhost" ltsport="8000" ltsmode="Remoting" serverprocessor="Required"/>
  <cache transactions="120" consumer="36000" user="36000" entity="36000" config="30"/>
  <lts frequency="60" tracing="On" gtsmachine="ACPGTS.partners.extranet.microsoft.com" gtsport="8989" samplerate="1" exceedfrequency="25" maxworkingset="35000"/>
 </ms.alchemy.commonplatform>-->
</configuration>
posted @ 2009-07-13 17:45 Genchill 阅读(331) 评论(0) 编辑

数据库表A有十万条记录,查询速度本来还可以,但导入一千条数据后,问题出现了。当选择的数据在原十万条记录之间时,速度还是挺快的;但当选择的数据在这一千条数据之间时,速度变得奇慢。

凭经验,这是索引碎片问题。检查索引碎片DBCC SHOWCONTIG(表),得到如下结果:

DBCC SHOWCONTIG 正在扫描 'A' 表...
表: 'A'(884198200);索引 ID: 1,数据库 ID: 13
已执行 TABLE 级别的扫描。
- 扫描页数.....................................: 3127
- 扫描扩展盘区数...............................: 403
- 扩展盘区开关数...............................: 1615

- 每个扩展盘区上的平均页数.....................: 7.8
- 扫描密度[最佳值:实际值]....................: 24.20%[391:1616]
- 逻辑扫描碎片.................................: 68.02%
- 扩展盘区扫描碎片.............................: 38.46%
- 每页上的平均可用字节数.......................: 2073.2
- 平均页密度(完整)...........................: 74.39%

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

 

由上我们看出,逻辑扫描碎片和扩展盘区扫描碎片都非常大,果真需要对索引碎片进行处理了。

一般有两种方法解决,一是利用DBCC INDEXDEFRAG整理索引碎片,二是利用DBCC DBREINDEX重建索引。二者各有优缺点。调用微软的原话如下:
DBCC INDEXDEFRAG 命令是联机操作,所以索引只有在该命令正在运行时才可用。而且可以在不丢失已完成工作的情况下中断该操作。这种方法的缺点是在重新组织数据方面没有聚集索引的除去/重新创建操作有效。

重新创建聚集索引将对数据进行重新组织,其结果是使数据页填满。填满程度可以使用 FILLFACTOR 选项进行配置。这种方法的缺点是索引在除去/重新创建周期内为脱机状态,并且操作属原子级。如果中断索引创建,则不会重新创建该索引。

也就是说,要想获得好的效果,还是得用重建索引,所以决定重建索引。
DBCC DBREINDEX(表,索引名,填充因子)
第一个参数,可以是表名,也可以是表ID。
第二个参数,如果是'',表示影响该表的所有索引。
第三个参数,填充因子,即索引页的数据填充程度。如果是100,表示每一个索引页都全部填满,此时select效率最高,但以后要插入索引时,就得移动后面的所有页,效率很低。如果是0,表示使用先前的填充因子值。

DBCC DBREINDEX(A,'',100)
重新测试查询速度,飞快。

另:一般来说填充因子使用系统默认的值即可。

posted @ 2009-07-13 11:36 Genchill 阅读(76) 评论(0) 编辑
摘要: 人们在使用SQL时往往会陷入一个误区,即太关注于所得的结果是否正确,而忽略了不同的实现方法之间可能存在的性能差异,这种性能差异在大型的或是复杂的数据库环境中(如联机事务处理OLTP或决策支持系统DSS)中表现得尤为明显。笔者在工作实践中发现,不良的SQL往往来自于不恰当的索引设计、不充份的连接条件和不可优化的where子句。在对它们进行适当的优化后,其运行速度有了明显地提高!下面我将从这三个方面分...阅读全文
posted @ 2009-07-12 15:46 Genchill 阅读(146) 评论(0) 编辑