<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://bigqiangbigqiang.spaces.live.com/mmm2008-04-25_07.02/rsspretty.aspx?rssquery=en-US;http%3a%2f%2fbigqiangbigqiang.spaces.live.com%2fcategory%2f__x1NET%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>多多小虫 天行健: .NET</title><description /><link>http://bigqiangbigqiang.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=cat__x1NET</link><language>en-US</language><pubDate>Wed, 30 Apr 2008 15:32:53 GMT</pubDate><lastBuildDate>Wed, 30 Apr 2008 15:32:53 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://bigqiangbigqiang.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>7252450144899880511</live:id><live:alias>bigqiangbigqiang</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>Asp.Net数据库编程－10条最优方法[翻译]</title><link>http://bigqiangbigqiang.spaces.live.com/Blog/cns!64A5E0FB4DFCD63F!453.entry</link><description>&lt;div&gt;原文标题:Using Data with ASP.Net - 10 of my 'Best Practices'&lt;br&gt;原文链接:&lt;a href="http://www.developerdotstar.com/community/node/531"&gt;http://www.developerdotstar.com/community/node/531&lt;/a&gt; (By &lt;a title="View user profile." href="http://www.developerdotstar.com/community/user/119"&gt;&lt;font color="#3232cd"&gt;Chris Gaskell&lt;/font&gt;&lt;/a&gt;)&lt;br&gt;翻　　译:bigqiang(多多小虫)&lt;br&gt;说　　明:学习之用，翻译未经原作者许可&lt;/div&gt;
&lt;div&gt;　　完全不能说：任何严谨的程序员在他们的职业生涯中极少有时间处理数据库编程。因此要求你涉及底层数据库的代码尽可能高效非常合理。希望能把我在应用ADO.Net编程时所了解的一些最佳编程方法与你分享。也希望你能在使用过程中发现和我所说的同样有效。&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;最优方法 #1&lt;/strong&gt;&lt;br&gt;　　使用内置.Net data providers&lt;/div&gt;
&lt;div&gt;　　内置的.Net data providers允许你充分利用.Net框架特点以及高效发挥数据库的潜力。&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;最优方法 #2&lt;br&gt;&lt;/strong&gt;　　总是使用conifg文件保存数据库连接字串。同时加密连接字串特别是数据库位置不确定时。&lt;/div&gt;
&lt;div&gt;　　在程序外部的数据库可能会变动位置，这样可以很容易的更改config文件中的连接字串。从安全角度讲加密连接字串很明智。&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;最优方法 #3&lt;/strong&gt;&lt;br&gt;　　优先作用SQL Server的排序方法，诸如：ORDER BY，HAVING 以及 GROUP BY 这些语句。&lt;/div&gt;
&lt;div&gt;　　在服务器端执行排序而不是在客户端，这会更节省时间，因为服务器端完成任务更快。&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;最优方法 #4&lt;/strong&gt;&lt;br&gt;　　尽力设法限定返回结果集合的行数，具有代表性的方法是使用 TOP 关键词，当然还有其它类似的方法。&lt;/div&gt;
&lt;div&gt;　　限制发送信的息数据量程序会更快&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;最优方法 #5&lt;/strong&gt;&lt;br&gt;　　当使用一个 Command 对象的 ExecuteReader 方法时，最好使用CommandBehavior.CloseConnection&lt;/div&gt;
&lt;div&gt;　　这种方式提供了良好的连接池，能让连接迅速打开和返回。&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;最优方法 #6&lt;/strong&gt;&lt;br&gt;　　如果在关闭DataReader对象之前你就已经结束读取不再想读取更多记录行的最好马上取消读取操作。&lt;/div&gt;
&lt;div&gt;　　DataReader类的关闭方法最终关闭对象前会不断读取所有余下的记录行。这太浪费资源。&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;最优方法 #7&lt;/strong&gt;&lt;br&gt;　　最好使用参数化的command（通常是存储过程）来处理动态的SQL查询。&lt;/div&gt;
&lt;div&gt;　　这会改善性能减少SQL注入攻击的机会，同时你的代码也更容易维护。&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;最优方法 #8&lt;/strong&gt;&lt;br&gt;　　在处理50或50条以上的记录行时最好对排序结果集进行分页。&lt;/div&gt;
&lt;div&gt;　　虽然多数情况下使用分页技术不太容易，但是它能让服务器端数据库和客户端应用程序减少任一时刻的开销和网络流量提高性能，&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;最优方法 #9&lt;/strong&gt;&lt;br&gt;　　在所有记录中加一个时间戳字段——我通常用‘creationdate’（创建日期）、‘lastupdate’（最后更新日期）字段。&lt;/div&gt;
&lt;div&gt;　　数据库内容被更新时，这会更容易检查。同时也更容易检查代码与数据源互操作的正确性。&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;最优方法 #10&lt;/strong&gt;&lt;br&gt;　　不要通过象 “SELECT *　”这样的方式返回数据。&lt;/div&gt;
&lt;div&gt;　　尽管一个“SELECT *”语句是编程最快速的写法，但它肯定是返回所有记录操作速度最慢的，难道你真的需要频繁访问所有列记录吗？请明确写出你要访问的列字段。&lt;/div&gt;
&lt;div&gt;=============================&lt;/div&gt;
&lt;div&gt;译文结束，以下是一些我看到的一些评论也一并翻译出来：&lt;/div&gt;
&lt;div&gt;-------------&lt;/div&gt;
&lt;div&gt;Phil(&lt;a href="http://weblogs.asp.net/plip"&gt;http://weblogs.asp.net/plip&lt;/a&gt;):&lt;br&gt;关于第5条，我更进一步。要确保你使用using语句&lt;br&gt;Using Conn As New SqlConnection()&lt;br&gt;using (SqlConnection Conn = new SqlConnection())&lt;br&gt;这会确保清空所有资源。&lt;/div&gt;
&lt;div&gt;-------------&lt;/div&gt;
&lt;div&gt;Michel(&lt;a href="http://blogs.wdevs.com/qc/"&gt;http://blogs.wdevs.com/qc/&lt;/a&gt;):&lt;br&gt;关于第6条“DataReader类的关闭方法最终关闭对象前会不断读取所有余下的记录行”。你肯定吗？我认为在Read()方法中就完成了这个工作。&lt;/div&gt;
&lt;div&gt;-------------&lt;/div&gt;
&lt;div&gt;Shahed Khan(&lt;a href="http://geekswithblogs.net/shahed"&gt;http://geekswithblogs.net/shahed&lt;/a&gt;):&lt;br&gt;为了回答第10条“难道你真的需要频繁访问所有列记录吗？”，我想说有许多人在使用N层模型的业务对象中使用了所有的列字段并且填充大量的业务对象。&lt;br&gt;　　Chris Gaskell回复：我明白你所说的依据是什么，但是在你的业务DTO(译者：详细的试验目标？)中你也要包括诸如“DateCreated”和“LastModified”这样的字段吗？&lt;/div&gt;
&lt;div&gt;-------------&lt;/div&gt;
&lt;div&gt;David Parslow(&lt;a href="http://parslow.spaces.msn.com/"&gt;http://parslow.spaces.msn.com/&lt;/a&gt;):&lt;br&gt;　　动态SQL查询实现以参数化command的来改善性能(想象中优于存储过程，但此处有争议)，减少了SQL注入攻击的机会(因为它被参数化了)，并且更容易维护代码(可以和OR-Mapper或者类似的技术)。所遇到的这些问题应该是静态查询(这比较常见)&lt;/div&gt;
&lt;div&gt;　　Chris Gaskell回复：似乎我给动态SQL查询一词的定义并不清楚。请看下面的一个动态查询示例（我想你能发现这和你的静态查询描述比较符合）&lt;br&gt;sql = @&amp;quot;SELECT Col1, Col2 FROM table WHERE id=&amp;quot; + id;&lt;/div&gt;
&lt;div&gt;-------------&lt;/div&gt;
&lt;div&gt;Richard Jonas(&lt;a href="http://www.richardjonas.com/blog"&gt;http://www.richardjonas.com/blog&lt;/a&gt;):&lt;br&gt;我想补充一个方法：&lt;br&gt;建立一个有限数量SQL查询列表，并把它保存在一个共用文件里，而不是让这些查询语句出现在所有代码文件当中。&lt;/div&gt;
&lt;div&gt;如果以后更改数据库，这会产生一些问题，计划中要更改所有影响SQL查询的文件，如果把SQL查询保存在一个共用文件里，并限制数量，这会减少更改量降低遗漏某些重要问题的风险。&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=7252450144899880511&amp;page=RSS%3a+Asp.Net%e6%95%b0%e6%8d%ae%e5%ba%93%e7%bc%96%e7%a8%8b%ef%bc%8d10%e6%9d%a1%e6%9c%80%e4%bc%98%e6%96%b9%e6%b3%95%5b%e7%bf%bb%e8%af%91%5d&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=bigqiangbigqiang.spaces.live.com&amp;amp;GT1=bigqiangbigqiang"&gt;</description><comments>http://bigqiangbigqiang.spaces.live.com/Blog/cns!64A5E0FB4DFCD63F!453.entry#comment</comments><guid isPermaLink="true">http://bigqiangbigqiang.spaces.live.com/Blog/cns!64A5E0FB4DFCD63F!453.entry</guid><pubDate>Sat, 05 Aug 2006 05:58:27 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://bigqiangbigqiang.spaces.live.com/blog/cns!64A5E0FB4DFCD63F!453/comments/feed.rss</wfw:commentRss><wfw:comment>http://bigqiangbigqiang.spaces.live.com/Blog/cns!64A5E0FB4DFCD63F!453.entry#comment</wfw:comment><dcterms:modified>2006-08-05T06:41:30Z</dcterms:modified></item></channel></rss>