<?xml version="1.0" encoding="gb2312" ?>
<rss version="2.0">
  <channel>
    <title>千一网络</title>
    <link>http://www.cftea.com/</link>
    <description>网页技术 永无止境</description>

    <item>
      <title><![CDATA[Too many characters in character literal]]></title>
      <link>http://www.cftea.com/c/2008/10/FTGEJ83299M06I5O.asp</link>
      <description><![CDATA[<P>在<A href="http://www.cftea.com/c/2008/03/M907V1BJCLZT192M.asp" target=_blank>声明式数据绑定</A>中，用到如下一句代码：</P>
<DIV class=code>&lt;ItemTemplate&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;asp:DropDownList runat="server"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataSourceID="GradesDataSource"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataTextField="GradeName" DataValueField="GradeValue"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SelectedValue="&lt;%# Eval('SsoType')%&gt;" Enabled="false"&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/asp:DropDownList&gt;<BR>&lt;/ItemTemplate&gt;</DIV>
<P>出现 <SPAN class=caution>Too many characters in character literal</SPAN> 错误。</P>
<P>原来，在 ItemTemplate 中，使用 &lt;%# %&gt; 时应该将单引号写在外面，而在其它模板（比如：InsertItemTemplate、EditItemTemplate）则不存在此问题。所以我们这里还是建议统一将单引号写在外面，如下：</P>
<DIV class=code>SelectedValue='&lt;%# Eval("SsoType")%&gt;'</DIV>
<P>这样，不论它处于哪个模板都是正确的。</P>]]></description>
      <pubDate>2008-10-9</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[判断文件存在时注意权限]]></title>
      <link>http://www.cftea.com/c/2008/10/JU6W3GOFOGS3Y2SW.asp</link>
      <description><![CDATA[<P>在利用 fso.FolderExists 判断文件夹是否存在时，结果返回 false，可是文件夹明明是存在的，最终找到原因，是由于没有 NTFS 权限。</P>
<P><SPAN class=chapterTitle>相关阅读</SPAN></P>
<UL>
<LI><A href="http://www.cftea.com/c/2006/09/JEY78SF5WTOMZABQ.asp" target=_blank>FSO 速查</A></LI></UL>]]></description>
      <pubDate>2008-10-9</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[谷歌市值明日或跌破千亿 创始人身价跌破百亿]]></title>
      <link>http://www.cftea.com/c/2008/10/KLFNI920V7LOCHT0.asp</link>
      <description><![CDATA[<P>谷歌(Google)股价周二跌幅超过6%，这也是该股价自2006年初以来首次跌破350美元大关。分析人士称，若按照这一趋势，谷歌市值在周三(美国当地时间)的交易中很有可能跃破1000亿美元，谷歌两位创始人拉里·佩奇(Larry Page)和塞吉·布林(Sergey Brin)的个人资产也可能将跌破100亿美元，进而重回“10亿美元俱乐部”。 </P>
<P>2007年11月7日，谷歌股价攀升至747.24美元的历史最高点。当时不少分析师认为，谷歌股价突破1000美元大关只是时间早晚的事情。一些科技博客当时甚至预测，谷歌股价今后有可能突破2000美元大关。然而在目前美国经济恶化大环境前提下，看好股价增长前景的分析师已不再唱出这种高调。 </P>
<P>在谷歌股价创下其历史新高之时，该公司当时市值已将近2500亿美元。时至今日，谷歌市值已经滑落至1000亿美元边缘，仅为1080亿美元。如果谷歌股价周三再度下跌，则该公司市值很有可能跃破1000亿美元大关。 </P>
<P>过去数天中，苹果市值也在大幅缩水。今年8月份时，苹果市值仍超过1500亿美元，然而目前已跌至790亿美元。考虑到苹果目前仍持有超过200亿美元的现金，苹果当前市值水平真令人难以置信。 </P>
<P>在谷歌股价跃破350美元之后，意味着该公司两位创始人佩奇和布林的个人资产也即将分别跌破100亿美元，进而重回“10亿美元俱乐部”。今年3月份时，谷歌股价为450美元左右，当时两人个人资产均为130亿美元。在谷歌股价创下其历史新高之时，佩奇和布林的个人资产曾分别高达200亿美元。 </P>
<P>此外，由于股价近期大跌，谷歌目前已经让出硅谷最有价值公司的宝座，即该位置目前已经被网络设备制造商思科抢走。周二谷歌股价下跌25.20美元，跌幅6.79%，报收346.01美元；过去52周中，谷歌最高股价为747.24美元，最低为345.37美元。(编译/中涛) </P>]]></description>
      <pubDate>2008-10-9</pubDate>
      <author><![CDATA[]]></author>
    </item>

    <item>
      <title><![CDATA[Clustered Index Scan 与 Clustered Index Seek]]></title>
      <link>http://www.cftea.com/c/2008/10/AGUE91RW5D28NKLQ.asp</link>
      <description><![CDATA[<P>在利用 SQL Server 查询分析器的执行计划中，会有许多扫描方式，其中就有 Clustered Index Scan 与 Clustered Index Seek，这二者有什么区别呢？</P>
<P>Clustered Index，为&lt;聚集索引&gt;，表示它们使用的都是聚集索引扫描。</P>
<P>Scan 表示它扫描一个范围或者是全部内容，Seek 表示扫描特定范围内的行。也就是说 Scan 并不知道要目标行是哪些，而 Seek 扫描表明我已经知道我要找的目标行是哪些，所以 Seek 一般要快些。</P>
<P>看看下面的语句，哪个（些）是 Scan 扫描，哪些是 Seek 扫描呢？</P>
<DIV class=code>use master<BR>go<BR>select * from sysobjects<BR>select * from sysobjects where name like 'sys%'<BR>select * from sysobjects where id&lt;3</DIV>
<P>由于 sysobjects 表是对 id 建的聚集索引，所以前两个查询语句使用的是 Scan，后面一个使用的是 Seek。</P>
<P align=center><IMG alt=ScanAndSeek src="http://www.cftea.com/c/2008/10/AGUE91RW5D28NKLQ/JETY5MD2R8DTI70F.png" border=0><BR>Clustered Index Scan 与 Clustered Index Seek 的图标</P>]]></description>
      <pubDate>2008-10-9</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[如何取 DataView 中各行各列的值]]></title>
      <link>http://www.cftea.com/c/2008/10/N5C8S9OIEELZHV69.asp</link>
      <description><![CDATA[<DIV class=code>DataView dv = ...;<BR>object value = dv.Table.Rows[i][j];</DIV>
<P>Rows 类型为 DataRowCollection。</P>
<P>Rows[i] 返回 DataRow 类型，表示第 i 个数据行。</P>
<P>Rows[i][j] 返回 object 类型，表示第 i 个数据行的第 j 数据列的值。</P>]]></description>
      <pubDate>2008-10-9</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[甲骨文与 SAP 侵权诉讼庭外和解谈判失败]]></title>
      <link>http://www.cftea.com/c/2008/10/ZTFJZCIKC6CBL5IW.asp</link>
      <description><![CDATA[<P>SAP发言人今日表示，甲骨文与SAP于本周一就TomorrowNow侵权案进行了庭外和解谈判，但是双方未能达成和解协议。 </P>
<P>她表示，这次不公开的和解谈判是在旧金山美国地方法院进行的。她没有透露更详细的资料。甲骨文发言人则没有回复记者的电话。 </P>
<P>据周五发布的联合调查声明称，甲骨文最近取得了SAP首席执行官Henning Kagermann和联席首席执行官Leo Apotheker的笔录，但是它还需盘问包括前总裁Shai Agassi在内的其他高管。 </P>
<P>据声明称，SAP为甲骨文提供了容量达9TB的文件资料供其调查。但是双方仍在为哪些文件与该案有关以及甲骨文应如何使用那些文件而争论不休。 </P>
<P>甲骨文去年对SAP提出起诉，指控其TomorrowNow子公司的员工非法下载甲骨文的补丁和其他材料并利用它们挖走了甲骨文的客户。 </P>
<P>双方未能达成和解协议也是情理之中的事，因为SAP似乎很想取得和解，但是甲骨文一直不愿和解，并在7月份扩大诉讼，指控SAP高管涉嫌包庇。因为他们在收购那家公司时就已经知道了那种非法的业务模式。 </P>
<P>SAP公司已经承认，负责People Soft和JD Edwards软件客户支持的Tomorrow Now员工不恰当地下载了甲骨文公司的某些文件。但它对甲骨文提出的其他指控予以了否认。 </P>
<P>SAP在7月份宣布，如果它不能为TomorrowNow找到买家，它就会关闭这部分业务。 </P>
<P>双方计划在周五召开一次调查讨论会，然后在10月20日与地方法院一起召开一次电话会议。目前该案的庭审日期定在2010年2月。 </P>
<P>SAP和甲骨文均在各自网站发布了与该案有关的文件。（编译/林靖东）</P>]]></description>
      <pubDate>2008-10-8</pubDate>
      <author><![CDATA[]]></author>
    </item>

    <item>
      <title><![CDATA[IIS 性能的一些笔记]]></title>
      <link>http://www.cftea.com/c/2008/10/GRIK9LFVIKLBDFTH.asp</link>
      <description><![CDATA[<P>以前记的一些笔记，有点老，供大家参考一下。</P>
<P>单个 IIS 4.0 服务器支持大约 250 个 Web 站点。</P>
<P>单个 IIS 5.0 服务器可运行数千个 Web 站点。</P>
<P>预计负载等于每秒对单个服务器的预计请求数，并受内容类型的限制。</P>
<P>在站点不多（&lt;1000）的情况下，CPU 数据决定性能高低，随着站点数增加，性能将与 CPU 数量和可用内存密切相关，当 CPU 容量与可用内存数量不匹配时，性能就会降低。</P>
<P>大多数硬件配置可以提供 5000 个 Web 站点（小站），并每天处理超过 1,700 万个请求（4CPU、4G 内存可处理 3080-4620 万个请求）。这里每 100 个请求约含 1.2MB 数据。</P>
<P>IIS 5.0 每秒钟至少输出 5MB 数据。</P>
<P>IIS 5.0 的带宽限制只对静态 HTML 文件有效，对动态 ASP 文件或其它类型动态内容无效。</P>
<P>静态文件缓存设置不当会影响性能。</P>]]></description>
      <pubDate>2008-10-8</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[SQL Server 应用程序角色简介]]></title>
      <link>http://www.cftea.com/c/2008/10/SCXS4D0AIOZ7UXQF.asp</link>
      <description><![CDATA[<UL>
<LI><A href="http://www.cftea.com/c/2008/10/IMS64SF0J1JECSU2.asp">SQL Server 固定服务器角色简介</A></LI>
<LI><A href="http://www.cftea.com/c/2008/10/2W84FK40EUV7KCO4.asp">SQL Server 固定数据库角色简介</A></LI>
<LI>SQL Server 应用程序角色简介</LI></UL>
<HR class=serializationEnd>

<P>用户通过应用程序连接到数据库，然后，应用程序执行 sp_setapprole 存储过程向 SQL Server 表明其身份，如果应用程序的角色名和密码有效，将激活应用程序角色，此时分配给该用户的所有权限被除去，并采用应用程序的安全上下文，应用程序角色一旦激活，便不能被信用，用户重新获得其原始安全上下文的唯一方法是断开连接，然后再连接到 SQL Server，应用程序角色在两种身份验证模式下都可工作。</P>
<P><SPAN class=chapterTitle>相关阅读</SPAN></P>
<UL>
<LI>请参见 MSDN 上的 <A href="http://msdn.microsoft.com/zh-cn/library/ms188908.aspx" target=_blank>sp_setapprole (Transact-SQL)</A></LI></UL>]]></description>
      <pubDate>2008-10-8</pubDate>
      <author><![CDATA[]]></author>
    </item>

    <item>
      <title><![CDATA[SQL Server 固定数据库角色简介]]></title>
      <link>http://www.cftea.com/c/2008/10/2W84FK40EUV7KCO4.asp</link>
      <description><![CDATA[<UL>
<LI><A href="http://www.cftea.com/c/2008/10/IMS64SF0J1JECSU2.asp">SQL Server 固定服务器角色简介</A></LI>
<LI>SQL Server 固定数据库角色简介</LI>
<LI><A href="http://www.cftea.com/c/2008/10/SCXS4D0AIOZ7UXQF.asp">SQL Server 应用程序角色简介</A></LI></UL>
<HR class=serializationEnd>

<P><SPAN class=key>db_owner</SPAN> 执行数据库中所有维护和配置活动。</P>
<P><SPAN class=key>db_accessadmin</SPAN> 添加或删除 Windows 用户、组和 SQL Server 登录访问权限。</P>
<P><SPAN class=key>db_datareader</SPAN> 读取用户表中所有数据。</P>
<P><SPAN class=key>db_datawriter</SPAN> 添加、删除或更改用户表中所有数据。</P>
<P><SPAN class=key>db_ddladmin</SPAN> 在数据库中运行任何数据定义语言（DDL）命令。</P>
<P><SPAN class=key>db_securityadmin</SPAN> 修改角色成员身份并管理权限。</P>
<P><SPAN class=key>db_backupoperator</SPAN> 备份数据库。</P>
<P><SPAN class=key>db_denydatareader</SPAN> 无法读取数据库用户表中任何数据。</P>
<P><SPAN class=key>db_denydatawriter</SPAN> 无法添加、删除或更改用户表中任何数据。</P>]]></description>
      <pubDate>2008-10-8</pubDate>
      <author><![CDATA[]]></author>
    </item>

    <item>
      <title><![CDATA[SQL Server 固定服务器角色简介]]></title>
      <link>http://www.cftea.com/c/2008/10/IMS64SF0J1JECSU2.asp</link>
      <description><![CDATA[<UL>
<LI>SQL Server 固定服务器角色简介</LI>
<LI><A href="http://www.cftea.com/c/2008/10/2W84FK40EUV7KCO4.asp">SQL Server 固定数据库角色简介</A></LI>
<LI><A href="http://www.cftea.com/c/2008/10/SCXS4D0AIOZ7UXQF.asp">SQL Server 应用程序角色简介</A></LI></UL>
<HR class=serializationEnd>

<P><SPAN class=key>sysadmin</SPAN> 执行 SQL Server 任何活动。</P>
<P><SPAN class=key>serveradmin</SPAN> 配置服务器范围内配置选项及关闭服务器。</P>
<P><SPAN class=key>setupadmin</SPAN> 添加删除链接服务器及执行某些系统存储过程。</P>
<P><SPAN class=key>securityadmin</SPAN> 管理服务器范围内安全设置（包括链接服务器）以及 create database 权限，重置 SQL Server 身份验证登录的密码。</P>
<P><SPAN class=key>processadmin</SPAN> 终止在 SQL Server 上运行的进程。</P>
<P><SPAN class=key>dbcreator</SPAN> 创建、改变、除去或还原任何数据库。</P>
<P><SPAN class=key>diskadmin</SPAN> 管理磁盘文件。</P>
<P><SPAN class=key>bulkadmin</SPAN> 允许非 sysadmin 用户运行 bulkadmin 语句。</P>
<P><SPAN class=chapterTitle>相关阅读</SPAN></P>
<UL>
<LI><A href="http://www.cftea.com/c/2007/01/B4E0G9LPS74DD92J.asp" target=_blank>除去和添加 Windows 登录的数据库用户</A></LI></UL>]]></description>
      <pubDate>2008-10-8</pubDate>
      <author><![CDATA[]]></author>
    </item>

    <item>
      <title><![CDATA[FTP 能否像虚拟主机样通过主机头来建立多个站点]]></title>
      <link>http://www.cftea.com/c/2008/10/ELU7HDMM5U13S7K1.asp</link>
      <description><![CDATA[<P><SPAN class=itemTitle>问：</SPAN>FTP 能否像虚拟主机样通过主机头来建立多个站点？</P>
<P><SPAN class=itemTitle>答：</SPAN>不能，FTP 中无主机头概念。</P>]]></description>
      <pubDate>2008-10-8</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[JS 中的 for in]]></title>
      <link>http://www.cftea.com/c/2008/10/IL2W8N9B6LHMG7IE.asp</link>
      <description><![CDATA[<P>VBScript 中有 for each item in obj，JS 中也类似：</P>
<DIV class=code>&lt;script type="text/javascript"&gt;<BR>&lt;!--<BR>var e;<BR>for (e in document)<BR>{<BR>&nbsp;&nbsp;&nbsp; alert(e);<BR>}<BR>--&gt;<BR>&lt;/script&gt;</DIV>]]></description>
      <pubDate>2008-10-8</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[T-SQL 如何转换日期为需要的字符串]]></title>
      <link>http://www.cftea.com/c/2008/10/J57SLKMTWMSK7EKB.asp</link>
      <description><![CDATA[<DIV class=code>declare @dt datetime<BR>select @dt = getdate()<BR>select convert(varchar(8), @dt, 112)</DIV>
<P>上述代码输出的格式为：yyyymmdd。</P>
<P>如果需要输出为其它格式，只需要改变 convert 的第三个参数的值，具体数值对应的格式请参考 SQL Server 联机丛书。</P>]]></description>
      <pubDate>2008-10-7</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[status 与 state 的区别]]></title>
      <link>http://www.cftea.com/c/2008/10/FV2BP0R0JZO0J8I1.asp</link>
      <description><![CDATA[<P><SPAN class=key>status</SPAN> 指人时暗指相对的地位，指物时相当于 situation。</P>
<P><SPAN class=key>state</SPAN> 人或物存在或所处的状态，和 condition 大体上可以互换使用。</P>
<P>situation 较狭义地指由环境综合决定的特定时间上的状态或情形。</P>
<P>condition 指一定的原因/条件或环境所产生的特定情况。</P>
<P><SPAN class=itemTitle>以 Recordset 为例</SPAN></P>
<P>Recordset 具有 Status 和 State 属性，说明二者还是有区别的。</P>
<P><SPAN class=key>Recordset.Status</SPAN> 表示进行批处理后，当前记录的情况。结果有：操作被取消，结果未被保存；记录被锁无法保存……。</P>
<P><SPAN class=key>Recordset.State</SPAN> 表示 Recordset 对象是打开的，还是关闭的，还是正在执行异步操作。</P>
<P><SPAN class=itemTitle>再举例子</SPAN></P>
<P>最近的国际形式如何？status。</P>
<P>水在标准大气压下 100 摄氏度时是什么状态？state。</P>]]></description>
      <pubDate>2008-10-7</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[搜索引擎 Ask.com 改版 搜索速度质量双双提升]]></title>
      <link>http://www.cftea.com/c/2008/10/ITNFWYNG09Q63KO5.asp</link>
      <description><![CDATA[<P>Ask.com于周一对其搜索引擎进行了改版，试图与谷歌争夺市场份额。 </P>
<P>Ask.com总裁Scott Garrell表示，公司已加强了ask网站的搜索功能，优化搜索结果，使引擎搜索速度更快且搜索结果的布局更简洁。Garrell称：“此次改版是Ask.com为用户提供的最好的一次升级服务。Ask.com希望通过此次改版来提高搜索速度和质量，为用户提供更便捷的搜索服务。” </P>
<P>Garrell称，通常用户在使用各搜索引擎时会在搜索结果中点击3到4次以获得所需结果。如果Ask.com能够做到直接显示出用户所需要的页面，那么Ask.com的用户数量就会激增。 </P>
<P>据Ask.com介绍，改版后的搜索引擎不但可以有效提高从各网站提取数据的能力，同时还将包含娱乐、就业和健康等更广泛的数据资源，以及更加丰富的图片、新闻和视频等结果类型。 </P>
<P>此外，新改版的Ask.com还将恢复此前曾被取消的一项自然语义搜索服务功能，另外还对网络上大量的问答网站进行了索引，包括雅虎问答等等。 </P>
<P>Ask.com曾名为Ask Jeeves，是上世纪90年代中末期搜索引擎市场的主导者，早在谷歌之前就已有所作为。然而在此后的几年中，Ask Jeeves将目标从消费搜索引擎转移到了为企业市场提供搜索和软件服务上，但并未获得成功。2003年，Ask Jeeves放弃了这一战略计划，继续回到消费搜索引擎市场，并立誓要收复失地。 </P>
<P>在此之后，Ask.com不断定期进行搜索引擎更新及技术改进，但其在美国搜索市场的份额一直动荡不定，近年来一直维持在4%至7%之间，与谷歌的市场占有率相差甚远。 </P>
<P>据市场调研公司comScore提供的数据显示，今年8月份，谷歌在美国搜索市场的份额已占到63%，而Ask.com仅为4.8%，位列第四。（编译/刘梦帆） </P>]]></description>
      <pubDate>2008-10-7</pubDate>
      <author><![CDATA[]]></author>
    </item>

    <item>
      <title><![CDATA[(local)、127.0.0.1 等方式连接 SQL Server 区别]]></title>
      <link>http://www.cftea.com/c/2008/10/WQNZI4X4AIUFNYCO.asp</link>
      <description><![CDATA[<P>连接 SQL Server 时，指定服务器可以有多种形式：</P>
<UL>
<LI>回送地址（127.0.0.1）</LI>
<LI>localhost</LI>
<LI>计算机 IP</LI>
<LI>域名</LI>
<LI>计算机名</LI>
<LI>(local)</LI>
<LI>.</LI></UL>
<P>回送地址（127.0.0.1）与 localhost 等效，因为在 hosts 文件中指定 localhost 指向 127.0.0.1。使用的是 TCP/IP 连接。</P>
<P>计算机 IP 与域名等效（除非域名指向的不是计算机 IP，而是回送地址等其它）。使用的是 TCP/IP 连接。</P>
<P>计算机名，这种访问容易受限制，比如有时跨网段就不行，一般没用。使用命名管理连接。</P>
<P>(local) 和 . 应该是等效的，至少就目前来看，我没有发现什么区别。使用命名管道连接。</P>
<UL>
<LI>TCP/IP 连接对于慢速网络效果好，需要 1433 端口开放才能连接。</LI>
<LI>命名管道连接功能更强，易于使用，提供配置选项。</LI></UL>
<P><SPAN class=chapterTitle>相关阅读</SPAN></P>
<UL>
<LI><A href="http://www.cftea.com/c/2006/12/I0LZ15156Y818S2U.asp" target=_blank>两类连接字符串</A></LI>
<LI><A href="http://www.cftea.com/c/560.asp" target=_blank>ODBC ADO ADO OLEDB 数据库连接方式区别</A></LI></UL>]]></description>
      <pubDate>2008-10-6</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[SQL 不等于符号]]></title>
      <link>http://www.cftea.com/c/2008/10/SDQTS5ANYWO0LZQ3.asp</link>
      <description><![CDATA[<P>在 T-SQL 中：</P>
<UL>
<LI>&lt;&gt; 和 != 均表示不等于。</LI>
<LI>!&lt; 表示不小于。</LI>
<LI>!&gt; 表示不大于。</LI></UL>
<P>上述中，只有 &lt;&gt; 是 SQL-92 标准。</P>]]></description>
      <pubDate>2008-10-6</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[IIS 中 ASP.NET 配置解释（三）]]></title>
      <link>http://www.cftea.com/c/2008/10/H0OGFHOGNJKTTHKK.asp</link>
      <description><![CDATA[<UL>
<LI><A href="http://www.cftea.com/c/2008/10/JO75DFDN31MWK1G7.asp">IIS 中 ASP.NET 配置解释（一）</A></LI>
<LI><A href="http://www.cftea.com/c/2008/10/HS18GDXVYWOVF7VC.asp">IIS 中 ASP.NET 配置解释（二）</A></LI>
<LI>IIS 中 ASP.NET 配置解释（三）</LI></UL>
<HR class=serializationEnd>

<P align=center><A href="http://www.cftea.com/c/2008/10/H0OGFHOGNJKTTHKK/WLGB730YORVWK8EV.png" target=_blank><IMG alt="IIS 中 ASP.NET 配置解释（应用程序）" src="http://www.cftea.com/c/2008/10/H0OGFHOGNJKTTHKK/WLGB730YORVWK8EV.png" width=500 border=0></A></P>
<P>“公共编译、页和运行时设置”编辑 compilation、pages 等节。页主题即 theme，页主体即 materPage，请参见<A href="http://www.cftea.com/c/2007/11/TVJFRUI1MH7IYFP8.asp" target=_blank>主题和皮肤</A>。“启用调试”会增加开销，一般在服务器上不设置为“启用调试”。全球化设置编辑 globalization 节，一般不需修改。关于“标识设置”请参见<A href="http://www.cftea.com/c/2008/02/135XCQU54BEPXOEQ.asp" target=_blank>正确配置虚拟主机中 ASP.NET 权限</A>，由于在 machine.config 设置了不允许重写，所以图中显示为“锁定”。</P>
<P align=center><A href="http://www.cftea.com/c/2008/10/H0OGFHOGNJKTTHKK/279457N0MIVBX2YU.png" target=_blank><IMG alt="IIS 中 ASP.NET 配置解释（状态管理）" src="http://www.cftea.com/c/2008/10/H0OGFHOGNJKTTHKK/279457N0MIVBX2YU.png" width=500 border=0></A></P>
<P>会话状态设置编辑 sessionState 节。会话状态模式有 Off、InProc、StateServer、SQLServer。如果选择 StateServer，则还需要设置“状态服务器设置”，以表明如何连接状态服务器；如果选择 SQLServer，则还需要设置“SQL Server 设置”，以表明如何连接 SQL Server 服务器。更详细的内容请参见 <A href="http://msdn.microsoft.com/zh-cn/library/h6bb9cz9.aspx" target=_blank>sessionState 元素（ASP.NET 设置架构）</A></P>
<P align=center><A href="http://www.cftea.com/c/2008/10/H0OGFHOGNJKTTHKK/CPQSS4DEOR2S9ZQ4.png" target=_blank><IMG alt="IIS 中 ASP.NET 配置解释（位置）" src="http://www.cftea.com/c/2008/10/H0OGFHOGNJKTTHKK/CPQSS4DEOR2S9ZQ4.png" width=500 border=0></A></P>
<P>“位置配置”编辑 location 节。location 元素指定应用子配置设置的资源，还可用于锁定配置设置，以防止这些设置被子配置文件重写。具体请参见 <A href="http://msdn.microsoft.com/zh-cn/library/b6x6shw7(VS.80).aspx" target=_blank>location 元素（ASP.NET 设置架构）</A>。</P>]]></description>
      <pubDate>2008-10-4</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[IIS 中 ASP.NET 配置解释（二）]]></title>
      <link>http://www.cftea.com/c/2008/10/HS18GDXVYWOVF7VC.asp</link>
      <description><![CDATA[<UL>
<LI><A href="http://www.cftea.com/c/2008/10/JO75DFDN31MWK1G7.asp">IIS 中 ASP.NET 配置解释（一）</A></LI>
<LI>IIS 中 ASP.NET 配置解释（二）</LI>
<LI><A href="http://www.cftea.com/c/2008/10/H0OGFHOGNJKTTHKK.asp">IIS 中 ASP.NET 配置解释（三）</A></LI></UL>
<HR class=serializationEnd>

<P align=center><A href="http://www.cftea.com/c/2008/10/HS18GDXVYWOVF7VC/CKHG3JCXS9SVEACH.png" target=_blank><IMG alt="IIS 中 ASP.NET 配置解释（授权）" src="http://www.cftea.com/c/2008/10/HS18GDXVYWOVF7VC/CKHG3JCXS9SVEACH.png" width=500 border=0></A></P>
<P>配置 Web 应用程序的授权，以控制客户端对 URL 资源的访问。“授权规则”编辑 authorization 节，其中谓词是一个逗号分隔的 HTTP 传输方法列表，这些 HTTP 传输方法被授予对资源的访问权限。注册到 ASP.NET 的谓词有 GET、HEAD、POST 和 DEBUG。请参见 MSDN 上的 <A href="http://msdn.microsoft.com/zh-cn/library/8d82143t.aspx" target=_blank>authorization 元素（ASP.NET 设置架构）</A>。</P>
<P align=center><A href="http://www.cftea.com/c/2008/10/HS18GDXVYWOVF7VC/03BQ0DYUVLDKYSLO.png" target=_blank><IMG alt="IIS 中 ASP.NET 配置解释（身份验证）" src="http://www.cftea.com/c/2008/10/HS18GDXVYWOVF7VC/03BQ0DYUVLDKYSLO.png" width=500 border=0></A></P>
<P>“身份验证设置”编辑 authentication 节。mode 的可选值有：</P>
<UL>
<LI><SPAN class=key>Windows</SPAN>&nbsp;将 Windows 验证指定为默认的身份验证模式。默认值。</LI>
<LI><SPAN class=key>Forms</SPAN>&nbsp;将 ASP.NET 基于窗体的身份验证指定为默认身份验证模式。互联网上普遍为此形式。</LI>
<LI><SPAN class=key>Passport</SPAN>&nbsp;将 Microsoft Passport Network 身份验证指定为默认身份验证模式。</LI>
<LI><SPAN class=key>None</SPAN>&nbsp;不指定任何身份验证。您的应用程序仅期待匿名用户，否则它将提供自己的身份验证。</LI></UL>
<P>“成员资格”和“角色”请参见 <A href="http://www.cftea.com/c/2008/07/6E6UFX1B6CVUWOO6.asp" target=_blank>ASP.NET 成员资格</A>。</P>
<P>请参见 MSDN 上的 <A href="http://msdn.microsoft.com/zh-cn/library/532aee0e.aspx" target=_blank>authentication 元素（ASP.NET 设置架构）</A>和 <A href="http://msdn.microsoft.com/zh-cn/library/1d3t3c61.aspx" target=_blank>authentication 的 forms 元素（ASP.NET 设置架构）</A>。</P>]]></description>
      <pubDate>2008-10-4</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[IIS 中 ASP.NET 配置解释（一）]]></title>
      <link>http://www.cftea.com/c/2008/10/JO75DFDN31MWK1G7.asp</link>
      <description><![CDATA[<UL>
<LI>IIS 中 ASP.NET 配置解释（一）</LI>
<LI><A href="http://www.cftea.com/c/2008/10/HS18GDXVYWOVF7VC.asp">IIS 中 ASP.NET 配置解释（二）</A></LI>
<LI><A href="http://www.cftea.com/c/2008/10/H0OGFHOGNJKTTHKK.asp">IIS 中 ASP.NET 配置解释（三）</A></LI></UL>
<HR class=serializationEnd>

<P>ASP.NET 的配置内容写在 web.config 文件中，当然某些内容也可以在 IIS 中通过图形化的界面进行配置。</P>
<P align=center><A href="http://www.cftea.com/c/2008/10/JO75DFDN31MWK1G7/ISTL8ET4D71ZISKM.png" target=_blank><IMG alt="IIS 中 ASP.NET 配置解释（常规）" src="http://www.cftea.com/c/2008/10/JO75DFDN31MWK1G7/ISTL8ET4D71ZISKM.png" width=500 border=0></A></P>
<P>“连接字符串管理器”编辑 connectionStrings 节，存储数据库连接字符串，请参见 <A href="http://www.cftea.com/c/2007/12/S9B73MP3MS8GRTY3.asp" target=_blank>ASP.NET 中读取数据库连接字符串</A>。“应用程序设置”编辑 appSettings 节，请参见<A href="http://www.cftea.com/c/2008/01/D324RHMS5AIC1DDU.asp" target=_blank>用 appSettings 使网页统一标题</A>。</P>
<P align=center><A href="http://www.cftea.com/c/2008/10/JO75DFDN31MWK1G7/3ERBI7JQ8IGR41EE.png" target=_blank><IMG alt="IIS 中 ASP.NET 配置解释（自定义错误）" src="http://www.cftea.com/c/2008/10/JO75DFDN31MWK1G7/3ERBI7JQ8IGR41EE.png" width=500 border=0></A></P>
<P>“自定义错误设置”编辑 customErrors 节，mode 的可选值有：</P>
<UL>
<LI><SPAN class=key>On</SPAN> 表示启用自定义错误。如果未指定 defaultRedirect，用户将看到一般性错误。</LI>
<LI><SPAN class=key>Off</SPAN> 表示禁用自定义错误。会向远程客户端和本地主机显示详细的 ASP.NET 错误。</LI>
<LI><SPAN class=key>RemoteOnly</SPAN> 表示仅向远程客户端显示自定义错误并且向本地主机显示 ASP.NET 错误。这是默认值。</LI></UL>
<P>“继承的自定义错误”是指从上级 web.config 或 machine.config 中继承的自定义错误设置。</P>]]></description>
      <pubDate>2008-10-4</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[多个表如何连接]]></title>
      <link>http://www.cftea.com/c/2008/10/Q3UOLLGMMXBR99XI.asp</link>
      <description><![CDATA[<P>没什么特别的，先连接两个表，再直接连接第三个表，比如：</P>
<DIV class=code>(a inner join b on a.id=b.pid) left join c on a.id=c.pid</DIV>
<P><SPAN class=chapterTitle>相关阅读</SPAN></P>
<UL>
<LI><A href="http://www.cftea.com/c/2008/09/TAVNEWGYORZEMDY8.asp" target=_blank>表连接</A></LI></UL>]]></description>
      <pubDate>2008-10-4</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[开发者别忘记设置 IE]]></title>
      <link>http://www.cftea.com/c/2008/10/2Q4C3EYDPSEJZ03R.asp</link>
      <description><![CDATA[<P>不少开发者没有正确配置自己的计算机环境，对于 Web 开发者，最容易忘记的是没有配置 IE。如下图：</P>
<P align=center><IMG alt=IE-设置 src="http://www.cftea.com/c/2008/10/2Q4C3EYDPSEJZ03R/3KSO3IGHLNGIPX0V.png" border=0></P>
<P>我们应该选中“每个脚本错误的通知”，这样在 JavaScript 出错时，会得到提示；取消“显示友好 HTTP 错误信息”，这样在遇到 HTTP 错误，尤其是 500 服务器内部错误时，也许可以获知详细的错误信息。</P>]]></description>
      <pubDate>2008-10-4</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[SQL 的 MMC 控制台问题修复]]></title>
      <link>http://www.cftea.com/c/2008/09/RQT49IUZTMNKBJQ4.asp</link>
      <description><![CDATA[<P><SPAN class=itemTitle>问题</SPAN></P>
<DIV class=quote>
<P>MMC 不能打开文件 C:\Program Files\Microsoft SQL Server\80\Tools\BINN\SQL Server Enterprise Manager.MSC。</P>
<P>这可能是由于文件不存在，不是一个 MMC 控制台，或者用后来版本的 MMC 创建。也可能是由于您没有访问此文件的足够权限。</P></DIV>
<P>扫描过硬盘，重装过 SQL server，用 sfc /scannow 扫描过，都无效，我的 C 盘是 FAT32 的，一直以来都没有问题。</P>
<P><SPAN class=itemTitle>解答</SPAN></P>
<P>看看你的硬盘上有没有这个文件，如果有，将它得到到另一个分区，看能否打开：C:\Program Files\Microsoft SQL Server\80\Tools\BINN\SQL Server Enterprise Manager.MSC。</P>
<P>如果没有此文件，说明此文件丢失。</P>
<P>如果能复制到另一分区并打开，说明你的 C 盘有问题。</P>
<P>如果不能复制，说明这个文件可能已经破坏，删除该文件。</P>
<P>创建此文件的方法，运行对话框中输入 mmc：</P>
<UL>
<LI>控制台（文件）--添加/删除管理单元--添加--找到 Microsoft SQL 企业管理器--添加--关闭--确定</LI>
<LI>控制台（文件）--选项--控制台模式选择“用户模式完全访问”--将下面的选择全部取消</LI>
<LI>控制台（文件）--另存为--存储为：C:\Program Files\Microsoft SQL Server\80\Tools\BINN\SQL Server Enterprise Manager.MSC</LI></UL>]]></description>
      <pubDate>2008-9-28</pubDate>
      <author><![CDATA[]]></author>
    </item>

    <item>
      <title><![CDATA[数据库中表按行分配权限]]></title>
      <link>http://www.cftea.com/c/2008/09/YCIE5IXO06IFKHWI.asp</link>
      <description><![CDATA[<P>可以让 SQL Server 数据库中每个用户只操作某个表特定的列，但如何让其只能操作特定的行呢？</P>
<UL>
<LI>新建一个视图，该视图从表中仅仅选取该用户所需的数据。</LI>
<LI>不给用户对表操作的权限。</LI>
<LI>赋予用户对视图操作的权限。</LI>
<LI>用户操作这个视图就相当于只操作了表的特定行的数据，实现了表按行分配权限。</LI></UL>
<P><SPAN class=chapterTitle>相关阅读</SPAN></P>
<UL>
<LI><A href="http://www.cftea.com/c/2008/09/S3BSKLQ2F8EKPE7F.asp" target=_blank>视图权限与表权限相互独立</A></LI></UL>]]></description>
      <pubDate>2008-9-19</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[SQL Server 里 public 是什么样的角色？]]></title>
      <link>http://www.cftea.com/c/2008/09/2HI7GMH9FF59O5R8.asp</link>
      <description><![CDATA[<P>这个角色的意义和 Windows 中 Everyone 用户组相同，表示任何用户。</P>]]></description>
      <pubDate>2008-9-19</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[存储过程权限与表权限相互独立]]></title>
      <link>http://www.cftea.com/c/2008/09/NXN6ATXVUB116AE9.asp</link>
      <description><![CDATA[<UL>
<LI><A href="http://www.cftea.com/c/2008/09/S3BSKLQ2F8EKPE7F.asp">视图权限与表权限相互独立</A></LI>
<LI>存储过程权限与表权限相互独立</LI></UL>
<HR class=serializationEnd>

<P>我们给用户赋存储过程 A&nbsp;的 SELECT 权限，而不给该用户赋表 A 的 SELECT 权限，<SPAN class=caution>存储过程 A 中的数据来源于表 A</SPAN>。</P>
<P><SPAN class=itemTitle>用户能否从存储过程 A 中 SELECT 数据？</SPAN></P>
<P>能。</P>
<P><SPAN class=itemTitle>用户能否直接从表 A 中 SELECT 数据？</SPAN></P>
<P>不能。</P>]]></description>
      <pubDate>2008-9-19</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[视图权限与表权限相互独立]]></title>
      <link>http://www.cftea.com/c/2008/09/S3BSKLQ2F8EKPE7F.asp</link>
      <description><![CDATA[<UL>
<LI>视图权限与表权限相互独立</LI>
<LI><A href="http://www.cftea.com/c/2008/09/NXN6ATXVUB116AE9.asp">存储过程权限与表权限相互独立</A></LI></UL>
<HR class=serializationEnd>

<P>我们给用户赋视图 A&nbsp;的 SELECT 权限，而不给该用户赋表 A 的 SELECT 权限，<SPAN class=caution>视图 A 中的数据来源于表 A</SPAN>。</P>
<P><SPAN class=itemTitle>用户能否从视图 A 中 SELECT 数据？</SPAN></P>
<P>能。</P>
<P><SPAN class=itemTitle>用户能否直接从表 A 中 SELECT 数据？</SPAN></P>
<P>不能。</P>]]></description>
      <pubDate>2008-9-19</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[涉及正则表达式验证字符串长度时别忘了 ^、$]]></title>
      <link>http://www.cftea.com/c/2008/09/6K144AJV9SELNENU.asp</link>
      <description><![CDATA[<P>用正则表达式验证字符串长度时，一定要带上 ^ 与 $。</P>
<P>比如：</P>
<DIV class=code>^[0-9]{8}$</DIV>
<P>这个正则表达式允许字符串的长度为 8 位，如果我们把 ^ 与 $ 去了，则凡是含有八位数字的字符串都会验证通过。</P>
<P>^ 表示字符串头，$ 表示字符串尾，当然用在不同的地方时 ^ 也表示“非”。</P>
<P><SPAN class=chapterTitle>相关阅读</SPAN></P>
<UL>
<LI><A href="http://www.cftea.com/c/193.asp" target=_blank>正则表达式简介（4）</A></LI></UL>]]></description>
      <pubDate>2008-9-18</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[判断是否是合法的日期]]></title>
      <link>http://www.cftea.com/c/2008/09/QTFJ4IAG3S2N9AUK.asp</link>
      <description><![CDATA[<DIV class=code>if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)<BR>{<BR>&nbsp;&nbsp;&nbsp; if (day &gt;= 1 &amp;&amp; day &lt;= 31)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = true;<BR>&nbsp;&nbsp;&nbsp; }<BR>}<BR>else if (month == 2)<BR>{<BR>&nbsp;&nbsp;&nbsp; if (day &gt;= 1 &amp;&amp; day &lt;= 28)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = true;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; else if (day == 29)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((year % 4 == 0 &amp;&amp; year % 100 != 0) || (year % 400 == 0))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<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;result = true;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }<BR>}<BR>else if (month == 4 || month == 6 || month == 9 || month == 11)<BR>{<BR>&nbsp;&nbsp;&nbsp; if (day &gt;= 1 &amp;&amp; day &lt;= 30)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = true;<BR>&nbsp;&nbsp;&nbsp; }<BR>}</DIV>]]></description>
      <pubDate>2008-9-18</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[C# 判断文件名中是否有非法字符]]></title>
      <link>http://www.cftea.com/c/2008/09/G9KWPSCMRCRCSOLN.asp</link>
      <description><![CDATA[<DIV class=code>if (fileName.IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) &gt;= 0)<BR>{<BR>&nbsp;&nbsp;&nbsp; //含有非法字符<BR>}</DIV>]]></description>
      <pubDate>2008-9-18</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[标识与全局唯一标识]]></title>
      <link>http://www.cftea.com/c/2008/09/BI48O092K9ULJ3FV.asp</link>
      <description><![CDATA[<UL>
<LI><A href="http://www.cftea.com/c/2008/09/PL1WJW2DSE4MQI5U.asp">如何设计主键</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/CCZK1T9Z93PW0KDX.asp">主键为什么默认是 CLUSTERED</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/NGJ5G2WTDSKM0378.asp">主键与标识</A></LI>
<LI>标识与全局唯一标识</LI></UL>
<HR class=serializationEnd>

<P>通过设置 IDENTITY 属性可以设置标识。</P>
<P>将 uniqueidentifier 类型的字段设置为 RowGuid，则该字段成为全局唯一标识。用 NEWID() 产生 guid，虽然 guid 重复的机率很小，但还是应该把全局唯一标识列设置为唯一约束。插入新记录时，新产生的 guid 也可能是以前已经删除了的 guid（虽然机率很小）。</P>
<P>一个表只能有一个标识，也只能有一个全局唯一标识，但可以同时拥有标识和全局唯一标识。</P>
<P><A href="http://www.cftea.com/c/2007/04/9E8JXQO813O8BRHK.asp" target=_blank>scope_identity()</A> 取的是标识，而不是全局唯一标识。</P>
<P>更多内容，请参见 <A href="http://www.cftea.com/c/2006/11/ICCETQMLDRMLNGC5.asp" target=_blank>uniqueidentifier 与 IDENTITY</A>。</P>]]></description>
      <pubDate>2008-9-18</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[主键与标识]]></title>
      <link>http://www.cftea.com/c/2008/09/NGJ5G2WTDSKM0378.asp</link>
      <description><![CDATA[<UL>
<LI><A href="http://www.cftea.com/c/2008/09/PL1WJW2DSE4MQI5U.asp">如何设计主键</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/CCZK1T9Z93PW0KDX.asp">主键为什么默认是 CLUSTERED</A></LI>
<LI>主键与标识</LI>
<LI><A href="http://www.cftea.com/c/2008/09/BI48O092K9ULJ3FV.asp">标识与全局唯一标识</A></LI></UL>
<HR class=serializationEnd>

<P>其实二者并无关联，只是标识的特性很符合建立主键，所以我们常常用标识作为主键。</P>
<P><SPAN class=chapterTitle>相关阅读</SPAN></P>
<UL>
<LI><A href="http://www.cftea.com/c/2008/09/GIWJSKUITWPP8Y5V.asp" target=_blank>主键与聚集索引</A></LI></UL>]]></description>
      <pubDate>2008-9-18</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[主键为什么默认是 CLUSTERED]]></title>
      <link>http://www.cftea.com/c/2008/09/CCZK1T9Z93PW0KDX.asp</link>
      <description><![CDATA[<UL>
<LI><A href="http://www.cftea.com/c/2008/09/PL1WJW2DSE4MQI5U.asp">如何设计主键</A></LI>
<LI>主键为什么默认是 CLUSTERED</LI>
<LI><A href="http://www.cftea.com/c/2008/09/NGJ5G2WTDSKM0378.asp">主键与标识</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/BI48O092K9ULJ3FV.asp">标识与全局唯一标识</A></LI></UL>
<HR class=serializationEnd>

<P>SQL Server 建立主键后，默认是 CLUSTERED 的（除非已经有了其它键或索引为 CLUSTERED），SQL Server 为什么要这样设置默认值呢？这是为了性能的考虑。</P>
<P>主键的目的之一就是根据主键快速地查找到记录，我们建立一个很简单的表，并建立一个主键，进行两次简单的根据主键的查找测试，两次测试分别设置主键为非 CLUSTERED 与 CLUSTERED。</P>
<P align=center><IMG alt="非 CLUSTERED 主键与 CLUSTERED 主键的执行计划对比" src="http://www.cftea.com/c/2008/09/CCZK1T9Z93PW0KDX/XTT7P606DI4J985B.png" border=0></P>
<P>从执行计划看出，非 CLUSTERED 的查找要多一次书签查找。再看看客户统计情况：</P>
<P align=center><IMG alt="非 CLUSTERED 主键与 CLUSTERED 主键的客户统计对比.png" src="http://www.cftea.com/c/2008/09/CCZK1T9Z93PW0KDX/JBHS0XUJP9L19UGZ.png" border=0></P>
<P>数据库中仅有不足 20 条记录，已经可以看出非 CLUSTERED 与 CLUSTERED 的差异了。</P>
<P>由此，我们应该可以理解，为什么主键不是必须要 CLUSTERED，但 SQL Server 默认给我们设置成 CLUSTERED 的原因了。</P>]]></description>
      <pubDate>2008-9-18</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[如何设计主键]]></title>
      <link>http://www.cftea.com/c/2008/09/PL1WJW2DSE4MQI5U.asp</link>
      <description><![CDATA[<UL>
<LI>如何设计主键</LI>
<LI><A href="http://www.cftea.com/c/2008/09/CCZK1T9Z93PW0KDX.asp">主键为什么默认是 CLUSTERED</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/NGJ5G2WTDSKM0378.asp">主键与标识</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/BI48O092K9ULJ3FV.asp">标识与全局唯一标识</A></LI></UL>
<HR class=serializationEnd>

<P>一个键被选定为主键，我认为有以下四个原则：</P>
<P><SPAN class=itemTitle>唯一性</SPAN></P>
<P>这是必须的，因为键的目的就是为了唯一标识一条记录。</P>
<P><SPAN class=itemTitle>不可 NULL</SPAN></P>
<P>这也是必须的，为 NULL，则无法唯一标识一条记录。</P>
<P><SPAN class=itemTitle>最小性</SPAN></P>
<P>主键越小，利用主键查找记录时性能就越高。一般来说：</P>
<UL>
<LI>如果有多个键，则选字段长度小的作为主键。</LI>
<LI>如果键由多个字段组成，则可以考虑新建一个标识列来作为主键。这样做还方便了应用程序的开发。</LI></UL>
<P><SPAN class=itemTitle>可索引性</SPAN></P>
<P>用主键的目的是唯一标识一条记录，同时也是为了快速地找到该条记录，所以具有可索引性可以快速找到到该记录，如果没有索引，就要求是 CLUSTERED，聚集的，这样也可以快速找到该记录。<SPAN class=caution>其实 SQL Server 中，主键本身就是可索引的，不管是不是 CLUSTERED，也就是说主键既是约束又是索引，但键只是一种约束。</SPAN></P>
<P><SPAN class=chapterTitle>相关阅读</SPAN></P>
<UL>
<LI><A href="http://www.cftea.com/c/2008/09/LPENKU49N1F507HJ.asp" target=_blank>键与主键</A></LI></UL>]]></description>
      <pubDate>2008-9-18</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[事件的绑定与撤销]]></title>
      <link>http://www.cftea.com/c/2008/09/PW6AW5D9PZFIN2JH.asp</link>
      <description><![CDATA[<P>三个按钮，点击 button2 为 button1 绑定 Click 事件，点击 button3 为 button1 撤销 Click 事件。</P>
<DIV class=code>private void button2_Click(object sender, EventArgs e)<BR>{<BR>&nbsp;&nbsp;&nbsp; button1.Click += new EventHandler(button1_Click);<BR>}<BR><BR>private void button3_Click(object sender, EventArgs e)<BR>{<BR>&nbsp;&nbsp;&nbsp; button1.Click -= new EventHandler(button1_Click);<BR>}<BR><BR>private void button1_Click(object sender, EventArgs e)<BR>{<BR>&nbsp;&nbsp;&nbsp; MessageBox.Show("收到了 button1 的 Click 事件。");<BR>}</DIV>
<P>如果 button2_Click 中绑定了两次 button1_Click，则点击 button1 时，会收到两次对话框，要完全撤销，也应该使用两次 <SPAN class=key>-=</SPAN>。</P>]]></description>
      <pubDate>2008-9-17</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[ASCII]]></title>
      <link>http://www.cftea.com/c/2008/09/UXYARXV25ZAC19T1.asp</link>
      <description><![CDATA[<P>American Standard Code for Information Interexchange 的缩写，ASCII 是一个工业标准，用 8 位代码的 256 个可用位置分配给字母、数字和其它字符。</P>
<P>ASCII 表被分为三节</P>
<UL>
<LI>不可打印，系统代码在 0 到 31 之间。</LI>
<LI>低 ASCII，位于 32 到 127 之间。</LI>
<LI>高 ASCII，位于 128 到 255 之间。</LI></UL>
<P align=center><IMG alt="低 ASCII" src="http://www.cftea.com/c/2008/09/UXYARXV25ZAC19T1/6X2W8MEOTI78APZ0.png" border=0></P>
<P align=center><IMG alt="高 ASCII" src="http://www.cftea.com/c/2008/09/UXYARXV25ZAC19T1/W51ZV1AT1SLD6AE8.png" border=0></P>]]></description>
      <pubDate>2008-9-17</pubDate>
      <author><![CDATA[]]></author>
    </item>

    <item>
      <title><![CDATA[ASCII 还是 ASCⅡ]]></title>
      <link>http://www.cftea.com/c/2008/09/9QDT473DCYNG3Y8A.asp</link>
      <description><![CDATA[<P>读书的时候，老师说是 ASCⅡ，其中 Ⅱ 代表第二个版本，后来才知道错了，应该是 ASCII，为 American Standard Code for Information Interexchange 的缩写，中译为：美国信息交换标准代码。</P>]]></description>
      <pubDate>2008-9-17</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[ASP.NET 画图与图像处理－获取照片拍摄日期]]></title>
      <link>http://www.cftea.com/c/2008/09/9CQ7GKY1N7LMN60M.asp</link>
      <description><![CDATA[<P>照片的拍摄日期、光圈、曝光时间等这些信息存在文件的头信息中，被称为 EXIF 信息，最初是由日本发明的。</P>
<P>要取这些信息可以用 System.Drawing.Image 的 PropertyItems 对象数组，如果对象中 Id 值为 0x0132（十进制 306），则 Value 就表示为拍照日期，不过这个格式有点怪，其格式为“0000:00:00 00:00:00”，可以看出年月日的分隔也是用的冒号，另外如果相机具有记录拍照日期功能，但没有设定日期，记录的日期值就是“0000:00:00 00:00:00”。</P>
<DIV class=code>using (System.Drawing.Image image = System.Drawing.Image.FromFile(photoPath))<BR>{<BR>&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; image.PropertyItems.Length; i++)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (image.PropertyItems[i].Id == 0x0132)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<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;string value = Encoding.ASCII.GetString(image.PropertyItems[i].Value);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string[] dtParts = value.Split(new string[2] { " ", ":" },&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringSplitOptions.RemoveEmptyEntries);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (Convert.ToInt32(dtParts[0]) &gt; 0)<BR>&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;&nbsp;shootingDate = new DateTime(Convert.ToInt32(dtParts[0]), Convert.ToInt32(dtParts[1]), Convert.ToInt32(dtParts[2]),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Convert.ToInt32(dtParts[3]), Convert.ToInt32(dtParts[4]), Convert.ToInt32(dtParts[5]), DateTimeKind.Local);</DIV>
<DIV class=code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp; }<BR>}</DIV>
<P><SPAN class=itemTitle>以下为转载供您参考</SPAN></P>
<P><SPAN class=itemTitle>如何在.NET下操作图像元 Exif 数据</SPAN></P>
<P>版权声明：转载时请以超链接形式标明文章原始出处和作者信息及本声明<BR><A href="http://kware.blogbus.com/logs/10871143.html" target=_blank>http://kware.blogbus.com/logs/10871143.html</A></P>
<DIV class=postBody>
<P><SPAN class=itemTitle>1. JFIF JPEG 文件交换格式 (JFIF)</SPAN></P>
<P><SPAN class=itemTitle></SPAN>JPEG 是一种压缩方案，不是一种文件格式。“JPEG 文件交换格式(JFIF)”是一种文件格式，常用于存储和传输已根据 JPEG 方案压缩的图像。Web 浏览器显示的 JFIF 文件使用 .jpg 扩展名。</P>
<P>可交换图像文件 (EXIF)</P>
<P>EXIF 是一种适用于数码相机拍摄的照片的文件格式。EXIF 文件中含有根据 JPEG 规格压缩的图像。EXIF文件中还包含了有关照片的信息(拍摄日期、快门速度、曝光时间等)和相机信息(制造商、型号等)。</P>
<P><SPAN class=itemTitle>2. NET 如何：读取图像元 Exif 数据</SPAN></P>
<P><SPAN class=itemTitle></SPAN>一些图像文件中包含可供您读取以确定图像特征的元数据。例如，数字照片中可能包含可供您读取以确定用于捕获该图像的照相机的品牌和型号的元数据。利用GDI+，可以读取现有的元数据，也可以将新的元数据写入图像文件中。</P>
<P>GDI+ 将单独的元数据段存储在 PropertyItem 对象中。您可读取 Image 对象的 PropertyItems属性以便从某个文件中检索所有的元数据。PropertyItems 属性返回一个 PropertyItem 对象的数组。</P>
<P>在NET中的EXIF属性项操作方法：System.Drawing.Imaging.Image.*</P>
<UL>
<LI>public PropertyItem[] PropertyItems {get;}</LI>
<LI>public int[] PropertyIdList {get;}</LI>
<LI>public void RemovePropertyItem(int propid);</LI>
<LI>public PropertyItem GetPropertyItem(int propid);</LI>
<LI>public void SetPropertyItem(PropertyItem propitem);</LI></UL>
<P>System.Drawing.Imaging.PropertyItem</P>
<P>PropertyItem 对象具有以下四个属性：Id、Value、Len 和 Type。</P>
<P>1) Id 用于标识元数据项的标记。下表显示一些可赋予 Id 的值。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 十六进制值&nbsp; 说明<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图象宽度&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0101&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图象高度<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x010E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图象描述<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x010F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设备制造商&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0110&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设备型号<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0131&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所用软件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0132&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 拍摄时间<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x013B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作者<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0320&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图像标题<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x5090&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 亮度表&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x5091&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 色度表<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x8298&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 版权声明&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x829A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exif 曝光时间<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x9000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EXIF版本&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x9003&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原始拍摄时间ExifDTOriginal<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x927C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 厂家备注&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x9286&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用户备注</P>
<P>2) Value 数组值。这些值的格式由 Type 属性确定。</P>
<P>3) Len 长度。Value 属性指向的值的数组长度（以字节表示）。</P>
<P>4) Type 类型</P>
<P>Value 属性指向的数组中值的数据类型。下表显示由 Type 属性值指示的格式<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数值&nbsp; 说明<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; 一个 Byte&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; 2&nbsp;&nbsp;&nbsp;&nbsp; ASCII 编码的 Byte 对象的数组<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp; 16 位整数&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; 4&nbsp;&nbsp;&nbsp;&nbsp; 32 位整数<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp; 包含两个表示有理数的 Byte 对象的数组&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp; 未使用<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7&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; 8&nbsp;&nbsp;&nbsp;&nbsp; 未使用<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9&nbsp;&nbsp;&nbsp;&nbsp; SLong&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; 10&nbsp;&nbsp;&nbsp; SRational</P></DIV>]]></description>
      <pubDate>2008-9-17</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[索引与键]]></title>
      <link>http://www.cftea.com/c/2008/09/B8W3I4UJLWWNR3D9.asp</link>
      <description><![CDATA[<P>在表设计的时候，可以打开“索引/键”对话框，如下：</P>
<P align=center><IMG alt=索引与键 src="http://www.cftea.com/c/2008/09/B8W3I4UJLWWNR3D9/9KASYBWFOBI5AGGL.png" border=0></P>
<P>我认为这个对话框有点误导人，上面有“选定的索引”、“索引名称”，但实际上我们建立的并不是索引，可能只是一个键。只有按上述红色标注建立的才是键，其它情况是索引。</P>
<P>我们可以这么验证：建立一个键，然后在表上点右键-&gt;“所有任务”-&gt;“生成 SQL 脚本”-&gt;“选项”，选中“编写索引脚本”，可以看到脚本中并没有与索引相关的脚本。</P>
<P>所以我觉得上述名称应该改为“选定的索引/键”、“索引/键名称”更合理。</P>
<P>键的代码示例：</P>
<DIV class=code>ALTER TABLE [dbo].[Table1] ADD <BR>&nbsp;CONSTRAINT [IX_Table1] UNIQUE&nbsp; CLUSTERED <BR>&nbsp;(<BR>&nbsp;&nbsp;[g]<BR>&nbsp;)&nbsp; ON [PRIMARY] <BR>GO</DIV>
<P>索引的代码示例：</P>
<DIV class=code>CREATE&nbsp; UNIQUE&nbsp; CLUSTERED&nbsp; INDEX [IX_Table1] ON [dbo].[Table1]([g]) ON [PRIMARY]<BR>GO</DIV>
<P><SPAN class=itemTitle>介绍创建索引时的几个选项：</SPAN></P>
<P><SPAN class=key>忽略重复键：</SPAN>在导入数据时，遇到重复值，是跳过，而不是停止执行，请参见<A href="http://www.cftea.com/c/2006/12/TBQ87P80C80Y0ZUF.asp" target=_blank>忽略重复键</A>。</P>
<P><SPAN class=key>填充索引：</SPAN>填充因子 &gt; 0 时有效，让填充因子不仅作用于页级还作用于中间级，请参见<A href="http://www.cftea.com/c/2006/10/7V2F3Q4IA3D0BRD0.asp" target=_blank>填充因子</A>。SQL 语句中，填充索引用 PAD_INDEX&nbsp; 表示。</P>
<P><SPAN class=key>不自动重新计算统计：</SPAN>创建索引需要记录的统计数据，选中该选项就表示使用原来的统计数据，因此非常不推荐选中该选项。</P>]]></description>
      <pubDate>2008-9-16</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[如何创建聚集索引与非聚集索引]]></title>
      <link>http://www.cftea.com/c/2008/09/6IEHPH7CKVB7HTLE.asp</link>
      <description><![CDATA[<UL>
<LI><A href="http://www.cftea.com/c/2008/09/LPENKU49N1F507HJ.asp">键与主键</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/MLXPNRS6H20HQPUQ.asp">聚集索引与非聚集索引</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/GIWJSKUITWPP8Y5V.asp">主键与聚集索引</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/T1FFO9P644PMH0DZ.asp">键与约束</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/5ZQAXY7X8SR6QRQ2.asp">如何创建键与主键</A></LI>
<LI>如何创建聚集索引与非聚集索引</LI></UL>
<HR class=serializationEnd>

<P><SPAN class=itemTitle>创建聚集索引</SPAN></P>
<P><SPAN class=itemTitle>企业管理器</SPAN></P>
<UL>
<LI>打开表设计；</LI>
<LI>单击工具栏上的“管理索引/键...”；</LI>
<LI>在“属性”对话框中，单击“新建”；</LI>
<LI>选择一个或多个列名；</LI>
<LI>选中“创建为 CLUSTERED”；</LI>
<LI>根据情况选择其它选项，只是不要选中“约束”。</LI></UL>
<P><SPAN class=itemTitle>T-SQL 语句</SPAN></P>
<DIV class=code>&nbsp;CREATE&nbsp; CLUSTERED&nbsp; INDEX [IX_a_a] ON [dbo].[a]([a]) ON [PRIMARY]<BR>GO</DIV>
<P><SPAN class=itemTitle>创建非聚集索引</SPAN></P>
<P><SPAN class=itemTitle>企业管理器</SPAN></P>
<UL>
<LI>打开表设计；</LI>
<LI>单击工具栏上的“管理索引/键...”；</LI>
<LI>在“属性”对话框中，单击“新建”；</LI>
<LI>选择一个或多个列名；</LI>
<LI>根据情况选择其它选项，只是不要选中“约束”。</LI></UL>
<P><SPAN class=itemTitle>T-SQL 语句</SPAN></P>
<DIV class=code>&nbsp;CREATE&nbsp; INDEX [IX_a_b] ON [dbo].[a]([b]) ON [PRIMARY]<BR>GO</DIV>]]></description>
      <pubDate>2008-9-16</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[如何创建键与主键]]></title>
      <link>http://www.cftea.com/c/2008/09/5ZQAXY7X8SR6QRQ2.asp</link>
      <description><![CDATA[<UL>
<LI><A href="http://www.cftea.com/c/2008/09/LPENKU49N1F507HJ.asp">键与主键</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/MLXPNRS6H20HQPUQ.asp">聚集索引与非聚集索引</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/GIWJSKUITWPP8Y5V.asp">主键与聚集索引</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/T1FFO9P644PMH0DZ.asp">键与约束</A></LI>
<LI>如何创建键与主键</LI>
<LI><A href="http://www.cftea.com/c/2008/09/6IEHPH7CKVB7HTLE.asp">如何创建聚集索引与非聚集索引</A></LI></UL>
<HR class=serializationEnd>

<P><SPAN class=itemTitle>创建键</SPAN></P>
<P><SPAN class=itemTitle>企业管理器</SPAN></P>
<UL>
<LI>打开表设计；</LI>
<LI>单击工具栏上的“管理索引/键...”；</LI>
<LI>在“属性”对话框中，单击“新建”；</LI>
<LI>选择一个或多个列名；</LI>
<LI>选择“创建 UNIQUE”；</LI>
<LI>选择“约束”。</LI></UL>
<P><SPAN class=itemTitle>T-SQL 语句</SPAN></P>
<DIV class=code>ALTER TABLE [dbo].[a] ADD&nbsp;<BR>&nbsp;CONSTRAINT [IX_a] UNIQUE&nbsp; NONCLUSTERED <BR>&nbsp;(<BR>&nbsp;&nbsp;[id]<BR>&nbsp;)&nbsp; ON [PRIMARY]<BR>GO</DIV>
<P><SPAN class=itemTitle>创建主键</SPAN></P>
<P><SPAN class=itemTitle>企业管理器</SPAN></P>
<UL>
<LI>打开表设计；</LI>
<LI>用选中一个或多个列名；</LI>
<LI>单击工具栏上的“设置主键”（钥匙图形的按钮）；</LI>
<LI>要修改主键 CLUSTERED 特性，单击工具栏上的“管理索引/键...”；</LI></UL>
<P><SPAN class=itemTitle>T-SQL 语句</SPAN></P>
<DIV class=code>ALTER TABLE [dbo].[a] ADD <BR>&nbsp;CONSTRAINT [PK_a] PRIMARY KEY&nbsp; CLUSTERED <BR>&nbsp;(<BR>&nbsp;&nbsp;[v]<BR>&nbsp;)&nbsp; ON [PRIMARY]<BR>GO</DIV>
<P>&nbsp;</P>]]></description>
      <pubDate>2008-9-16</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[键与约束]]></title>
      <link>http://www.cftea.com/c/2008/09/T1FFO9P644PMH0DZ.asp</link>
      <description><![CDATA[<UL>
<LI><A href="http://www.cftea.com/c/2008/09/LPENKU49N1F507HJ.asp">键与主键</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/MLXPNRS6H20HQPUQ.asp">聚集索引与非聚集索引</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/GIWJSKUITWPP8Y5V.asp">主键与聚集索引</A></LI>
<LI>键与约束</LI>
<LI><A href="http://www.cftea.com/c/2008/09/5ZQAXY7X8SR6QRQ2.asp">如何创建键与主键</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/6IEHPH7CKVB7HTLE.asp">如何创建聚集索引与非聚集索引</A></LI></UL>
<HR class=serializationEnd>

<P>实际上键也是一种约束，我们可以建立一个主键，然后建立一个约束，<A href="http://www.cftea.com/c/2008/09/B8W3I4UJLWWNR3D9.asp" target=_blank>导出 SQL 语句</A>，其结果类似如下：</P>
<DIV class=code>ALTER TABLE [dbo].[a] ADD <BR>&nbsp;<SPAN class=caution>CONSTRAINT</SPAN> [PK_a] PRIMARY KEY&nbsp; CLUSTERED <BR>&nbsp;(<BR>&nbsp;&nbsp;[v]<BR>&nbsp;)&nbsp; ON [PRIMARY] ,<BR>&nbsp;<SPAN class=caution>CONSTRAINT</SPAN> [IX_a] UNIQUE&nbsp; NONCLUSTERED <BR>&nbsp;(<BR>&nbsp;&nbsp;[id]<BR>&nbsp;)&nbsp; ON [PRIMARY] ,<BR>&nbsp;<SPAN class=caution>CONSTRAINT</SPAN> [CK_a] CHECK (len([v]) &gt;= 0)<BR>GO</DIV>
<P>&nbsp;</P>]]></description>
      <pubDate>2008-9-16</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[主键与聚集索引]]></title>
      <link>http://www.cftea.com/c/2008/09/GIWJSKUITWPP8Y5V.asp</link>
      <description><![CDATA[<UL>
<LI><A href="http://www.cftea.com/c/2008/09/LPENKU49N1F507HJ.asp" target=_blank>键与主键</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/MLXPNRS6H20HQPUQ.asp" target=_blank>聚集索引与非聚集索引</A></LI>
<LI>主键与聚集索引</LI>
<LI><A href="http://www.cftea.com/c/2008/09/T1FFO9P644PMH0DZ.asp" target=_blank>键与约束</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/5ZQAXY7X8SR6QRQ2.asp" target=_blank>如何创建键与主键</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/6IEHPH7CKVB7HTLE.asp" target=_blank>如何创建聚集索引与非聚集索引</A></LI></UL>
<HR class=serializationEnd>

<P>主键与聚集索引可以说并无关系，但由于存在一些方面的“瓜葛”，容易让人把它们混淆。</P>
<P><SPAN class=itemTitle>目的</SPAN></P>
<P>主键的目的是唯一地标识一条记录。</P>
<P>聚集索引的目的是让记录查询速度更快。</P>
<P><SPAN class=itemTitle>唯一性（UNIQUE）</SPAN></P>
<P>主键对应的记录值<SPAN class=caution>必须</SPAN>唯一。</P>
<P>聚集索引对应的记录值<SPAN class=caution>不一定</SPAN>要唯一。</P>
<P><SPAN class=itemTitle>聚集（CLUSTERED）</SPAN></P>
<P>主键对应的记录值<SPAN class=caution>不一定</SPAN>要聚集，但<SPAN class=caution>默认是聚集的</SPAN>。</P>
<P>聚集索引对应的记录值<SPAN class=caution>必须</SPAN>聚集。</P>
<P><SPAN class=chapterTitle>相关阅读</SPAN></P>
<UL>
<LI><A href="http://www.cftea.com/c/2008/09/NGJ5G2WTDSKM0378.asp" target=_blank>主键与标识</A></LI></UL>]]></description>
      <pubDate>2008-9-16</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[聚集索引与非聚集索引]]></title>
      <link>http://www.cftea.com/c/2008/09/MLXPNRS6H20HQPUQ.asp</link>
      <description><![CDATA[<UL>
<LI><A href="http://www.cftea.com/c/2008/09/LPENKU49N1F507HJ.asp">键与主键</A></LI>
<LI>聚集索引与非聚集索引</LI>
<LI><A href="http://www.cftea.com/c/2008/09/GIWJSKUITWPP8Y5V.asp">主键与聚集索引</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/T1FFO9P644PMH0DZ.asp">键与约束</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/5ZQAXY7X8SR6QRQ2.asp">如何创建键与主键</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/6IEHPH7CKVB7HTLE.asp">如何创建聚集索引与非聚集索引</A></LI></UL>
<HR class=serializationEnd>

<P>请参见<A href="http://www.cftea.com/c/452.asp" target=_blank>聚簇索引和非聚簇索引介绍</A>。</P>]]></description>
      <pubDate>2008-9-15</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[键与主键]]></title>
      <link>http://www.cftea.com/c/2008/09/LPENKU49N1F507HJ.asp</link>
      <description><![CDATA[<UL>
<LI>键与主键</LI>
<LI><A href="http://www.cftea.com/c/2008/09/MLXPNRS6H20HQPUQ.asp" target=_blank>聚集索引与非聚集索引</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/GIWJSKUITWPP8Y5V.asp" target=_blank>主键与聚集索引</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/T1FFO9P644PMH0DZ.asp" target=_blank>键与约束</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/5ZQAXY7X8SR6QRQ2.asp" target=_blank>如何创建键与主键</A></LI>
<LI><A href="http://www.cftea.com/c/2008/09/6IEHPH7CKVB7HTLE.asp" target=_blank>如何创建聚集索引与非聚集索引</A></LI></UL>
<HR class=serializationEnd>

<P>在了解键与主键之前，我们先看看实体－关系模型。</P>
<P><SPAN class=itemTitle>在 E-R 模型中，有如下一些概念：</SPAN></P>
<UL>
<LI><SPAN class=key>超码：</SPAN>是一个或多个属性的集合，这些属性的组合可以使我们在一个实体集中唯一地标识一个实体。</LI>
<LI><SPAN class=key>候选码：</SPAN>是一个超码，但它们的任意真子集都不能成为超码。（真子集：A 包含于 B,且 A≠B，则称 A 是 B 的真子集。）</LI>
<LI><SPAN class=key>主码：</SPAN>被数据库设计者选中，用来在同一实体集中区分不同实体的候选码。</LI></UL>
<P>在关系型数据库中，上述“属性”对应“字段”，“实体集”对应于“表”，“实体”对应于“记录”，“超码”对应于“键”，“主码”对应于“主键”。</P>
<P><SPAN class=itemTitle>由此看出：</SPAN></P>
<UL>
<LI>主键是键中的<SPAN class=caution>一个</SPAN>。</LI>
<LI>主键是键中的<SPAN class=caution>一种</SPAN>，即主键中任何一个字段或部分字段的组合都不能唯一地标识一条记录，而键允许这样。要说明一下，当我们选定的主键的真子集仍是一个键时，数据库也不会报错，尽管我们这样设计主键是不正确的。</LI></UL>
<P><SPAN class=chapterTitle>相关阅读</SPAN></P>
<UL>
<LI><A href="http://www.cftea.com/c/2008/09/PL1WJW2DSE4MQI5U.asp" target=_blank>如何设计主键</A></LI></UL>]]></description>
      <pubDate>2008-9-15</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

    <item>
      <title><![CDATA[填充因子－2]]></title>
      <link>http://www.cftea.com/c/2008/09/GX9LEDBF31GYQMGR.asp</link>
      <description><![CDATA[<P>创建索引时，可以指定一个填充因子，以便在索引的每个叶级页上留出额外的间隙和保留一定百分比的空间，供将来表的数据存储容量进行扩充和减少页拆分的可能性。</P>
<P>对于聚集索引，上面提到的“叶级”，也就是“数据页”，数据页一般比较大，如果不留足一定的空间，每增加一条数据都可能影响其它数据页的移动，性能是很不乐观的。</P>
<P>填充因子的值是 0-100%，0% 表示由系统决定，1% 表示留出的空间最多，100% 表示不留空间。只推荐将只读数据库的填充因子设置为 100%，因为只读数据库的索引不变，不再需要额外的空间来减少页拆分的可能性。平时设置为 0% 即可，这是 SQL Server 推荐的。</P>
<P>可以看出填充因子的目的并不是让页上始终留出那么多的可用空间，该可用空间会随着数据的变动而变动，如果我们重建索引，则会重新分配页，使得每页上的可用空间和刚建立索引时的一样。</P>
<P><SPAN class=chapterTitle>相关阅读</SPAN></P>
<UL>
<LI><A href="http://www.cftea.com/c/548.asp" target=_blank>整理索引碎片，提升SQL Server速度</A></LI></UL>]]></description>
      <pubDate>2008-9-15</pubDate>
      <author><![CDATA[cftea]]></author>
    </item>

    <item>
      <title><![CDATA[收缩数据库会提高数据库速度吗？]]></title>
      <link>http://www.cftea.com/c/2008/09/FMCU7CEFDD4YRFHF.asp</link>
      <description><![CDATA[<P>今天在论坛上看到一个问题：收缩数据库会提高数据库速度吗？</P>
<P>当时由于比较急，没有仔细研究，现在来讨论一下。</P>
<P><A href="http://www.cftea.com/c/541.asp" target=_blank>收缩数据库</A>就是把数据库中不再使用的空间归还给操作系统，修改、删除等操作可能会造成数据库中存在不再使用的空间。数据和事务日志都可以收缩。</P>
<P><SPAN class=itemTitle>对于读速度</SPAN></P>
<P>肯定会提高的，就如同你把一屋子的书整齐地堆放在书架上一样，肯定利于查询，但是究竟会提高多少，要看不可使用空间占总空间的比例，占得比例越大，说明性能提升可能相对来说越明显。</P>
<P><SPAN class=itemTitle>对于增、删、改速度</SPAN></P>
<P>如果没有聚集索引，对数据的增、删、改不会影响其它记录，应该来说，这和读速度的影响是一样的。</P>
<P>如果有聚集索引，得具体想想，有聚集索引，则受<A href="http://www.cftea.com/c/2008/09/GX9LEDBF31GYQMGR.asp" target=_blank>填充因子</A>的影响，每一数据页肯定是填充不满的，没有填充满就是为了增、改数据时不会影响其它页的数据，因为有聚集索引的记录必须按顺序存放，即使最后加入的数据，也可能存储在第一页中，现在关键就是收缩数据库会不会把这些<SPAN class=caution>未使用</SPAN>的空间当作<SPAN class=caution>不再使用</SPAN>的空间来对待，我试验了一下，发现不会，也就是说，即使是聚集索引，收缩数据库也会使性能提升。</P>
<P><SPAN class=itemTitle>重要说明</SPAN></P>
<P>上面得出的结论是，会提升数据库增、删、改、查性能，但这只是<SPAN class=caution>相对的</SPAN>，它只是会减少硬盘的搜寻成本，收缩数据库可能还会引发另外一些问题，比如索引碎片增多，关于此问题，请参见<A href="http://www.cftea.com/c/548.asp" target=_blank>整理索引碎片，提升SQL Server速度</A>。即使如此，对于频繁操作的数据库，还是建议收缩一下，避免太多不再使用的空间，即使性能不显著，对于节约磁盘空间来说也挺有用的。</P>
<P><SPAN class=chapterTitle>相关阅读</SPAN></P>
<UL>
<LI><A href="http://www.cftea.com/c/540.asp" target=_blank>解决日志占用大量空间问题</A></LI></UL>]]></description>
      <pubDate>2008-9-15</pubDate>
      <author><![CDATA[cftea]]></author>
    </item>

    <item>
      <title><![CDATA[数据库查询中文出来为乱码]]></title>
      <link>http://www.cftea.com/c/2008/09/UYT0QIJUF6NJK7D5.asp</link>
      <description><![CDATA[<DIV class=code>select '用户 ID:' + cast(userID as varchar(5)) ...</DIV>
<P>显示出来为乱码，可以这样：</P>
<DIV class=code>select N'用户 ID:' + cast(userID as varchar(5)) ...</DIV>
<P>加上 N 表示 Unicode。</P>]]></description>
      <pubDate>2008-9-15</pubDate>
      <author><![CDATA[]]></author>
    </item>

    <item>
      <title><![CDATA[永久免费的操作系统 UBUNTU]]></title>
      <link>http://www.cftea.com/c/2008/09/S3JFSJUU0X1GMSH5.asp</link>
      <description><![CDATA[<P>Ubuntu 是一个由社区开发的基于 Linux 的操作系统，适用于笔记本电脑、桌面电脑和服务器。 无论您是在家庭、学校还是工作时使用，Ubuntu 都包含了您所需的所有程序：无论是文字处理和电子邮件，还是 Web 服务和编程工具。</P>
<P><A href="http://www.ubuntu.com.cn/" target=_blank>http://www.ubuntu.com.cn/</A></P>
<P><A href="http://forum.ubuntu.org.cn/" target=_blank>http://forum.ubuntu.org.cn/</A></P>]]></description>
      <pubDate>2008-9-15</pubDate>
      <author><![CDATA[]]></author>
    </item>

    <item>
      <title><![CDATA[Linux 怎么读]]></title>
      <link>http://www.cftea.com/c/2008/09/DCTL96ZDCX2ET6DG.asp</link>
      <description><![CDATA[<P>很多人读作“哩纽克斯”，不过以前看过一个报道，根据 Linus Torvalds 的发音，Linux 应该读作“哩呐克斯”，重音在“哩”，音标是 ['li:nэks]。</P>
<P>Linus Torvalds，Linux 核心的创作者，于 1969年12月28日出生在芬兰的赫尔辛基。</P>
<P>当时有一套类似于 Unix 的操作系统叫 Minix，Torvalds 决定开发超出 Minix 标准的一个操作系统。他称它 Linux，是 Linus 与 Minix 的缩写。而 Linus 的中译为“林纳斯”。</P>
<P>下载读音：<A href="http://www.cftea.com/c/2008/09/DCTL96ZDCX2ET6DG/Linux.au" target=_blank>/c/2008/09/DCTL96ZDCX2ET6DG/Linux.au</A>。</P>
<P>录音内容：Hello, This is Linus Torvalds and&nbsp;I pronounce Linux as Linux.</P>]]></description>
      <pubDate>2008-9-15</pubDate>
      <author><![CDATA[vkvi]]></author>
    </item>

  </channel>
</rss>
