<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-9who的程序博客,天道酬勤</title><link>http://www.cnblogs.com/9who/</link><description>寻梦的岁月从不言辛苦几多，不问收获多几...</description><language>zh-cn</language><lastBuildDate>Mon, 13 Oct 2008 06:50:02 GMT</lastBuildDate><pubDate>Mon, 13 Oct 2008 06:50:02 GMT</pubDate><ttl>60</ttl><item><title>petshop4.0 各个文件的作用</title><link>http://www.cnblogs.com/9who/archive/2008/09/20/1294544.html</link><dc:creator>9who</dc:creator><author>9who</author><pubDate>Fri, 19 Sep 2008 16:51:00 GMT</pubDate><guid>http://www.cnblogs.com/9who/archive/2008/09/20/1294544.html</guid><wfw:comment>http://www.cnblogs.com/9who/comments/1294544.html</wfw:comment><comments>http://www.cnblogs.com/9who/archive/2008/09/20/1294544.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/9who/comments/commentRss/1294544.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/9who/services/trackbacks/1294544.html</trackback:ping><description><![CDATA[petshop4.0设计说明 (转）
<p>一、项目名称及描述：(实现步骤为：4-3-6-5-2-1)</p>
<p>1、WEB＝表示层</p>
<p>2、BLL＝业务逻辑层</p>
<p>3、IDAL＝数据访问层接口定义</p>
<p>4、Model＝业务实体</p>
<p>5、DALFactory＝数据层的抽象工厂(创建反射)</p>
<p>6、SQLServerDAL＝SQLServer数据访问层 / OracleDAL＝Oracle数据访问层</p>
<p>DBUtility 数据库访问组件基础类</p>
<p>二、项目引用关系</p>
<p>1、Web 引用 BLL。</p>
<p>2、BLL 引用 IDAL，Model，使用DALFactory创建实例。</p>
<p>3、IDAL 引用 Model。</p>
<p>4、Model 无引用。</p>
<p>5、DALFactory 引用IDAL，通过读取web.config里设置的程序集，加载类的实例，返回给BLL使用。</p>
<p>6、SQLServerDAL 引用 Model和IDAL，被DALFactory加载的程序集，实现接口里的方法。 </p>
<p>三、实现步骤</p>
<p>1、创建Model，实现业务实体。</p>
<p>2、创建IDAL，实现接口。</p>
<p>3、创建SQLServerDAL，实现接口里的方法。</p>
<p>4、增加web.config里的配置信息，为SQLServerDAL的程序集。</p>
<p>5、创建DALFactory，返回程序集的指定类的实例。</p>
<p>6、创建BLL，调用DALFactory，得到程序集指定类的实例，完成数据操作方法。</p>
<p>7、创建WEB，调用BLL里的数据操作方法。</p>
<p>注意：</p>
<p>1、web.config里的程序集名称必须与SQLServerDAL里的输出程序集名称一致。</p>
<p>2、DALFactory里只需要一个DataAccess类，可以完成创建所有的程序集实例。</p>
<p>3、项目创建后，注意修改各项目的默认命名空间和程序集名称。</p>
<p>4、注意修改解决方案里的项目依赖。</p>
<p>5、注意在解决方案里增加各项目引用。</p>
<p>&nbsp;</p>
<p>1<br />
WEB<br />
&nbsp;&nbsp;&nbsp;&nbsp; 表示层</p>
<p>2<br />
Model<br />
PetShop.Model PetShop.Model 业务实体</p>
<p>3<br />
BLL<br />
PetShop.BLL PetShop.BLL 业务逻辑层</p>
<p>4<br />
DALFactory<br />
PetShop.DAL PetShop.DALFactory 数据层的抽象工厂</p>
<p>5<br />
IDAL<br />
PetShop.IDAL PetShop.IDAL 数据访问层接口定义</p>
<p>6<br />
SQLServerDAL<br />
PetShop.SQLServerDAL PetShop.SQLServerDAL SQLServer数据访问层</p>
<p>7<br />
OracleDAL<br />
PetShop.OracleDAL PetShop.OracleDAL Oracle数据访问层</p>
<p>8<br />
DBUtility<br />
PetShop.DBUtility PetShop.DBUtility 数据库访问组件基础类</p>
<p>9<br />
CacheDependencyFactory<br />
PetShop.CacheDependencyFactory PetShop.CacheDependencyFactory 缓存依赖类的工厂类</p>
<p>10<br />
ICacheDependency<br />
PetShop.ICacheDependency PetShop.ICacheDependency 缓存依赖类接口</p>
<p>11<br />
TableCacheDependency<br />
PetShop.TableCacheDependency PetShop.TableCacheDependency 缓存依赖实现类</p>
<p>12<br />
IBLLStrategy<br />
PetShop.IBLLStrategy PetShop.IBLLStrategy 同步/异步处理策略接口(实现在bll根据配置反射选择)</p>
<p>13<br />
MessagingFactory<br />
PetShop.MessagingFactory PetShop.MessagingFactory 异时处理消息队列的抽象工厂</p>
<p>14<br />
IMessaging<br />
PetShop.IMessaging PetShop.IMessaging 异时处理消息队列接口定义</p>
<p>15<br />
MSMQMessaging<br />
PetShop.MsmqMessaging PetShop.MsmqMessaging 异时处理消息队列的实现</p>
<p>16<br />
Profile<br />
PetShop.Profile PetShop.Profile Profile的数据访问层</p>
<p>17<br />
ProfileDALFactory<br />
PetShop.ProfileDALFactory PetShop.ProfileDALFactory ProfileDAL的工厂类(反射创建ProfileDAL)</p>
<p>18<br />
IProfileDAL<br />
PetShop.IProfileDAL PetShop.IProfileDAL Profile的数据访问层接口定义</p>
<p>19<br />
OracleProfileDAL<br />
PetShop.OracleProfileDAL PetShop.OracleProfileDAL Oracle的Profile Providers</p>
<p>做用户状态管理</p>
<p>20<br />
SQLProfileDAL<br />
PetShop.SQLProfileDAL PetShop.SQLProfileDAL SQL Server 的Profile Providers</p>
<p>做用户状态管理</p>
<p>21<br />
Membership<br />
PetShop.Membership PetShop.Membership Membership认证和授权管理</p>
<p>22<br />
OrderProcessor<br />
PetShop.OrderProcessor PetShop.OrderProcessor 后台处理进程，处理订单队列</p>
<p><br />
些项目可以分类来理解，主要包括以下几个部分，<br />
Web &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 外观层<br />
Bill &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 业务逻辑层<br />
IDAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  数据访问层接口<br />
DALFactory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  数据层的抽象工厂<br />
SQLServerDAL&nbsp;&nbsp;&nbsp;&nbsp; SQL数据访问层<br />
OracleDAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Oracle数据访问层<br />
Model&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 业务实体层<br />
DBUtility&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据访问组件基础类</p>
<p>CacheDependencyFactory 缓存依赖的工厂类<br />
ICacheDependency&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 缓存依赖类接口<br />
TableCacheDependency&nbsp;&nbsp; 缓存依赖实现类</p>
<p>IBLLStrategy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同步/异步处理策略接口<br />
MessagingFactory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 异时处理消息队列的抽象工厂<br />
IMessaging&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 异时处理消息队列接口定义<br />
MSMQMessaging&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 异时消息队列的实现</p>
<p>Profile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Profile数据访问层<br />
ProfileDALFactory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProfileDAL的工厂类<br />
IProfileDAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Profile数据访问层接口定义</p>
<p><br />
OracleProfileDALOracle的Profile Providers 做用户状态管理<br />
SQLProfileDALSQL Server 的Profile Providers 做用户状态管理</p>
<p>MembershipMembership认证和授权管理<br />
OrderProcessor后台处理进程，处理订单队列</p>
<p>&nbsp;</p>
<p style="text-indent: 2em">SQL数据库中含有四个数据库</p>
<p style="text-indent: 2em">它们分别为：MSPetShop4 ，MSPetShop4Oreder，&nbsp; MSPetShop4Profile 和MSPetShop4Servers</p>
<p style="text-indent: 2em">其中MSPetShop4有如下几个表分别为CateGory&nbsp; Product Item Supplier和Inventory五个表</p>
<p style="text-indent: 2em">其中CateGory存储宠物类别有关信息Product存储宠物的商品目录Item存储宠物的详细信息</p>
<p style="text-indent: 2em">Supplier存储相关供应商的信息Inventory存储和每种宠物的具体数量</p>
<p style="text-indent: 2em">MSPetShop4Order 含有一下三个表其数据库模型如下</p>
<p style="text-indent: 2em"><img src="http://images.cnblogs.com/cnblogs_com/dragonlhf/bdasamppet410.gif" border="0"  alt="" /></p>
<p style="text-indent: 2em">Order表存储了订单的详细通信信息OrderStatus记录了订单的状态LineItem记录了订单中的宠物数量等等详细信息</p>
<p style="text-indent: 2em">MSPetshopPrifile 的数据库模型如下</p>
<p style="text-indent: 2em"><img src="http://images.cnblogs.com/cnblogs_com/dragonlhf/bdasamppet412.gif" border="0"  alt="" /></p>
<p style="text-indent: 2em">其中Profile表记录了客户的基本活动信息</p>
<p style="text-indent: 2em">Account 记录了客户的身份地址相关信息</p>
<p style="text-indent: 2em">Cart记录了用户的意向清单和购物列表</p>
<p style="text-indent: 2em">最后一个数据库就是MSPetShop4Servers它相当于Visual Studio内置的成员和角色管理的数据库</p>
<p style="text-indent: 2em">这里不在讨论</p>
<p style="text-indent: 2em">！</p>
<p style="text-indent: 2em">在这么简单的功能中建如此大的工程和复杂的数据库设计．微软肯定有自己的卖点</p>
<p style="text-indent: 2em">下面我们看看PetShop4.0中相对于3.0的新增相关技术！</p>
<p style="text-indent: 2em">
<table cellspacing="0" cellpadding="0" border="0">
    <tr>
            <td valign="top">?</td>
            <td>
            <p>&nbsp;</p>
            <p style="text-indent: 2em">用 System.Transactions 代替服务组件。</p>
            </td>
        </tr>
        <tr>
            <td valign="top">?</td>
            <td>
            <p>&nbsp;</p>
            <p style="text-indent: 2em">用强类型集合的泛型代替松散类型的 ILists。</p>
            </td>
        </tr>
        <tr>
            <td valign="top">?</td>
            <td>
            <p>&nbsp;</p>
            <p style="text-indent: 2em">ASP.NET 2.0 成员身份，用于用户身份验证和授权。</p>
            </td>
        </tr>
        <tr>
            <td valign="top">?</td>
            <td>
            <p>&nbsp;</p>
            <p style="text-indent: 2em">用于 Oracle 10G 的自定义 ASP.NET 2.0 成员身份提供程序。</p>
            </td>
        </tr>
        <tr>
            <td valign="top">?</td>
            <td>
            <p>&nbsp;</p>
            <p style="text-indent: 2em">ASP.NET 2.0 自定义 Oracle 和 SQL Server 配置文件提供程序，用于用户状态管理。</p>
            </td>
        </tr>
        <tr>
            <td valign="top">?</td>
            <td>
            <p>&nbsp;</p>
            <p style="text-indent: 2em">用母版页取代 ASP.NET Web 用户控件，从而获得一致的外观。</p>
            </td>
        </tr>
        <tr>
            <td valign="top">?</td>
            <td>
            <p>&nbsp;</p>
            <p style="text-indent: 2em">ASP.NET 2.0 向导控件。</p>
            </td>
        </tr>
        <tr>
            <td valign="top">?</td>
            <td>
            <p>&nbsp;</p>
            <p style="text-indent: 2em">使用 SqlCacheDependency（而非基于超时）的数据库级缓存失效。</p>
            </td>
        </tr>
        <tr>
            <td valign="top">?</td>
            <td>
            <p>&nbsp;</p>
            <p style="text-indent: 2em">启用基于消息队列构建的异步 Order 处理</p>
            </td>
        </tr>
    </table>
</p>
<p style="text-indent: 2em">在这个工程中用到了抽象工厂设计模式</p>
<p style="text-indent: 2em">我对设计模式了解的很少，明天深入学习一下抽象工厂设计模式，同时试着做一个类似多层的项目以尽快熟悉2005和了解它的新特性</p>
<p style="text-indent: 2em">所谓&#8220;依懒注入&#8221; </p>
<p style="text-indent: 2em">就是将应用程序所依赖的组件在运行时动态的加载到应用</p>
<p style="text-indent: 2em">程序中。依赖注入的目标并非为应用程序添加更多的功能，而是提升了组件的</p>
<p style="text-indent: 2em">重用性，并为应用程序搭建一个具有较强灵活性和扩展性的平台。在程序实现上就用</p>
<p style="text-indent: 2em">Assembly.Load(AssemblyName).CreateInstance(typeName)在程序运行时动态创建实例.PetShop4.0中多次应用了与配置文件相强合的反射注入技术。下面就介绍一下反射注入技术在PetShop4.0多层应用程序和应用。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">
<table cellspacing="0" cellpadding="0" width="580" border="1">
    <tr>
            <td valign="top" width="67">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">项目名</p>
            </td>
            <td valign="top" width="600" colspan="3">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">PetShop.CacheDependencyFactory</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="67">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">类名</p>
            </td>
            <td valign="top" width="165">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">DependencyAccess</p>
            </td>
            <td valign="top" width="59">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">方法</p>
            </td>
            <td valign="top" width="376">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">privatestaticIPetShopCacheDependency LoadInstance(string className)</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="67">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">配置文件中的值</p>
            </td>
            <td valign="top" width="600" colspan="3">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">&lt;appSetting&gt;</p>
            <p style="text-indent: 2em">&#8230;&#8230;&#8230;.</p>
            <p style="text-indent: 2em">&lt;add key="CacheDependencyAssembly" value="PetShop.TableCacheDependency"/&gt;</p>
            <p style="text-indent: 2em">&#8230;&#8230;</p>
            <p style="text-indent: 2em">&lt;/appSetting&gt;</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="67">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">代码文件中的实现</p>
            </td>
            <td valign="top" width="600" colspan="3">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">string path=ConfigurationManager.AppSettings["CacheDependencyAssembly"];</p>
            <p style="text-indent: 2em">string fullyQualifiedClass = path + "." + className;</p>
            <p style="text-indent: 2em">return (IPetShopCacheDependency)Assembly.Load(path)</p>
            <p style="text-indent: 2em">.CreateInstance(fullyQualifiedClass);</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="667" colspan="4">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">从上面的实现来看其实是很简单的。三个步骤就实现了：两前个步骤，主要是为动态创建</p>
            <p style="text-indent: 2em">实例提供参数：程序集名称，和类名称（类型名）.</p>
            <p style="text-indent: 2em">1.&nbsp;&nbsp;&nbsp; 执行ConfigurationManager.AppSettings[&#8220;keyName&#8221;]来获取配置文件中的键值，也就</p>
            <p style="text-indent: 2em">程序集的名称AssemblyName。</p>
            <p style="text-indent: 2em">2.&nbsp;&nbsp;&nbsp; 组合类名称typeName。</p>
            <p style="text-indent: 2em">3.&nbsp;&nbsp;&nbsp; 执行Assembly.Load(AssemblyName).CreateInstance(typeName)进行动太创建实例</p>
            <p style="text-indent: 2em">其实PetShop4.0中实现反射注入技术都是上面的那种思想。所以下面就省去配置文件中的</p>
            <p style="text-indent: 2em">信息和实现的代码实现信息，只是统计反射注入技术在PetShop4.0中应用的位置信息。</p>
            </td>
        </tr>
    </table>
</p>
<p style="text-indent: 2em">
<table cellspacing="0" cellpadding="0" align="left" border="1">
    <tr>
            <td valign="top" width="67">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">项目名</p>
            </td>
            <td valign="top" width="624">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">PetShop.DALFactory</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="67">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">类名</p>
            </td>
            <td valign="top" width="624">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">DataAccess</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="67">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">方法</p>
            </td>
            <td valign="top" width="624">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">1.&nbsp;&nbsp;&nbsp; public static PetShop.IDAL.ICategory CreateCategory()</p>
            <p style="text-indent: 2em">2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static PetShop.IDAL.IInventory CreateInventory()</p>
            <p style="text-indent: 2em">3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static PetShop.IDAL.IItem CreateItem()</p>
            <p style="text-indent: 2em">4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static PetShop.IDAL.IOrder CreateOrder()</p>
            <p style="text-indent: 2em">5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static PetShop.IDAL.IProduct CreateProduct()</p>
            </td>
        </tr>
    </table>
</p>
<p style="text-indent: 2em"></p>
<p style="text-indent: 2em"></p>
<p style="text-indent: 2em">
<table cellspacing="0" cellpadding="0" align="left" border="1">
    <tr>
            <td valign="top" width="67">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">项目名</p>
            </td>
            <td valign="top" width="624">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">PetShop.MessagingFactory</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="67">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">类名</p>
            </td>
            <td valign="top" width="624">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">QueueAccess</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="67">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">方法</p>
            </td>
            <td valign="top" width="624">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">public static PetShop.IMessaging.IOrder CreateOrder()</p>
            </td>
        </tr>
    </table>
</p>
<p style="text-indent: 2em"></p>
<p style="text-indent: 2em">&nbsp;
<table cellspacing="0" cellpadding="0" align="left" border="1">
    <tr>
            <td valign="top" width="67">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">项目名</p>
            </td>
            <td valign="top" width="624">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">PetShop.ProfileDALFactory</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="67">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">类名</p>
            </td>
            <td valign="top" width="624">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">DataAccess</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="67">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">方法</p>
            </td>
            <td valign="top" width="624">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">Publics&nbsp; tatic</p>
            <p style="text-indent: 2em">PetShop.IProfileDAL.IPetShopProfileProvider</p>
            <p style="text-indent: 2em">CreatePetShopProfileProvider()</p>
            </td>
        </tr>
    </table>
<br />
</p>
<img src ="http://www.cnblogs.com/9who/aggbug/1294544.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42960/" target="_blank">[新闻]Facebook创始人:信息共享或存摩尔定律</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>如何构造一个C#语言的爬虫蜘蛛程序</title><link>http://www.cnblogs.com/9who/archive/2008/09/11/1289199.html</link><dc:creator>9who</dc:creator><author>9who</author><pubDate>Thu, 11 Sep 2008 07:17:00 GMT</pubDate><guid>http://www.cnblogs.com/9who/archive/2008/09/11/1289199.html</guid><wfw:comment>http://www.cnblogs.com/9who/comments/1289199.html</wfw:comment><comments>http://www.cnblogs.com/9who/archive/2008/09/11/1289199.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/9who/comments/commentRss/1289199.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/9who/services/trackbacks/1289199.html</trackback:ping><description><![CDATA[C#特别适合于构造蜘蛛程序，这是因为它已经内置了HTTP访问和多线程的能力，而这两种能力对于蜘蛛程序来说都是非常关键的。下面是构造一个蜘蛛程序要解决的关键问题：
<p>　　⑴ HTML分析：需要某种HTML解析器来分析蜘蛛程序遇到的每一个页面。 </p>
<p>　　⑵ 页面处理：需要处理每一个下载得到的页面。下载得到的内容可能要保存到磁盘，或者进一步分析处理。 </p>
<p>　　⑶ 多线程：只有拥有多线程能力，蜘蛛程序才能真正做到高效。 </p>
<p>　　⑷ 确定何时完成：不要小看这个问题，确定任务是否已经完成并不简单，尤其是在多线程环境下。 </p>
<p>　　一、HTML解析</p>
<p>本文提供的HTML解析器由ParseHTML类实现，使用非常方便：首先创建该类的一个实例，然后将它的Source属性设置为要解析的HTML文档： </p>
<p>&nbsp;</p>
<p>ParseHTML parse = new ParseHTML(); </p>
<p>parse.Source = "
<p>Hello World</p>
";
<p>&nbsp;</p>
<p>接下来就可以利用循环来检查HTML文档包含的所有文本和标记。通常，检查过程可以从一个测试Eof方法的while循环开始： </p>
<p>&nbsp;</p>
<p>while(!parse.Eof()) </p>
<p>{ </p>
<p>char ch = parse.Parse(); </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　Parse方法将返回HTML文档包含的字符--它返回的内容只包含那些非HTML标记的字符，如果遇到了HTML标记，Parse方法将返回0值，表示现在遇到了一个HTML标记。遇到一个标记之后，我们可以用GetTag()方法来处理它。 </p>
<p>&nbsp;</p>
<p>if(ch==0) </p>
<p>{ </p>
<p>HTMLTag tag = parse.GetTag(); </p>
<p>} </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　一般地，蜘蛛程序最重要的任务之一就是找出各个HREF属性，这可以借助C#的索引功能完成。例如，下面的代码将提取出HREF属性的值（如果存在的话）。 </p>
<p>&nbsp;</p>
<p>Attribute href = tag["HREF"]; </p>
<p>string link = href.Value; </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　获得Attribute对象之后，通过Attribute.Value可以得到该属性的值。 </p>
<p>&nbsp;</p>
<p>二、处理HTML页面 </p>
<p>&nbsp;</p>
<p>　　下面来看看如何处理HTML页面。首先要做的当然是下载HTML页面，这可以通过C#提供的HttpWebRequest类实现： </p>
<p>&nbsp;</p>
<p>HttpWebRequest request = (HttpWebRequest)WebRequest.Create(m_uri); </p>
<p>response = request.GetResponse(); </p>
<p>stream = response.GetResponseStream(); </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　接下来我们就从request创建一个stream流。在执行其他处理之前，我们要先确定该文件是二进制文件还是文本文件，不同的文件类型处理方式也不同。下面的代码确定该文件是否为二进制文件。 </p>
<p>&nbsp;</p>
<p>if( !response.ContentType.ToLower().StartsWith("text/") ) </p>
<p>{ </p>
<p>SaveBinaryFile(response); </p>
<p>return null; </p>
<p>} </p>
<p>string buffer = "",line; </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　如果该文件不是文本文件，我们将它作为二进制文件读入。如果是文本文件，首先从stream创建一个StreamReader，然后将文本文件的内容一行一行加入缓冲区。 </p>
<p>&nbsp;</p>
<p>reader = new StreamReader(stream); </p>
<p>while( (line = reader.ReadLine())!=null ) </p>
<p>{ </p>
<p>buffer+=line+"rn"; </p>
<p>} </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　装入整个文件之后，接着就要把它保存为文本文件。 </p>
<p>&nbsp;</p>
<p>SaveTextFile(buffer); </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　下面来看看这两类不同文件的存储方式。 </p>
<p>&nbsp;</p>
<p>　　二进制文件的内容类型声明不以"text/"开头，蜘蛛程序直接把二进制文件保存到磁盘，不必进行额外的处理，这是因为二进制文件不包含HTML，因此也不会再有需要蜘蛛程序处理的HTML链接。下面是写入二进制文件的步骤。 </p>
<p>&nbsp;</p>
<p>　　首先准备一个缓冲区临时地保存二进制文件的内容。 byte []buffer = new byte[1024]; </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　接下来要确定文件保存到本地的路径和名称。如果要把一个myhost.com网站的内容下载到本地的c:test文件夹，二进制文件的网上路径和名称是http://myhost.com/images/logo.gif，则本地路径和名称应当是c:testimageslogo.gif。与此同时，我们还要确保c:test目录下已经创建了images子目录。这部分任务由convertFilename方法完成。 </p>
<p>&nbsp;</p>
<p>string filename = convertFilename( response.ResponseUri ); </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　convertFilename方法分离HTTP地址，创建相应的目录结构。确定了输出文件的名字和路径之后就可以打开读取Web页面的输入流、写入本地文件的输出流。 </p>
<p>&nbsp;</p>
<p>Stream outStream = File.Create( filename ); </p>
<p>Stream inStream = response.GetResponseStream(); </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　接下来就可以读取Web文件的内容并写入到本地文件，这可以通过一个循环方便地完成。 </p>
<p>&nbsp;</p>
<p>int l; </p>
<p>do </p>
<p>{ </p>
<p>l = inStream.Read(buffer,0, </p>
<p>buffer.Length); </p>
<p>if(l&gt;0) </p>
<p>outStream.Write(buffer,0,l); </p>
<p>} while(l&gt;0); </p>
<p>三、多线程</p>
<p>我们用DocumentWorker类封装所有下载一个URL的操作。每当一个DocumentWorker的实例被创建，它就进入循环，等待下一个要处理的URL。下面是DocumentWorker的主循环： </p>
<p>&nbsp;</p>
<p>while(!m_spider.Quit ) </p>
<p>{ </p>
<p>m_uri = m_spider.ObtainWork(); </p>
<p>&nbsp;</p>
<p>m_spider.SpiderDone.WorkerBegin(); </p>
<p>string page = GetPage(); </p>
<p>if(page!=null) </p>
<p>ProcessPage(page); </p>
<p>m_spider.SpiderDone.WorkerEnd(); </p>
<p>} </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　这个循环将一直运行，直至Quit标记被设置成了true（当用户点击"Cancel"按钮时，Quit标记就被设置成true）。在循环之内，我们调用ObtainWork获取一个URL。ObtainWork将一直等待，直到有一个URL可用--这要由其他线程解析文档并寻找链接才能获得。Done类利用WorkerBegin和WorkerEnd方法来确定何时整个下载操作已经完成。 </p>
<p>&nbsp;</p>
<p>　　从图一可以看出，蜘蛛程序允许用户自己确定要使用的线程数量。在实践中，线程的最佳数量受许多因素影响。如果你的机器性能较高，或者有两个处理器，可以设置较多的线程数量；反之，如果网络带宽、机器性能有限，设置太多的线程数量其实不一定能够提高性能。 </p>
<p>&nbsp;</p>
<p>　　四、任务完成了吗？ </p>
<p>&nbsp;</p>
<p>　　利用多个线程同时下载文件有效地提高了性能，但也带来了线程管理方面的问题。其中最复杂的一个问题是：蜘蛛程序何时才算完成了工作？在这里我们要借助一个专用的类Done来判断。 </p>
<p>&nbsp;</p>
<p>　　首先有必要说明一下"完成工作"的具体含义。只有当系统中不存在等待下载的URL，而且所有工作线程都已经结束其处理工作时，蜘蛛程序的工作才算完成。也就是说，完成工作意味着已经没有等待下载和正在下载的URL。 </p>
<p>&nbsp;</p>
<p>　　Done类提供了一个WaitDone方法，它的功能是一直等待，直到Done对象检测到蜘蛛程序已完成工作。下面是WaitDone方法的代码。 </p>
<p>&nbsp;</p>
<p>public void WaitDone() </p>
<p>{ </p>
<p>Monitor.Enter(this); </p>
<p>while ( m_activeThreads&gt;0 ) </p>
<p>{ </p>
<p>Monitor.Wait(this); </p>
<p>} </p>
<p>Monitor.Exit(this); </p>
<p>} </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　WaitDone方法将一直等待，直到不再有活动的线程。但必须注意的是，下载开始的最初阶段也没有任何活动的线程，所以很容易造成蜘蛛程序一开始就立即停止的现象。为解决这个问题，我们还需要另一个方法WaitBegin来等待蜘蛛程序进入"正式的"工作阶段。一般的调用次序是：先调用WaitBegin，再接着调用WaitDone，WaitDone将等待蜘蛛程序完成工作。下面是WaitBegin的代码： </p>
<p>&nbsp;</p>
<p>public void WaitBegin() </p>
<p>{ </p>
<p>Monitor.Enter(this); </p>
<p>while ( !m_started ) </p>
<p>{ </p>
<p>Monitor.Wait(this); </p>
<p>} </p>
<p>Monitor.Exit(this); </p>
<p>} </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　WaitBegin方法将一直等待，直到m_started标记被设置。m_started标记是由WorkerBegin方法设置的。工作线程在开始处理各个URL之时，会调用WorkerBegin；处理结束时调用WorkerEnd。WorkerBegin和WorkerEnd这两个方法帮助Done对象确定当前的工作状态。下面是WorkerBegin方法的代码： </p>
<p>&nbsp;</p>
<p>public void WorkerBegin() </p>
<p>{ </p>
<p>Monitor.Enter(this); </p>
<p>m_activeThreads++; </p>
<p>m_started = true; </p>
<p>Monitor.Pulse(this); </p>
<p>Monitor.Exit(this); </p>
<p>} </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　WorkerBegin方法首先增加当前活动线程的数量，接着设置m_started标记，最后调用Pulse方法以通知（可能存在的）等待工作线程启动的线程。如前所述，可能等待Done对象的方法是WaitBegin方法。每处理完一个URL，WorkerEnd方法会被调用： </p>
<p>&nbsp;</p>
<p>public void WorkerEnd() </p>
<p>{ </p>
<p>Monitor.Enter(this); </p>
<p>m_activeThreads--; </p>
<p>Monitor.Pulse(this); </p>
<p>Monitor.Exit(this); </p>
<p>} </p>
<p>&nbsp;</p>
<p>　　WorkerEnd方法减小m_activeThreads活动线程计数器，调用Pulse释放可能在等待Done对象的线程--如前所述，可能在等待Done对象的方法是WaitDone方法。 </p>
<img src ="http://www.cnblogs.com/9who/aggbug/1289199.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42959/" target="_blank">[新闻]微软承认Vista用户账户控制功能有问题</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>ASP.NET26个常用性能优化方法</title><link>http://www.cnblogs.com/9who/archive/2008/08/19/1271585.html</link><dc:creator>9who</dc:creator><author>9who</author><pubDate>Tue, 19 Aug 2008 09:33:00 GMT</pubDate><guid>http://www.cnblogs.com/9who/archive/2008/08/19/1271585.html</guid><wfw:comment>http://www.cnblogs.com/9who/comments/1271585.html</wfw:comment><comments>http://www.cnblogs.com/9who/archive/2008/08/19/1271585.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/9who/comments/commentRss/1271585.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/9who/services/trackbacks/1271585.html</trackback:ping><description><![CDATA[<ol>
    <li><strong>数据库访问性能优化</strong><br />
    　　<font color="#ff3300"><em>数据库的连接和关闭</em></font><br />
    　　访问数据库资源需要创建连接、打开连接和关闭连接几个操作。这些过程需要多次与数据库交换信息以通过身份验证，比较耗费服务器资源。 ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响。系统将用户的数据库连接放在连接池中，需要时取出，关闭时收回连接，等待下一次的连接请求。连接池的大小是有限的，如果在连接池达到最大限度后仍要求创建连接，必然大大影响性能。因此，在建立数据库连接后只有在真正需要操作时才打开连接，使用完毕后马上关闭，从而尽量减少数据库连接打开的时间，避免出现超出连接限制的情况。<br />
    　　<font color="#ff3300"><em>使用存储过程</em><br />
    </font>　　存储过程是存储在服务器上的一组预编译的SQL语句，类似于DOS系统中的批处理文件。存储过程具有对数据库立即访问的功能，信息处理极为迅速。使用存储过程可以避免对命令的多次编译，在执行一次后其执行规划就驻留在高速缓存中，以后需要时只需直接调用缓存中的二进制代码即可。另外，存储过程在服务器端运行，独立于ASP.NET程序，便于修改，最重要的是它可以减少数据库操作语句在网络中的传输。<br />
    　　<font color="#ff3300"><em>优化查询语句</em><br />
    </font>　　ASP.NET中ADO连接消耗的资源相当大，SQL语句运行的时间越长，占用系统资源的时间也越长。因此，尽量使用优化过的SQL语句以减少执行时间。比如，不在查询语句中包含子查询语句，充分利用索引等。</li>
    <li><strong>字符串操作性能优化</strong><br />
    　　<em><font color="#ff3300">使用值类型的ToString方法</font></em><br />
    　　在连接字符串时，经常使用"+"号直接将数字添加到字符串中。这种方法虽然简单，也可以得到正确结果，但是由于涉及到不同的数据类型，数字需要通过装箱操作转化为引用类型才可以添加到字符串中。但是装箱操作对性能影响较大，因为在进行这类处理时，将在托管堆中分配一个新的对象，原有的值复制到新创建的对象中。使用值类型的ToString方法可以避免装箱操作，从而提高应用程序性能。<br />
    　　<em><font color="#ff3300">运用StringBuilder类</font></em><br />
    　　String类对象是不可改变的，对于String对象的重新赋值在本质上是重新创建了一个String对象并将新值赋予该对象，其方法 ToString对性能的提高并非很显著。在处理字符串时，最好使用StringBuilder类，其.NET 命名空间是System.Text。该类并非创建新的对象，而是通过Append，Remove，Insert等方法直接对字符串进行操作，通过 ToString方法返回操作结果。 　　其定义及操作语句如下所示：<br />
    <div class="quote">int num;<br />
    System.Text.StringBuilder str = new System.Text.StringBuilder(); //创建字符串<br />
    str.Append(num.ToString()); //添加数值num<br />
    Response.Write(str.ToString); //显示操作结果</div>
    </li>
    <li><strong>优化 Web 服务器计算机和特定应用程序的配置文件以符合您的特定需要</strong><br />
    　　默认情况下，ASP.NET 配置被设置成启用最广泛的功能并尽量适应最常见的方案。因此，应用程序开发人员可以根据应用程序所使用的功能，优化和更改其中的某些配置，以提高应用程序的性能。下面的列表是您应该考虑的一些选项。<br />
    　　<em><font color="#ff3300">仅对需要的应用程序启用身份验证</font></em>。<br />
    　　默认情况下，身份验证模式为 Windows，或集成 NTLM。大多数情况下，对于需要身份验证的应用程序，最好在 Machine.config 文件中禁用身份验证，并在 Web.config 文件中启用身份验证。根据适当的请求和响应编码设置来配置应用程序。ASP.NET 默认编码格式为 UTF-8。如果您的应用程序为严格的 ASCII，请配置应用程序使用 ASCII 以获得稍许的性能提高。<br />
    　　<em><font color="#ff3300">考虑对应用程序禁用 AutoEventWireup</font></em>。<br />
    　　在 Machine.config 文件中将 AutoEventWireup 属性设置为 false，意味着页面不将方法名与事件进行匹配和将两者挂钩(例如 Page_Load)。如果页面开发人员要使用这些事件，需要在基类中重写这些方法(例如，需要为页面加载事件重写 Page.OnLoad，而不是使用 Page_Load 方法)。如果禁用 AutoEventWireup，页面将通过将事件连接留给页面作者而不是自动执行它，获得稍许的性能提升。<br />
    　　<em><font color="#ff3300">从请求处理管线中移除不用的模块</font></em>。<br />
    　　默认情况下，服务器计算机的 Machine.config 文件中节点的所有功能均保留为激活。根据应用程序所使用的功能，您可以从请求管线中移除不用的模块以获得稍许的性能提升。检查每个模块及其功能，并按您的需要自定义它。例如，如果您在应用程序中不使用会话状态和输出缓存，则可以从列表中移除它们，以便请求在不执行其他有意义的处理时，不必执行每个模块的进入和离开代码。</li>
    <li><strong>一定要禁用调试模式</strong><br />
    　　在部署生产应用程序或进行任何性能测量之前，始终记住禁用调试模式。如果启用了调试模式，应用程序的性能可能受到非常大的影响。</li>
    <li><strong>对于广泛依赖外部资源的应用程序，请考虑在多处理器计算机上启用网络园艺</strong><br />
    　　ASP.NET 进程模型帮助启用多处理器计算机上的可缩放性，将工作分发给多个进程(每个CPU一个)，并且每个进程都将处理器关系设置为其 CPU。此技术称为网络园艺。如果应用程序使用较慢的数据库服务器或调用具有外部依赖项的 COM 对象(这里只是提及两种可能性)，则为您的应用程序启用网络园艺是有益的。但是，在决定启用网络园艺之前，您应该测试应用程序在网络园中的执行情况。</li>
    <li><strong>只要可能，就缓存数据和页输出</strong><br />
    　　ASP.NET 提供了一些简单的机制，它们会在不需要为每个页请求动态计算页输出或数据时缓存这些页输出或数据。另外，通过设计要进行缓存的页和数据请求(特别是在站点中预期将有较大通讯量的区域)，可以优化这些页的性能。与 .NET Framework 的任何 Web 窗体功能相比，适当地使用缓存可以更好的提高站点的性能，有时这种提高是超数量级的。使用 ASP.NET 缓存机制有两点需要注意。首先，不要缓存太多项。缓存每个项均有开销，特别是在内存使用方面。不要缓存容易重新计算和很少使用的项。其次，给缓存的项分配的有效期不要太短。很快到期的项会导致缓存中不必要的周转，并且经常导致更多的代码清除和垃圾回收工作。若关心此问题，请监视与 ASP.NET Applications 性能对象关联的 Cache Total Turnover Rate 性能计数器。高周转率可能说明存在问题，特别是当项在到期前被移除时。这也称作内存压力。</li>
    <li><strong>选择适合页面或应用程序的数据查看机制</strong><br />
    　　根据您选择在 Web 窗体页显示数据的方式，在便利和性能之间常常存在着重要的权衡。例如，DataGrid Web 服务器控件可能是一种显示数据的方便快捷的方法，但就性能而言它的开销常常是最大的。在某些简单的情况下，您通过生成适当的 HTML 自己呈现数据可能很有效，但是自定义和浏览器定向会很快抵销所获得的额外功效。Repeater Web 服务器控件是便利和性能的折衷。它高效、可自定义且可编程。</li>
    <li><strong>将 SqlDataReader 类用于快速只进数据游标</strong><br />
    　　SqlDataReader 类提供了一种读取从 SQL Server 数据库检索的只进数据流的方法。如果当创建 ASP.NET 应用程序时出现允许您使用它的情况，则 SqlDataReader 类提供比 DataSet 类更高的性能。情况之所以这样，是因为 SqlDataReader 使用 SQL Server 的本机网络数据传输格式从数据库连接直接读取数据。另外，SqlDataReader 类实现 IEnumerable 接口，该接口也允许您将数据绑定到服务器控件。有关更多信息，请参见 SqlDataReader 类。有关 ASP.NET 如何访问数据的信息，请参见通过 ASP.NET 访问数据。</li>
    <li><strong>将 SQL Server 存储过程用于数据访问</strong><br />
    　　在 .NET Framework 提供的所有数据访问方法中，基于 SQL Server 的数据访问是生成高性能、可缩放 Web 应用程序的推荐选择。使用托管 SQL Server 提供程序时，可通过使用编译的存储过程而不是特殊查询获得额外的性能提高。</li>
    <li><strong>避免单线程单元 (STA) COM 组件</strong><br />
    　　默认情况下，ASP.NET 不允许任何 STA COM 组件在页面内运行。若要运行它们，必须在 .aspx 文件内将 ASPCompat=true 属性包含在 @ Page 指令中。这样就将执行用的线程池切换到 STA 线程池，而且使 HttpContext 和其他内置对象可用于 COM 对象。前者也是一种性能优化，因为它避免了将多线程单元 (MTA) 封送到 STA 线程的任何调用。使用 STA COM 组件可能大大损害性能，应尽量避免。若必须使用 STA COM 组件，如在任何 interop 方案中，则应在执行期间进行大量调用并在每次调用期间发送尽可能多的信息。另外，小心不要在构造页面期间创建任何 STA COM 组件。例如下面的代码中，在页面构造时将实例化由某个线程创建的 MySTAComponent，而该线程并不是将运行页面的 STA 线程。这可能对性能有不利影响，因为要构造页面就必须完成 MTA 和 STA 线程之间的封送处理。<br />
    <div class="quote">&lt;%@ Page Language="VB" ASPCompat="true" %&gt;<br />
    &lt;script runat=server&gt;<br />
    Dim myComp as new MySTAComponent()<br />
    Public Sub Page_Load()<br />
    myComp.Name = "Bob"<br />
    End Sub<br />
    &lt;/script&gt;<br />
    &lt;html&gt;<br />
    &lt;%<br />
    Response.Write(myComp.SayHello)<br />
    %&gt;<br />
    &lt;/html&gt;</div>
    <br />
    　　首选机制是推迟对象的创建，直到以后在 STA 线程下执行上述代码，如下面的例子所示。<br />
    <div class="quote">&lt;%@ Page Language="VB" ASPCompat="true" %&gt;<br />
    &lt;script runat=server&gt;<br />
    Dim myComp<br />
    Public Sub Page_Load()<br />
    myComp = new MySTAComponent()<br />
    myComp.Name = "Bob"<br />
    End Sub<br />
    &lt;/script&gt;<br />
    &lt;html&gt;<br />
    &lt;%<br />
    Response.Write(myComp.SayHello)<br />
    %&gt;<br />
    &lt;/html&gt;<br />
    </div>
    　　推荐的做法是在需要时或者在 Page_Load 方法中构造任何 COM 组件和外部资源。永远不要将任何 STA COM 组件存储在可以由构造它的线程以外的其他线程访问的共享资源里。这类资源包括像缓存和会话状态这样的资源。即使 STA 线程调用 STA COM 组件，也只有构造此 STA COM 组件的线程能够实际为该调用服务，而这要求封送处理对创建者线程的调用。此封送处理可能产生重大的性能损失和可伸缩性问题。在这种情况下，请研究一下使 COM 组件成为 MTA COM 组件的可能性，或者更好的办法是迁移代码以使对象成为托管对象。</li>
    <li><strong>将调用密集型的 COM 组件迁移到托管代码</strong><br />
    　　.NET Framework 提供了一个简单的方法与传统的 COM 组件进行交互。其优点是可以在保留现有投资的同时利用新的平台。但是在某些情况下，保留旧组件的性能开销使得将组件迁移到托管代码是值得的。每一情况都是不一样的，决定是否需要迁移组件的最好方法是对 Web 站点运行性能测量。建议您研究一下如何将需要大量调用以进行交互的任何COM 组件迁移到托管代码。许多情况下不可能将旧式组件迁移到托管代码，特别是在最初迁移 Web 应用程序时。在这种情况下，最大的性能障碍之一是将数据从非托管环境封送到托管环境。因此，在交互操作中，请在任何一端执行尽可能多的任务，然后进行一个大调用而不是一系列小调用。例如，公共语言运行库中的所有字符串都是 Unicode 的，所以应在调用托管代码之前将组件中的所有字符串转换成 Unicode 格式。另外，一处理完任何 COM 对象或本机资源就释放它们。这样，其他请求就能够使用它们，并且最大限度地减少了因稍后请求垃圾回收器释放它们所引起的性能问题。</li>
    <li><strong>在 Visual Basic .NET 或 JScript. 代码中使用早期绑定<br />
    </strong>　　以往，开发人员喜欢使用 Visual Basic、VBScript. 和 JScript. 的原因之一就是它们所谓&#8220;无类型&#8221;的性质。变量不需要显式类型声明，并能够简单地通过使用来创建它们。当从一个类型到另一个类型进行分配时，转换将自动执行。不过，这种便利会大大损害应用程序的性能。Visual Basic 现在通过使用 Option Strict 编译器指令来支持类型安全编程。为了向后兼容，默认情况下，ASP.NET 不启用该选项。但是，为了得到最佳性能，强烈建议在页中启用该选项。若要启用 Option Strict，请将 Strict 属性包括在 @ Page 指令中，或者，对于用户控件，请将该属性包括在 @ Control 指令中。下面的示例演示了如何设置该属性，并进行了四个变量调用以显示使用该属性是如何导致编译器错误的。<br />
    <div class="quote">&lt;%@ Page Language="VB" Strict="true" %&gt;<br />
    &lt;%<br />
    Dim B<br />
    Dim C As String<br />
    ' This will cause a compiler error.<br />
    A = "Hello"<br />
    ' This will cause a compiler error.<br />
    B = "World"<br />
    ' This will not cause a compiler error.<br />
    C = "!!!!!!"<br />
    ' But this will cause a compiler error.<br />
    C = 0<br />
    %&gt;　　Dim B<br />
    Dim C As String<br />
    ' This will cause a compiler error.<br />
    A = "Hello"<br />
    ' This will cause a compiler error.<br />
    B = "World"<br />
    ' This will not cause a compiler error.<br />
    C = "!!!!!!"<br />
    ' But this will cause a compiler error.<br />
    C = 0<br />
    %&gt;<br />
    </div>
    　　JScript.NET 也支持无类型编程，但它不提供强制早期绑定的编译器指令。若发生下面任何一种情况，则变量是晚期绑定的：被显式声明为 Object，是无类型声明的类的字段，是无显式类型声明的专用函数或方法成员，并且无法从其使用推断出类型。 　　最后一个差别比较复杂，因为如果 JScript. .NET 编译器可以根据变量的使用情况推断出类型，它就会进行优化。在下面的示例中，变量 A 是早期绑定的，但变量 B 是晚期绑定的。<br />
    <div class="quote">var A;<br />
    var B;<br />
    A = "Hello";<br />
    B = "World";<br />
    B = 0;</div>
    <br />
    　　为了获得最佳的性能，当声明 JScript. .NET 变量时，请为其分配一个类型。例如，var A : String。</li>
    <li><strong>使请求管线内的所有模块尽可能高效<br />
    </strong>　　请求管线内的所有模块在每次请求中都有机会被运行。因此，当请求进入和离开模块时快速地触发代码至关重要，特别是在不使用模块功能的代码路径里。分别在使用及不使用模块和配置文件时执行吞吐量测试，对确定这些方法的执行速度非常有用。</li>
    <li><strong>使用 HttpServerUtility.Transfer 方法在同一应用程序的页面间重定向</strong><br />
    　　采用 Server.Transfer 语法，在页面中使用该方法可避免不必要的客户端重定向。</li>
    <li><strong>必要时调整应用程序每个辅助进程的线程数</strong><br />
    　　ASP.NET 的请求结构试图在执行请求的线程数和可用资源之间达到一种平衡。已知一个使用足够 CPU 功率的应用程序，该结构将根据可用于请求的 CPU 功率，来决定允许同时执行的请求数。这项技术称作线程门控。但是在某些条件下，线程门控算法不是很有效。通过使用与 ASP.NET Applications 性能对象关联的 Pipeline Instance Count 性能计数器，可以在 PerfMon 中监视线程门控。当页面调用外部资源，如数据库访问或 XML Web services 请求时，页面请求通常停止并释放 CPU。如果某个请求正在等待被处理，并且线程池中有一个线程是自由的，那么这个正在等待的请求将开始被处理。遗憾的是，有时这可能导致 Web 服务器上存在大量同时处理的请求和许多正在等待的线程，而它们对服务器性能有不利影响。通常，如果门控因子是外部资源的响应时间，则让过多请求等待资源，对 Web 服务器的吞吐量并无帮助。为缓和这种情况，可以通过更改 Machine.config 配置文件节点的 maxWorkerThreads 和 maxIOThreads 属性，手动设置进程中的线程数限制。<br />
    　　注意：辅助线程是用来处理 ASP.NET 请求的，而 IO 线程则是用于为来自文件、数据库或 XML Web services 的数据提供服务的。分配给这些属性的值是进程中每个 CPU 每类线程的最大数目。对于双处理器计算机，最大数是设置值的两倍。对于四处理器计算机，最大值是设置值的四倍。无论如何，对于有四个或八个 CPU 的计算机，最好更改默认值。对于有一个或两个处理器的计算机，默认值就可以，但对于有更多处理器的计算机的性能，进程中有一百或两百个线程则弊大于利。注意进程中有太多线程往往会降低服务器的速度，因为额外的上下文交换导致操作系统将 CPU 周期花在维护线程而不是处理请求上。</li>
    <li><strong>适当地使用公共语言运行库的垃圾回收器和自动内存管理</strong><br />
    　　小心不要给每个请求分配过多内存，因为这样垃圾回收器将必须更频繁地进行更多的工作。另外，不要让不必要的指针指向对象，因为它们将使对象保持活动状态，并且应尽量避免含 Finalize 方法的对象，因为它们在后面会导致更多的工作。特别是在 Finalize 调用中永远不要释放资源，因为资源在被垃圾回收器回收之前可能一直消耗着内存。最后这个问题经常会对 Web 服务器环境的性能造成毁灭性的打击，因为在等待 Finalize 运行时，很容易耗尽某个特定的资源。</li>
    <li><strong>如果有大型 Web 应用程序，可考虑执行预批编译</strong><br />
    　　每当发生对目录的第一次请求时都会执行批编译。如果目录中的页面没有被分析并编译，此功能会成批分析并编译目录中的所有页面，以便更好地利用磁盘和内存。如果这需要很长时间，则将快速分析并编译单个页面，以便请求能被处理。此功能带给 ASP.NET 性能上的好处，因为它将许多页面编译为单个程序集。从已加载的程序集访问一页比每页加载新的程序集要快。批编译的缺点在于：如果服务器接收到许多对尚未编译的页面的请求，那么当 Web 服务器分析并编译它们时，性能可能较差。为解决这个问题，可以执行预批编译。为此，只需在应用程序激活之前向它请求一个页面，无论哪页均可。然后，当用户首次访问您的站点时，页面及其程序集将已被编译。没有简单的机制可以知道批编译何时发生。需一直等到 CPU 空闲或者没有更多的编译器进程(例如 csc.exe(C# 编译器)或 vbc.exe(Visual Basic 编译器))启动。还应尽量避免更改应用程序的 bin 目录中的程序集。更改页面会导致重新分析和编译该页，而替换 bin 目录中的程序集则会导致完全重新批编译该目录。在包含许多页面的大规模站点上，更好的办法可能是根据计划替换页面或程序集的频繁程度来设计不同的目录结构。不常更改的页面可以存储在同一目录中并在特定的时间进行预批编译。经常更改的页面应在它们自己的目录中(每个目录最多几百页)以便快速编译。Web 应用程序可以包含许多子目录。批编译发生在目录级，而不是应用程序级。</li>
    <li><strong>不要依赖代码中的异常</strong><br />
    　　因为异常大大地降低性能，所以您不应该将它们用作控制正常程序流程的方式。如果有可能检测到代码中可能导致异常的状态，请执行这种操作。不要在处理该状态之前捕获异常本身。常见的方案包括：检查 null，分配给将分析为数字值的 String 一个值，或在应用数学运算前检查特定值。下面的示例演示可能导致异常的代码以及测试是否存在某种状态的代码。两者产生相同的结果。<br />
    <div class="quote">try<br />
    {<br />
    　result = 100 / num;<br />
    }<br />
    catch (Exception e)<br />
    {<br />
    　result = 0;<br />
    }<br />
    // ...to this.<br />
    if (num != 0)<br />
    　result = 100 / num;<br />
    else<br />
    　result = 0;</div>
    </li>
    <li><strong>使用 HttpResponse.Write 方法进行字符串串联</strong><br />
    　　该方法提供非常有效的缓冲和连接服务。但是，如果您正在执行广泛的连接，请使用多个 Response.Write 调用。下面示例中显示的技术比用对 Response.Write 方法的单个调用连接字符串更快。<br />
    <div class="quote">Response.Write("a");<br />
    Response.Write(myString);<br />
    Response.Write("b");<br />
    Response.Write(myObj.ToString());<br />
    Response.Write("c");<br />
    Response.Write(myString2);<br />
    Response.Write("d");</div>
    </li>
    <li><strong>除非有特殊的原因要关闭缓冲，否则使其保持打开</strong><br />
    　　禁用 Web 窗体页的缓冲会导致大量的性能开销。</li>
    <li><strong>只在必要时保存服务器控件视图状态</strong><br />
    　　自动视图状态管理是服务器控件的功能，该功能使服务器控件可以在往返过程上重新填充它们的属性值(您不需要编写任何代码)。但是，因为服务器控件的视图状态在隐藏的窗体字段中往返于服务器，所以该功能确实会对性能产生影响。您应该知道在哪些情况下视图状态会有所帮助，在哪些情况下它影响页的性能。例如，如果您将服务器控件绑定到每个往返过程上的数据，则将用从数据绑定操作获得的新值替换保存的视图状态。在这种情况下，禁用视图状态可以节省处理时间。默认情况下，为所有服务器控件启用视图状态。若要禁用视图状态，请将控件的EnableViewState 属性设置为 false，如下面的 DataGrid 服务器控件示例所示。<br />
    　　&lt;asp:datagrid EnableViewState="false" datasource="..." runat="server"/&gt;<br />
    　　您还可以使用 @ Page 指令禁用整个页的视图状态。当您不从页回发到服务器时，这将十分有用：<br />
    　　&lt;%@ Page EnableViewState="false" %&gt;<br />
    　　注意:@ Control 指令中也支持 EnableViewState 属性，该指令允许您控制是否为用户控件启用视图状态。若要分析页上服务器控件使用的视图状态的数量，请(通过将 trace="true" 属性包括在 @ Page 指令中)启用该页的跟踪并查看 Control Hierarchy 表的 Viewstate 列。有关跟踪和如何启用它的信息，请参见 ASP.NET 跟踪。</li>
    <li><strong>避免到服务器的不必要的往返过程</strong><br />
    　　虽然您很可能希望尽量多地使用 Web 窗体页框架的那些节省时间和代码的功能，但在某些情况下却不宜使用 ASP.NET 服务器控件和回发事件处理。通常，只有在检索或存储数据时，您才需要启动到服务器的往返过程。多数数据操作可在这些往返过程间的客户端上进行。例如，从 HTML 窗体验证用户输入经常可在数据提交到服务器之前在客户端进行。通常，如果不需要将信息传递到服务器以将其存储在数据库中，那么您不应该编写导致往返过程的代码。如果您开发自定义服务器控件，请考虑让它们为支持 ECMAScript. 的浏览器呈现客户端代码。通过以这种方式使用服务器控件，您可以显著地减少信息被不必要的发送到 Web 服务器的次数。<br />
    　　使用 Page.IsPostBack 避免对往返过程执行不必要的处理<br />
    　　如果您编写处理服务器控件回发处理的代码，有时可能需要在首次请求页时执行其他代码，而不是当用户发送包含在该页中的 HTML 窗体时执行的代码。根据该页是否是响应服务器控件事件生成的。<br />
    　　使用 Page.IsPostBack 属性有条件地执行代码<br />
    　　例如，下面的代码演示如何创建数据库连接和命令，该命令在首次请求该页时将数据绑定到 DataGrid 服务器控件。<br />
    <div class="quote">void Page_Load(Object sender, EventArgs e)<br />
    {<br />
    // Set up a connection and command here.<br />
    if (!Page.IsPostBack)<br />
    {<br />
    　String query = "select * from Authors where FirstName like '%JUSTIN%'";<br />
    　myCommand.Fill(ds, "Authors");<br />
    　myDataGrid.DataBind();<br />
    }<br />
    }</div>
    <br />
    　　由于每次请求时都执行 Page_Load 事件，上述代码检查 IsPostBack 属性是否设置为 false。如果是，则执行代码。如果该属性设置为 true，则不执行代码。注意 如果不运行这种检查，回发页的行为将不更改。Page_Load 事件的代码在执行服务器控件事件之前执行，但只有服务器控件事件的结果才可能在输出页上呈现。如果不运行该检查，仍将为 Page_Load 事件和该页上的任何服务器控件事件执行处理。</li>
    <li><strong>当不使用会话状态时禁用它</strong><br />
    　　并不是所有的应用程序或页都需要针对于具体用户的会话状态，您应该对任何不需要会话状态的应用程序或页禁用会话状态。 　　若要禁用页的会话状态，请将 @ Page 指令中的 EnableSessionState 属性设置为 false。例如:<br />
    　　&lt;%@ Page EnableSessi %&gt;<br />
    　　注意:如果页需要访问会话变量，但不打算创建或修改它们，则将@ Page 指令中的 EnableSessionState 属性设置为ReadOnly。还可以禁用 XML Web services 方法的会话状态。有关更多信息，请参见使用 ASP.NET 和 XML Web services 客户端创建的 XML Web services。若要禁用应用程序的会话状态，请在应用程序 Web.config 文件的 sessionstate 配置节中将 mode 属性设置为 off。例如:<br />
    　　&lt;sessionstate mode="off" /&gt;</li>
    <li><strong>仔细选择会话状态提供程序</strong><br />
    　　ASP.NET 为存储应用程序的会话数据提供了三种不同的方法：进程内会话状态、作为 Windows 服务的进程外会话状态和 SQL Server 数据库中的进程外会话状态。每种方法都有自己的优点，但进程内会话状态是迄今为止速度最快的解决方案。如果只在会话状态中存储少量易失数据，则建议您使用进程内提供程序。进程外解决方案主要用于跨多个处理器或多个计算机缩放应用程序，或者用于服务器或进程重新启动时不能丢失数据的情况。有关更多信息，请参见 ASP.NET 状态管理。</li>
    <li><strong>不使用不必要的Server Control</strong><br />
    　　ASP.net中，大量的服务器端控件方便了程序开发，但也可能带来性能的损失，因为用户每操作一次服务器端控件，就产生一次与服务器端的往返过程。因此，非必要，应当少使用Server Control。</li>
    <li><strong>ASP.NET应用程序性能测试</strong><br />
    　　在对ASP.NET应用程序进行性能测试之前，应确保应用程序没有错误，而且功能正确。具体的性能测试可以采用以下工具进行：Web Application Strees Tool (WAS)是Microsoft发布的一个免费测试工具，可以从<a title="" href="http://webtool.rte.microsoft.com/" target="_blank">http://webtool.rte.microsoft.com/</a>上下载。它可以模拟成百上千个用户同时对web应用程序进行访问请求，在服务器上形成流量负载，从而达到测试的目的，可以生成平均TTFB、平均TTLB等性能汇总报告。 Application Center Test (ACT) 是一个测试工具，附带于Visual Studio.NET的企业版中，是Microsoft正式支持的web应用程序测试工具。它能够直观地生成图表结果，功能比WAS多，但不具备多个客户机同时测试的能力。服务器操作系统"管理工具"中的"性能"计数器，可以对服务器进行监测以了解应用程序性能。</li>
</ol>
<p>　　<strong>结论</strong>：<br />
　　对于网站开发人员来说，在编写ASP.NET应用程序时注意性能问题，养成良好的习惯，提高应用程序性能，至少可以推迟必需的硬件升级，降低网站的成本。</p>
 <img src ="http://www.cnblogs.com/9who/aggbug/1271585.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42958/" target="_blank">[新闻]资本寒冬侵袭中国视频网站 营销春天或不远</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>网易娱乐频道也在用风讯CMS</title><link>http://www.cnblogs.com/9who/archive/2008/08/14/1267714.html</link><dc:creator>9who</dc:creator><author>9who</author><pubDate>Thu, 14 Aug 2008 04:10:00 GMT</pubDate><guid>http://www.cnblogs.com/9who/archive/2008/08/14/1267714.html</guid><wfw:comment>http://www.cnblogs.com/9who/comments/1267714.html</wfw:comment><comments>http://www.cnblogs.com/9who/archive/2008/08/14/1267714.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/9who/comments/commentRss/1267714.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/9who/services/trackbacks/1267714.html</trackback:ping><description><![CDATA[<p>最近在做一个cms，参考了风讯.net cms ，发现<font face="Verdana">网易娱乐频道也在用风讯CMS</font></p>
<p>大家打开下列链接看看：<br />
<a href="http://ent.163.com/08/0710/05/4GFGDSJU00032DGD.html" target="_blank">http://ent.163.com/08/0710/05/4GFGDSJU00032DGD.html</a><br />
打开一看：<br />
<img class="lightbox" style="oldpaddingtop: ; oldbordertopwidth: ; oldpaddingbottom: ; oldborderbottomwidth: ; oldpaddingright: ; oldborderrightwidth: ; oldpaddingleft: ; oldborderleftwidth: " alt="" src="http://www.youxia.org/upload/2008/7/200807131523012762.gif" /><br />
用过风讯的都晓得吧？呵呵。<br />
其实风讯CMS很好用的，上手容易、入门快，自己最喜欢的CMS之一。 </p>
<p class="cloudreamHelperLink" style="display: none" codetype="post" entryid="671">这个没有网易的人吧，呵呵</p>
<p class="cloudreamHelperLink" style="display: none" codetype="post" entryid="671">转载网络</p>
<script src="http://www.youxia.org/PLUGIN/copytofriends/copy.js" type="text/javascript"></script>
 <img src ="http://www.cnblogs.com/9who/aggbug/1267714.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42957/" target="_blank">[新闻]金融风暴波及全球创业板 中国概念股难独善其身</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>CSS基本布局16例</title><link>http://www.cnblogs.com/9who/archive/2008/08/11/1265351.html</link><dc:creator>9who</dc:creator><author>9who</author><pubDate>Mon, 11 Aug 2008 08:44:00 GMT</pubDate><guid>http://www.cnblogs.com/9who/archive/2008/08/11/1265351.html</guid><wfw:comment>http://www.cnblogs.com/9who/comments/1265351.html</wfw:comment><comments>http://www.cnblogs.com/9who/archive/2008/08/11/1265351.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/9who/comments/commentRss/1265351.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/9who/services/trackbacks/1265351.html</trackback:ping><description><![CDATA[<p>这段时间是一直在学习 div+css布局，感觉这段挺实用的，转了过来，</p>
<p>以下布局资料原作者：<a href="http://www.thenoodleincident.com/tutorials/box_lesson/boxes.html" target="new"><font color="#60a179">Owen Briggs</font></a></p>
<h4>单行单列</h4>
<ul>
    <li><a title="链接到单行单列" href="http://www.w3cn.org/article/layout/2004/csslayout/onebox.html" target="new" rel="next"><img height="50" alt="单行单列" src="http://www.w3cn.org/article/layout/2004/csslayout/images/1box.gif" width="50" /><font color="#60a179"> 单行单列1</font></a>：采用float浮在左上角，固定宽度。</li>
    <li><a title="链接到单行单列" href="http://www.w3cn.org/article/layout/2004/csslayout/onebox_absolute.html" target="new" rel="next"><img height="50" alt="单行单列" src="http://www.w3cn.org/article/layout/2004/csslayout/images/1box.gif" width="50" /><font color="#60a179"> 单行单列2</font></a>：固定在左上角，固定宽度，采用的是绝对(absolute)定位。</li>
    <li><a title="链接到单行单列" href="http://www.w3cn.org/article/layout/2004/csslayout/onebox_fluid.html" target="new" rel="next"><img height="50" alt="单行单列" src="http://www.w3cn.org/article/layout/2004/csslayout/images/1box.gif" width="50" /><font color="#60a179"> 单行单列3</font></a>：固定在左上角，不固定宽度，采用百分比(%)定义宽度来自适应页面。</li>
    <li><a title="链接到单行单列" href="http://www.w3cn.org/article/layout/2004/csslayout/onebox_centent.html" target="new" rel="next"><img height="50" alt="单行单列" src="http://www.w3cn.org/article/layout/2004/csslayout/images/1box_centered.gif" width="50" /><font color="#60a179"> 单行单列4</font></a>(推荐)：固定宽度，采用在body样式中定义居中属性(text-align: center;)实现适应页面自动居中。 </li>
</ul>
<h4>单行两列</h4>
<ul>
    <li><a title="链接到单行两列" href="http://www.w3cn.org/article/layout/2004/csslayout/twobox.html" target="new" rel="next"><img height="50" alt="单行两列" src="http://www.w3cn.org/article/layout/2004/csslayout/images/2box.gif" width="50" /><font color="#60a179"> 单行两列1</font></a>：两列都固定宽度。第一列浮在左上角，第二列浮在第一列右边。</li>
    <li><a title="链接到单行两列" href="http://www.w3cn.org/article/layout/2004/csslayout/twobox_fluid.html" target="new" rel="next"><img height="50" alt="单行两列" src="http://www.w3cn.org/article/layout/2004/csslayout/images/2box.gif" width="50" /><font color="#60a179"> 单行两列2</font></a>：两列都百分比宽度，但不满屏。第一列固定在左上角，第二列浮在第一列右边。</li>
    <li><a title="链接到单行两列" href="http://www.w3cn.org/article/layout/2004/csslayout/twobox_touch.html" target="new" rel="next"><img height="50" alt="单行两列" src="http://www.w3cn.org/article/layout/2004/csslayout/images/2box_split.gif" width="50" /><font color="#60a179"> 单行两列3</font></a>：两列都百分比宽度，满屏。两列都采用绝对定位。</li>
    <li><a title="链接到单行两列" href="http://www.w3cn.org/article/layout/2004/csslayout/twobox_touch2.html" target="new" rel="next"><img height="50" alt="单行两列" src="http://www.w3cn.org/article/layout/2004/csslayout/images/2box_split.gif" width="50" /><font color="#60a179"> 单行两列4</font></a>：两列都百分比宽度，满屏。第一列浮在左上角，第二列浮在右上角。</li>
    <li><a title="链接到单行两列" href="http://www.w3cn.org/article/layout/2004/csslayout/twobox_touch3.html" target="new" rel="next"><img height="50" alt="单行两列" src="http://www.w3cn.org/article/layout/2004/csslayout/images/2box_split.gif" width="50" /><font color="#60a179"> 单行两列5</font></a>：两列都百分比宽度，满屏。第一列浮在左上角，第二列浮在第一列右边。 </li>
</ul>
<h4>单行三列</h4>
<ul>
    <li><a title="链接到单行三列" href="http://www.w3cn.org/article/layout/2004/csslayout/threebox.html" target="new" rel="next"><img height="50" alt="单行三列" src="http://www.w3cn.org/article/layout/2004/csslayout/images/3column.gif" width="50" /><font color="#60a179"> 单行三列1</font></a>：左右列都绝对定位(右列定位在右上)。左列和右列固定宽度，中间列自适应页面。</li>
    <li><a title="链接到单行三列" href="http://www.w3cn.org/article/layout/2004/csslayout/threebox2.html" target="new" rel="next"><img height="50" alt="单行三列" src="http://www.w3cn.org/article/layout/2004/csslayout/images/3column.gif" width="50" /><font color="#60a179"> 单行三列2</font></a>：左列定位在左上，右列定位在右上，中间列浮在左列右面。左列和右列固定宽度，中间列自适应页面。</li>
    <li><a title="链接到单行三列" href="http://www.w3cn.org/article/layout/2004/csslayout/threebox3.html" target="new" rel="next"><img height="50" alt="单行三列" src="http://www.w3cn.org/article/layout/2004/csslayout/images/3column.gif" width="50" /><font color="#60a179"> 单行三列3</font></a>：三列都绝对定位。左列和右列固定宽度，中间列根据内容自适应。</li>
    <li><a title="链接到单行三列" href="http://www.w3cn.org/article/layout/2004/csslayout/threebox4.html" target="new" rel="next"><img height="50" alt="单行三列" src="http://www.w3cn.org/article/layout/2004/csslayout/images/3column.gif" width="50" /><font color="#60a179"> 单行三列4</font></a>(推荐)：类似样式2，只是将margin: 20px属性增加在body样式中，解决了中间列在Netscape6.0中置顶的问题。</li>
    <li><a title="链接到单行三列" href="http://www.w3cn.org/article/layout/2004/csslayout/threebox_touch.html" target="new" rel="next"><img height="50" alt="单行三列" src="http://www.w3cn.org/article/layout/2004/csslayout/images/3column_touche.gif" width="50" /><font color="#60a179"> 单行三列5</font></a>：左右列绝对定位，中间列自适应。宽度满屏。 </li>
</ul>
<h4>顶行三列</h4>
<ul>
    <li><a title="链接到顶行三列" href="http://www.w3cn.org/article/layout/2004/csslayout/fourbox.html" target="new" rel="next"><img height="50" alt="顶行三列" src="http://www.w3cn.org/article/layout/2004/csslayout/images/3columnplusbox.gif" width="50" /><font color="#60a179"> 顶行三列1</font></a>(推荐)：顶行自适应页面宽度。左右列绝对定位，中间列自适应页面。</li>
    <li><a title="链接到顶行三列" href="http://www.w3cn.org/article/layout/2004/csslayout/fourbox_touch.html" target="new" rel="next"><img height="50" alt="顶行三列" src="http://www.w3cn.org/article/layout/2004/csslayout/images/3columnplusbox_toucha.gif" width="50" /><font color="#60a179"> 顶行三列2</font></a>：宽度满屏 <br class="clearer" />
    </li>
</ul>
<img src ="http://www.cnblogs.com/9who/aggbug/1265351.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42956/" target="_blank">[新闻]携程范敏：CEO从接发传真做起</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>CSS命名规范(建议版) </title><link>http://www.cnblogs.com/9who/archive/2008/08/11/1265314.html</link><dc:creator>9who</dc:creator><author>9who</author><pubDate>Mon, 11 Aug 2008 08:10:00 GMT</pubDate><guid>http://www.cnblogs.com/9who/archive/2008/08/11/1265314.html</guid><wfw:comment>http://www.cnblogs.com/9who/comments/1265314.html</wfw:comment><comments>http://www.cnblogs.com/9who/archive/2008/08/11/1265314.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/9who/comments/commentRss/1265314.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/9who/services/trackbacks/1265314.html</trackback:ping><description><![CDATA[<div class="postBody"><span style="font-size: 10pt; color: #000080">非原创，来源网络。感谢原作者奉献如此精彩文章。原文地址：</span> <a href="http://bbs.blueidea.com/thread-2856346-1-1.html">http://bbs.blueidea.com/thread-2856346-1-1.html</a><br />
<br />
容&nbsp; &nbsp; 器：container/box <br />
头&nbsp; &nbsp; 部：header <br />
主 导 航：mainNav <br />
子 导 航：subNav <br />
顶 导 航：topNav <br />
网站标志：logo <br />
大 广 告：banner <br />
页面中部：mainBody <br />
底&nbsp; &nbsp; 部：footer <br />
菜&nbsp; &nbsp; 单：menu <br />
菜单内容：menuContent <br />
子 菜 单：subMenu <br />
子菜单内容：subMenuContent <br />
搜&nbsp; &nbsp; 索：search <br />
搜索关键字：keyword <br />
搜索范围：range <br />
标签文字：tagTitle <br />
标签内容：tagContent <br />
当前标签：tagCurrent/currentTag <br />
标　&nbsp;&nbsp;题：title <br />
内&nbsp; &nbsp; 容：content <br />
列&nbsp; &nbsp; 表：list <br />
当前位置：currentPath <br />
侧 边 栏：sidebar <br />
图&nbsp; &nbsp; 标：icon <br />
注&nbsp; &nbsp; 释：note <br />
登&nbsp; &nbsp; 录：login <br />
注&nbsp; &nbsp; 册：register <br />
列 定 义：column_1of3 (三列中的第一列)<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;column_2of3 (三列中的第二列)<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;column_3of3 (三列中的第三列)<br />
<br />
外　套：　　wrap<br />
主导航：　　mainnav<br />
子导航：　　subnav<br />
页　脚：　　footer<br />
整个页面：　content<br />
页　眉：　　header<br />
页　脚：　　footer<br />
商　标：　　label<br />
标　题：　　title<br />
主导航：　　mainbav（globalnav）<br />
顶导航：　　topnav<br />
边导航：　　sidebar<br />
左导航：　　leftsidebar<br />
右导航：　　rightsidebar<br />
旗　志：　　logo<br />
标　语：　　banner<br />
菜单内容1： menu1 content<br />
菜单容量：　menu container<br />
子菜单：　　submenu<br />
边导航图标：sidebarIcon<br />
注释：　　　note<br />
面包屑：　　breadcrumb(即页面所处位置导航提示）<br />
容器：　　　container<br />
内容：　　　content<br />
搜索：　　　search<br />
登陆：　　　Login<br />
功能区：　　shop(如购物车，收银台)<br />
当前的　　　current<br />
<br />
2.另外在编辑样式表时可用的注释可这样写：<br />
&lt;-- Footer --&gt;<br />
内容区<br />
&lt;-- End Footer --&gt;<br />
<br />
3.样式文件命名<br />
主要的 master.css<br />
布局，版面 layout.css<br />
专栏 columns.css<br />
文字 font.css<br />
打印样式 print.css<br />
主题 themes.css <br />
</div>
<img src ="http://www.cnblogs.com/9who/aggbug/1265314.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42956/" target="_blank">[新闻]携程范敏：CEO从接发传真做起</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>web布局最实用的12条css技巧 </title><link>http://www.cnblogs.com/9who/archive/2008/08/11/1265300.html</link><dc:creator>9who</dc:creator><author>9who</author><pubDate>Mon, 11 Aug 2008 07:54:00 GMT</pubDate><guid>http://www.cnblogs.com/9who/archive/2008/08/11/1265300.html</guid><wfw:comment>http://www.cnblogs.com/9who/comments/1265300.html</wfw:comment><comments>http://www.cnblogs.com/9who/archive/2008/08/11/1265300.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/9who/comments/commentRss/1265300.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/9who/services/trackbacks/1265300.html</trackback:ping><description><![CDATA[<h4>1：Rounded corners without images</h4>
<h5>效果图——</h5>
<div class="floatMPic"><a title="web标准设计" href="http://justinyoung.cnblogs.com/" target="_blank"><img alt="web标准设计" src="http://images.cnblogs.com/cnblogs_com/justinyoung/2008_1q/csstrick01.gif" /></a><br />
Rounded corners without images</div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; margin: 15px auto; border-left: #cccccc 1px solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #800000">&lt;div&nbsp;id=&#8221;container&#8221;&gt;<br />
&lt;b&nbsp;class=&#8221;rtop&#8221;&gt;<br />
&lt;b&nbsp;class=&#8221;r1&#8243;&gt;&lt;/b&gt;&nbsp;&lt;b&nbsp;class=&#8221;r2&#8243;&gt;&lt;/b&gt;&nbsp;&lt;b&nbsp;class=&#8221;r3&#8243;&gt;&lt;/b&gt;&nbsp;&lt;b&nbsp;class=&#8221;r4&#8243;&gt;&lt;/b&gt;<br />
&lt;/b&gt;<br />
&lt;!&#8211;content&nbsp;goes&nbsp;here&nbsp;&#8211;&gt;<br />
&lt;b&nbsp;class=&#8221;rbottom&#8221;&gt;<br />
&lt;b&nbsp;class=&#8221;r4&#8243;&gt;&lt;/b&gt;&nbsp;&lt;b&nbsp;class=&#8221;r3&#8243;&gt;&lt;/b&gt;&nbsp;&lt;b&nbsp;class=&#8221;r2&#8243;&gt;&lt;/b&gt;&nbsp;&lt;b&nbsp;class=&#8221;r1&#8243;&gt;&lt;/b&gt;<br />
&lt;/b&gt;<br />
&lt;/div&gt;<br />
<br />
.rtop,&nbsp;.rbottom</span><span style="color: #000000">{</span><span style="color: #ff0000">display</span><span style="color: #000000">:</span><span style="color: #0000ff">block</span><span style="color: #000000">}</span><span style="color: #800000"><br />
.rtop&nbsp;*,&nbsp;.rbottom&nbsp;*</span><span style="color: #000000">{</span><span style="color: #ff0000">display</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;block</span><span style="color: #000000">;</span><span style="color: #ff0000">&nbsp;height</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;1px</span><span style="color: #000000">;</span><span style="color: #ff0000">&nbsp;overflow</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;hidden</span><span style="color: #000000">}</span><span style="color: #800000"><br />
.r1</span><span style="color: #000000">{</span><span style="color: #ff0000">margin</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;0&nbsp;5px</span><span style="color: #000000">}</span><span style="color: #800000"><br />
.r2</span><span style="color: #000000">{</span><span style="color: #ff0000">margin</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;0&nbsp;3px</span><span style="color: #000000">}</span><span style="color: #800000"><br />
.r3</span><span style="color: #000000">{</span><span style="color: #ff0000">margin</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;0&nbsp;2px</span><span style="color: #000000">}</span><span style="color: #800000"><br />
.r4</span><span style="color: #000000">{</span><span style="color: #ff0000">margin</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;0&nbsp;1px</span><span style="color: #000000">;</span><span style="color: #ff0000">&nbsp;height</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;2px</span><span style="color: #000000">}</span><span style="color: #800000">&nbsp;<br />
</span></div>
<h4>2：Style your order list</h4>
<div class="floatRPic">
<h5>效果图——</h5>
<a title="web标准设计" href="http://justinyoung.cnblogs.com/" target="_blank"><img alt="web标准设计" src="http://images.cnblogs.com/cnblogs_com/justinyoung/2008_1q/csstrick02.gif" /></a><br />
Style your order list</div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; margin-bottom: 15px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 400px; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"  ?><span style="color: #800000">&lt;ol&gt;<br />
&lt;li&gt;<br />
&lt;p&gt;This&nbsp;is&nbsp;line&nbsp;one&lt;/p&gt;<br />
&lt;/li&gt;<br />
&lt;li&gt;<br />
&lt;p&gt;Here&nbsp;is&nbsp;line&nbsp;two&lt;/p&gt;<br />
&lt;/li&gt;<br />
&lt;li&gt;<br />
&lt;p&gt;And&nbsp;last&nbsp;line&lt;/p&gt;<br />
&lt;/li&gt;<br />
&lt;/ol&gt;<br />
<br />
ol&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
font</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;italic&nbsp;1em&nbsp;Georgia,&nbsp;Times,&nbsp;serif</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
color</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;#999999</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
ol&nbsp;p&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
font</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;normal&nbsp;.8em&nbsp;Arial,&nbsp;Helvetica,&nbsp;sans-serif</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
color</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;#000000</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000">&nbsp;</span></div>
<h4>3：Tableless forms</h4>
<h5>效果图——</h5>
<div class="floatMPic"><a title="web标准设计" href="http://justinyoung.cnblogs.com/" target="_blank"><img alt="web标准设计" src="http://images.cnblogs.com/cnblogs_com/justinyoung/2008_1q/csstrick03.gif" /></a><br />
Tableless forms</div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; margin: 15px auto; border-left: #cccccc 1px solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"  ?><span style="color: #800000">&lt;form&gt;<br />
&lt;label&nbsp;for=&#8221;name&#8221;&gt;Name&lt;/label&gt;<br />
&lt;input&nbsp;id=&#8221;name&#8221;&nbsp;name=&#8221;name&#8221;&gt;&lt;br&gt;<br />
&lt;label&nbsp;for=&#8221;address&#8221;&gt;Address&lt;/label&gt;<br />
&lt;input&nbsp;id=&#8221;address&#8221;&nbsp;name=&#8221;address&#8221;&gt;&lt;br&gt;<br />
&lt;label&nbsp;for=&#8221;city&#8221;&gt;City&lt;/label&gt;<br />
&lt;input&nbsp;id=&#8221;city&#8221;&nbsp;name=&#8221;city&#8221;&gt;&lt;br&gt;<br />
&lt;/form&gt;<br />
<br />
label,input&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
display</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;block</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
width</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;150px</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
float</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;left</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
margin-bottom</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;10px</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
<br />
label&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
text-align</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;right</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
width</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;75px</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
padding-right</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;20px</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
<br />
br&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
clear</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;left</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000">&nbsp;</span></div>
<h4>4：Double blockquote</h4>
<h5>效果图——</h5>
<div class="floatMPic"><a title="web标准设计" href="http://justinyoung.cnblogs.com/" target="_blank"><img alt="web标准设计" src="http://images.cnblogs.com/cnblogs_com/justinyoung/2008_1q/csstrick04.gif" /></a><br />
Double blockquote</div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; margin: 15px auto; border-left: #cccccc 1px solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"  ?><span style="color: #800000">blockquote:first-letter&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
background</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;url(images/open-quote.gif)&nbsp;no-repeat&nbsp;left&nbsp;top</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
padding-left</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;18px</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
font</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;italic&nbsp;1.4em&nbsp;Georgia,&nbsp;&#8220;Times&nbsp;New&nbsp;Roman&#8221;,&nbsp;Times,&nbsp;serif</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000">&nbsp;</span></div>
<h4>5：Gradient text effect</h4>
<h5>效果图——</h5>
<div class="floatMPic"><a title="web标准设计" href="http://justinyoung.cnblogs.com/" target="_blank"><img alt="web标准设计" src="http://images.cnblogs.com/cnblogs_com/justinyoung/2008_1q/csstrick05.gif" /></a><br />
Double blockquote</div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; margin: 15px auto; border-left: #cccccc 1px solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"  ?><span style="color: #800000">&lt;h1&gt;&lt;span&gt;&lt;/span&gt;CSS&nbsp;Gradient&nbsp;Text&lt;/h1&gt;<br />
<br />
h1&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
font</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;bold&nbsp;330%/100%&nbsp;&#8220;Lucida&nbsp;Grande&#8221;</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
position</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;relative</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
color</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;#464646</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
h1&nbsp;span&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
background</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;url(gradient.png)&nbsp;repeat-x</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
position</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;absolute</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
display</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;block</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
width</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;100%</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
height</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;31px</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
<br />
&lt;!&#8211;[if&nbsp;lt&nbsp;IE&nbsp;7]&gt;<br />
&lt;style&gt;<br />
h1&nbsp;span&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
background</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;none</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
filter</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;progid:DXImageTransform.Microsoft.AlphaImageLoader(src=&#8217;gradient.png&#8217;,&nbsp;sizingMethod=&#8217;scale&#8217;)</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
&lt;/style&gt;</span></div>
<h4>6：Vertical centering with line-height</h4>
<h5>效果图——</h5>
<div class="floatMPic"><a title="web标准设计" href="http://justinyoung.cnblogs.com/" target="_blank"><img alt="web标准设计" src="http://images.cnblogs.com/cnblogs_com/justinyoung/2008_1q/csstrick06.gif" /></a><br />
Vertical centering with line-height</div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; margin: 15px auto; border-left: #cccccc 1px solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"  ?><span style="color: #800000">div</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
height</span><span style="color: #000000">:</span><span style="color: #0000ff">100px</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
div&nbsp;*</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
margin</span><span style="color: #000000">:</span><span style="color: #0000ff">0</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
div&nbsp;p</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
line-height</span><span style="color: #000000">:</span><span style="color: #0000ff">100px</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
&lt;p&gt;Content&nbsp;here&lt;/p&gt;&nbsp;</span></div>
<h4>7：Rounded corners with images</h4>
<h5>效果图——</h5>
<div class="floatMPic"><a title="web标准设计" href="http://justinyoung.cnblogs.com/" target="_blank"><img alt="web标准设计" src="http://images.cnblogs.com/cnblogs_com/justinyoung/2008_1q/csstrick07.gif" /></a><br />
Rounded corners with images</div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; margin: 15px auto; border-left: #cccccc 1px solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"  ?><span style="color: #800000">&lt;div&nbsp;class=&#8221;roundcont&#8221;&gt;<br />
&lt;div&nbsp;class=&#8221;roundtop&#8221;&gt;<br />
&lt;img&nbsp;src=&#8221;tl.gif&#8221;&nbsp;alt=&#8221;"<br />
width=&#8221;15&#8243;&nbsp;height=&#8221;15&#8243;&nbsp;class=&#8221;corner&#8221;<br />
style=&#8221;display:&nbsp;none&#8221;&nbsp;/&gt;<br />
&lt;/div&gt;<br />
<br />
CONTENT<br />
<br />
&lt;div&nbsp;class=&#8221;roundbottom&#8221;&gt;<br />
&lt;img&nbsp;src=&#8221;bl.gif&#8221;&nbsp;alt=&#8221;"<br />
width=&#8221;15&#8243;&nbsp;height=&#8221;15&#8243;&nbsp;class=&#8221;corner&#8221;<br />
style=&#8221;display:&nbsp;none&#8221;&nbsp;/&gt;<br />
&lt;/div&gt;<br />
&lt;/div&gt;<br />
<br />
.roundcont&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
width</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;250px</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
background-color</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;#f90</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
color</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;#fff</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
<br />
.roundcont&nbsp;p&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
margin</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;0&nbsp;10px</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
<br />
.roundtop&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
background</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;url(tr.gif)&nbsp;no-repeat&nbsp;top&nbsp;right</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
<br />
.roundbottom&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
background</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;url(br.gif)&nbsp;no-repeat&nbsp;top&nbsp;right</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
<br />
img.corner&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
width</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;15px</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
height</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;15px</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
border</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;none</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
display</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;block&nbsp;!important</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span></div>
<h4>8：Multiple class name</h4>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; margin: 15px auto; border-left: #cccccc 1px solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"  ?><span style="color: #800000">&lt;img&nbsp;src="image.gif"&nbsp;class="class1&nbsp;class2"&nbsp;alt=""&nbsp;/&gt;<br />
<br />
.class1&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000">&nbsp;border</span><span style="color: #000000">:</span><span style="color: #0000ff">2px&nbsp;solid&nbsp;#666</span><span style="color: #000000">;</span><span style="color: #ff0000">&nbsp;</span><span style="color: #000000">}</span><span style="color: #800000"><br />
.class2&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
padding</span><span style="color: #000000">:</span><span style="color: #0000ff">2px</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
background</span><span style="color: #000000">:</span><span style="color: #0000ff">#ff0</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000">&nbsp;</span></div>
<h4>9：Center horizontally</h4>
<h5>效果图——</h5>
<div class="floatMPic"><a title="web标准设计" href="http://justinyoung.cnblogs.com/" target="_blank"><img alt="web标准设计" src="http://images.cnblogs.com/cnblogs_com/justinyoung/2008_1q/csstrick09.gif" /></a><br />
Center horizontally</div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; margin: 15px auto; border-left: #cccccc 1px solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"  ?><span style="color: #800000">&lt;div&nbsp;id=&#8221;container&#8221;&gt;&lt;/div&gt;<br />
#container&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
margin</span><span style="color: #000000">:</span><span style="color: #0000ff">0px&nbsp;auto</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000">&nbsp;<br />
</span></div>
<h4>10：CSS Drop Caps</h4>
<h5>效果图——</h5>
<div class="floatMPic"><a title="web标准设计" href="http://justinyoung.cnblogs.com/" target="_blank"><img alt="web标准设计" src="http://images.cnblogs.com/cnblogs_com/justinyoung/2008_1q/csstrick10.gif" /></a><br />
CSS Drop Caps</div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; margin: 15px auto; border-left: #cccccc 1px solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"  ?><span style="color: #800000">&lt;p&nbsp;class=&#8221;introduction&#8221;&gt;&nbsp;This&nbsp;paragraph&nbsp;has&nbsp;the&nbsp;class&nbsp;&#8220;introduction&#8221;.&nbsp;If&nbsp;your&nbsp;browser&nbsp;supports&nbsp;the&nbsp;pseudo-class&nbsp;&#8220;first-letter&#8221;,&nbsp;the&nbsp;first&nbsp;letter&nbsp;will&nbsp;be&nbsp;a&nbsp;drop-cap.&nbsp;&lt;/p&gt;<br />
<br />
p.introduction:first-letter&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
font-size&nbsp;</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;300%</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
font-weight&nbsp;</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;bold</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
float&nbsp;</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;left</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
width&nbsp;</span><span style="color: #000000">:</span><span style="color: #0000ff">&nbsp;1em</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000">&nbsp;</span></div>
<h4>11：Prevent line breaks in links, oversized content to brake</h4>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; margin: 15px auto; border-left: #cccccc 1px solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"  ?><span style="color: #800000">a</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
white-space</span><span style="color: #000000">:</span><span style="color: #0000ff">nowrap</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
<br />
#main</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
overflow</span><span style="color: #000000">:</span><span style="color: #0000ff">hidden</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span></div>
<h4>12：Show firefox scrollbar, remove textarea scrollbar in IE</h4>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; margin: 15px auto; border-left: #cccccc 1px solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"  ?><span style="color: #800000">html</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
overflow</span><span style="color: #000000">:</span><span style="color: #0000ff">-moz-scrollbars-vertical</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
<br />
textarea</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
overflow</span><span style="color: #000000">:</span><span style="color: #0000ff">auto</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000">&nbsp;</span></div>
<img src ="http://www.cnblogs.com/9who/aggbug/1265300.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42956/" target="_blank">[新闻]携程范敏：CEO从接发传真做起</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>SQL2005数据库转换到SQL2000</title><link>http://www.cnblogs.com/9who/archive/2008/08/11/1264911.html</link><dc:creator>9who</dc:creator><author>9who</author><pubDate>Mon, 11 Aug 2008 01:50:00 GMT</pubDate><guid>http://www.cnblogs.com/9who/archive/2008/08/11/1264911.html</guid><wfw:comment>http://www.cnblogs.com/9who/comments/1264911.html</wfw:comment><comments>http://www.cnblogs.com/9who/archive/2008/08/11/1264911.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/9who/comments/commentRss/1264911.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/9who/services/trackbacks/1264911.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最近做了个项目，采用了sql2005做的，但我的空间数据库库只提供sql2000的，于是就想了转到sql2000，可不可以？</p>
<p>具体猜想的过程就是在sql2005中生成sql2000的sql 脚本，然后在sql2000中新建目标库，在sql 2000查询分析器中，执行生成的脚本。</p>
<p>这样数据库我们就生成成功了，下一步就是把sql2005的数据导出到sql2000中，同样在sql2005选择目标数据库，右击任务我们选择要导出到sql2000库即可。</p>
<p>大体思想就是这样，我在网上搜了一下有人写了这方面的文章，不写了，下面引用了下来：</p>
<p style="background-color: yellow">直接restore或附加应该是不行的, 用脚本+导数据肯定没有问题。<br />
<br />
2005转到2000的步骤<br />
1. 生成for 2000版本的数据库脚本<br />
2005 的manger studio<br />
-- 打开"对象资源管理器"(没有的话按F8), 连接到你的实例<br />
-- 右键要转到2000的库<br />
-- 任务<br />
-- 生成脚本<br />
-- 在"脚本向导"的"选择数据库"中, 确定选择的是要转到2000的库<br />
-- 勾选"为所选数据库中的所有对象编写脚本"<br />
-- 在接下来的"选择脚本选项"中, 找到"为服务器版本编写脚本"项, 选择"SQL Server 2000"<br />
-- 其他选项根据需要设置<br />
-- 最后把脚本保存到一个 .sql 脚本文件<br />
<br />
2. 在2000中创建目标数据库<br />
在查询分析器(或2005的manger studio在打开脚本文件), 连接到SQL Server 2000,执行上面生成的脚本.以创建一个新的数据库<br />
<br />
3. 将数据从2005导到2000<br />
2005 的manger studio<br />
-- 打开"对象资源管理器"(没有的话按F8), 连接到你的实例<br />
-- 右键要转到2000的库<br />
-- 任务<br />
-- 导出数据<br />
-- 在"SQL Server 导入和导出向导"的"选择数据源"步骤中, 确定选择的是要导出的数据库<br />
-- 在"选择目标"步骤中, 连接到 2000, 并选择步骤2新建的库<br />
-- 在"选择源表和源视图"中, 选择所有的表<br />
-- 最后完成</p>
 <img src ="http://www.cnblogs.com/9who/aggbug/1264911.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42956/" target="_blank">[新闻]携程范敏：CEO从接发传真做起</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>我的几个.NET编程习惯</title><link>http://www.cnblogs.com/9who/archive/2008/08/08/1263395.html</link><dc:creator>9who</dc:creator><author>9who</author><pubDate>Fri, 08 Aug 2008 00:53:00 GMT</pubDate><guid>http://www.cnblogs.com/9who/archive/2008/08/08/1263395.html</guid><wfw:comment>http://www.cnblogs.com/9who/comments/1263395.html</wfw:comment><comments>http://www.cnblogs.com/9who/archive/2008/08/08/1263395.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/9who/comments/commentRss/1263395.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/9who/services/trackbacks/1263395.html</trackback:ping><description><![CDATA[<p>类：</p>
<p>1、类属性的命名以单词第一个字母大写开始，类的私有变量以下划线加单词第一个字母小写开始。这样的话我们在方法中传递参数的时候，参数变量就可以命名成以单词第一个字母小写开始，调用的时候很容易明白其含义，而且不会和类的私有成员冲突。</p>
<p>2、&nbsp;除了控件的命名，变量命名的方法不再使用匈牙利命名法，而为变量使用一个更具有代表意义的名字。控件变量前适当的加入小写缩写可以有效的区分控件的类型。</p>
<p>3、&nbsp;所有的类、方法和属性都做了XML注释。这种注释可以在类或方法等声明的前一行输入&#8220;///&#8221;自动生成注释格式，做类库程序的时候可以通过类库属性，生成里选择&#8220;XML 文档文件&#8221;，为项目指定输出XML注释的文档路径，并且利用 Sandcastle 为类库生成文档。</p>
<p>4、&nbsp;尽量将一些常用的功能模块封装成类，并做成不同的类库，生成XML注释稳当，生成CHM格式的文档。这样下次用的时候就不必到处找这个模块了，只要引用相应的程序集就好了，而且.NET IDE 在你调用类库中的类时还能为你读取XML注释，实在忘记了还能看看 CHM 文档。日积月累这些DLL将成为你一笔很大的财富。</p>
<p>&nbsp;这点可以参照我收集的类库 ：<a href="http://www.cnblogs.com/9who/category/103884.html">点击 访问</a></p>
<p>执行效率：</p>
<p>&nbsp;1、for 和 foreach 我更喜欢for。用 foreach 编写的代码块反编译成IL后会发现其中加入了try块，而且很容易看出来效率要比for稍低。</p>
<p>2、&nbsp;不再使用&#8220;+&#8221; 号来连接多个字符串，而是采用 StringBuilder 的 Append 方法，这样会提高效率。关于这个问题读者可以参考一下与.NET 装相相关的文章。</p>
<p>3.虽然 DataSet 很好用，但是我不喜欢用 DataSet。ADO.NET 隐藏了一个令人讨厌的秘密：这个了不起的新技术对所有的分布式应用程序都不适用。DataSet 很大，用的不好可能会导致系统变慢，而且很容易产生并发冲突。能用DataReader 就不用DataSet。</p>
<p><span style="color: red"><span style="color: red"><span style="color: #339966">在这里说一下 DataSet和DataReader 区别</span></span></span></p>
<p><span style="color: red"><span style="color: red"><span style="color: #339966"><span style="color: #339966"><span style="color: #339966">使用 &nbsp; SqlDataReader &nbsp; 获得快进只读数据游标：&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp; SqlDataReader &nbsp; 对象对从 &nbsp; SQL &nbsp; 数据库中检索的数据提供前进只读游标。 &nbsp; <br />
&nbsp; 如果 &nbsp; SqlDataReader &nbsp; 适合于您的情况，则它是一个比 &nbsp; DataSet &nbsp; 更好的选择。 &nbsp; <br />
&nbsp; 因为 &nbsp; SqlDataReader &nbsp; 支持 &nbsp; IEnumerable &nbsp; 接口，甚至还可以绑定服务器控件。</span></span></span></span></span></p>
<p><span style="color: red"><span style="color: red"><span style="color: #339966">DataSet是一次把数据全取出来放在内存中,&nbsp;&nbsp; DataReader只能一次次地读取数据, &nbsp; 方便读取少量数据时使用。</span></span></span></p>
<p><span style="color: red"><span style="color: red"><span style="color: #000000">4.对需要释放资源的类要实现 IDispose 接口，并使用 using 语句块来访问资源，这样的话有利于垃圾回收。</span></span></span></p>
<p><span style="color: red"><span style="color: red"><span style="color: #000000">我喜欢用DataReader,不喜欢将访问数据库类的方法都写成静态的。虽然适当的使用静态方法能够提高程序的运行效率，但是为了避免忘记关闭数据库带来的不必要的麻烦，我还是选择了实现IDispose接口并使用using 块访问数据库的方法。</span></span></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.cnblogs.com/9who/aggbug/1263395.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42955/" target="_blank">[新闻]2008年10月13日科技博客精选</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>SQL2005示例数据库|AdventureWorks下载安装|NORTHWND下载安装|PUBS下载安装</title><link>http://www.cnblogs.com/9who/archive/2008/08/07/1262580.html</link><dc:creator>9who</dc:creator><author>9who</author><pubDate>Thu, 07 Aug 2008 01:24:00 GMT</pubDate><guid>http://www.cnblogs.com/9who/archive/2008/08/07/1262580.html</guid><wfw:comment>http://www.cnblogs.com/9who/comments/1262580.html</wfw:comment><comments>http://www.cnblogs.com/9who/archive/2008/08/07/1262580.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/9who/comments/commentRss/1262580.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/9who/services/trackbacks/1262580.html</trackback:ping><description><![CDATA[<p>sql2005数据库实例 从网上找还得麻烦，转了过来，点击就可以下载！</p>
<p>在学习SQL2005中离开不了<a title="SQL2005示例数据库" href="http://www.cngothic.com/20080226/sql-2005-adventureworks-northwind-pubs.html">SQL2005示例数据库</a>，<a title="AdventureWorks数据库下载" href="http://www.cngothic.com/old_file/SQL-2005-datebase.rar">AdventureWorks数据库下载</a>安装，，<a title="northwind数据库下载" href="http://www.cngothic.com/old_file/SQL-2005-datebase.rar">northwind数据库下载安装</a>，，<a title="PUBS数据库下载" href="http://www.cngothic.com/old_file/SQL-2005-datebase.rar">PUBS数据库下载</a>安装。微软上的AdventureWorks,northwind,PUBS三库下载地址难找且又是E言文今天上传方便使用。<br />
下载完SQL 2005示例库。解压后里面有两个文件夹 AdventureWorks 与 northwind</p>
<p><strong>AdventureWorks数据库 安装使用方法：</strong></p>
<p>在AdventureWorks文件夹下面有文件 AdventureWorksDB.msi。双击安装。<br />
后打把此数据库附加到数据SQL 2005内。AdventureWorksDB.dbf的位置为：<br />
C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\AdventureWorks_Data.mdf<br />
我的 SQL 2005 安装在C:\Program Files\（即安装SQL 2005的默认安装路径）<br />
到此步 AdventureWorks 安装完成。</p>
<p><strong>northwind数据库，PUBS数据库 安装使用方法：</strong></p>
<p>在northwind文件夹下面有文件 SQL2000SampleDb.msi。双击安装。<br />
默认安装路径为：C:\SQL Server 2000 Sample Databases<br />
里面包括 northwind数据库，PUBS数据库 与 northwind数据库，PUBS数据库 的SQL脚本文件<br />
运行查询或附加数据库任选。Cngothic 采用附加的方法。把两库附加到SQL中。<br />
到此结束。</p>
<img src ="http://www.cnblogs.com/9who/aggbug/1262580.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42954/" target="_blank">[新闻]Google Android手机大受欢迎,已经订出150万台</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>(转）Ext与.NET超完美整合 .NET开发者的超级优势</title><link>http://www.cnblogs.com/9who/archive/2008/08/06/1262279.html</link><dc:creator>9who</dc:creator><author>9who</author><pubDate>Wed, 06 Aug 2008 09:51:00 GMT</pubDate><guid>http://www.cnblogs.com/9who/archive/2008/08/06/1262279.html</guid><wfw:comment>http://www.cnblogs.com/9who/comments/1262279.html</wfw:comment><comments>http://www.cnblogs.com/9who/archive/2008/08/06/1262279.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/9who/comments/commentRss/1262279.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/9who/services/trackbacks/1262279.html</trackback:ping><description><![CDATA[<p>回顾学习EXT的过程，自己一直从事.NET快速开发（不喜欢JAVA平台比较乱的Jar包，版本控制力太差）。EXT虽然是纯UI东东，但似乎跟JAVA一直有着亲蜜的关系，找的所有成型点的例子中，跟JAVA的居多，用WebService和ASP的都非常不适用，Ext的界面设计非常方便，但通信起来，只有用JSON或XML等中间件来传递，存在解译成本和传递成本，WebService即要花N多安全功夫，效率也很低，加上用LINQ镜像延时，用.net来做EXT实在很痛苦，跟ASPX淘汰的刷新机制无太大差别。<font color="#ff6600">今天我就是来解放大家的</font></p>
<p>我喜欢EXT，终于想到了一个超完美的整合</p>
<p>1。VS2008支持JS单步调试，可设断点调试JS，（不用代码提示，可以提高自己的熟练度，自己看看要不要在VS2008里面加代码提示的JS文件吧）</p>
<p>2。母版将所有JS调用全定义好</p>
<p>&lt;%@ Master Language="C#" AutoEventWireup="true" CodeFile="Ext2Empty.master.cs" Inherits="tmksoft.Web.Ext2Empty" %&gt;<br />
&lt;html&gt;<br />
&lt;head runat="server"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;TMKSOFT CRM V2.0&lt;/title&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var BaseUrl = "&lt;%=BaseUrl%&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/script&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;link rel="stylesheet" type="text/css" href="../Javascript/ext/resources/css/ext-all.css" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript" src="&lt;%=BaseUrl%&gt;Javascript/ext/adapter/ext/ext-base.js"&gt;&lt;/script&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript" src="&lt;%=BaseUrl%&gt;Javascript/ext/ext-all.js"&gt;&lt;/script&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript" src="&lt;%=BaseUrl%&gt;Javascript/ext/build/locale/ext-lang-zh_CN.js"&gt;&lt;/script&gt;<br />
&lt;%--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ext.util.CSS.swapStyleSheet("theme", "&lt;%=BaseUrl%&gt;App_Themes/slate/css/skin.css");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/script&gt;--%&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;form id="form1" runat="server"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;div&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:ContentPlaceHolder id="ContentMainWorkSpace" runat="server"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/asp:ContentPlaceHolder&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/div&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>3。所有网页继承母版，后台类直接写C#方法即可，爱怎么写就怎么样。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ajax类的通信取代,如下代码</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [Ajax.AjaxMethod(HttpSessionStateRequirement.ReadWrite)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public bool UserCheck(string name,string pass)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (name.Equals("aa") &amp;&amp; pass.Equals("aa"))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session["Uname"] = name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session["Upass"] = pass;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>4。前台JS-AJAX直接调用服务器方法</p>
<p>//现在只需直接调用类.方法，就行了，<font color="#ff0000">效率测试非常不错，页面无刷新，所见即所得，太爽了吧！！</font></p>
<p><font color="#ff0000">&nbsp;&nbsp;&nbsp; var login = function(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var c=Login.UserCheck(document.getElementById('Uname').value,document.getElementById('Upass').value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(c.value==true)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert('通过');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert('不通过');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var ck=Login.SessionCheck();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ck.value){alert('已登陆')}else{alert('未登陆');}</font></p>
<p><font color="#339966">//原来的EXT实现很麻烦，需要按下面的步骤来</font></p>
<p><font color="#339966">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 执行当前表单面板的submit<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.form.submit({<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 动作发生期间显示的文本信息<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; waitMsg : '正在登录......',<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // submit发生时指向的地址<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url : 'http://localhost:2020/Service1.asmx/UserLogin',<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 表单提交方式<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method : 'POST',<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 数据验证通过时发生的动作<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; success : function(form, action){<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; window.location.href = 'index.htm';<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 反之......<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; failure : function(form, action){<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reset();<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (action.failureType == Ext.form.Action.SERVER_INVALID)<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ext.MessageBox.alert('警告', action.result.errors.msg);<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });</font></p>
<p><font color="#0000ff">EXT超完美整合终于完成了，只须3分钟你就能快速用Xtype画出界面（因为有代码提示和单步调试），只须3分钟你就能快速完成数据库增删查改的代码（因为微软C#帮我们做了太多），只须3分钟你就能把前台和后台联结起来（即是独立的UI-JS界面，又是独立的业务逻辑层。</font></p>
<p>&nbsp;</p>
<p><font face="Verdana">http://hi.baidu.com/tmk_xj/blog/item/f73e1a101c1883f9c3ce79a1.html</font></p>
<img src ="http://www.cnblogs.com/9who/aggbug/1262279.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42953/" target="_blank">[新闻]13个大文件