﻿<?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>博客园-Ray's Blog</title><link>http://www.cnblogs.com/Rayinuk/</link><description>IT民工的生活～</description><language>zh-cn</language><lastBuildDate>Fri, 25 Jul 2008 23:56:09 GMT</lastBuildDate><pubDate>Fri, 25 Jul 2008 23:56:09 GMT</pubDate><ttl>60</ttl><item><title>【讨论】项目管理的从前与现在</title><link>http://www.cnblogs.com/Rayinuk/archive/2008/04/10/1146965.html</link><dc:creator>Ray Chang</dc:creator><author>Ray Chang</author><pubDate>Thu, 10 Apr 2008 08:04:00 GMT</pubDate><guid>http://www.cnblogs.com/Rayinuk/archive/2008/04/10/1146965.html</guid><wfw:comment>http://www.cnblogs.com/Rayinuk/comments/1146965.html</wfw:comment><comments>http://www.cnblogs.com/Rayinuk/archive/2008/04/10/1146965.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/Rayinuk/comments/commentRss/1146965.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Rayinuk/services/trackbacks/1146965.html</trackback:ping><description><![CDATA[这是在阅读笔记的时候所理解的，不知道大家有没有什么意见呢？<br />
<br />
在早期时候（从前），项目管理是侧重资源的控制，即对人力，资金，时间等进行控制，其目的是控制成本，提高效率。说到底，既是节约，其项目的成功与否是以企业的评价来衡量的，能以较低的成本，高效率的完成项目，会获得企业的高度评价。<br />
<br />
而现在的项目管理（现在），则是创造价值，体现价值，目的是提高项目产出物的质量，其成功与否不再是以企业的评价来衡量，而是以客户的评价来衡量，只有让客户满意才代表了项目的成功。<br />
<br />
小结一下，就是项目管理早期是注重的效率，而现在则是趋于品质。在中国，社会也是正按照这种趋势发展。客户的满意度直接决定了项目的成功与失败，而只有高质量的产品才会让客户感觉到满意。因此，对于一个项目，不求最快，只求最好！<br />
<br />
any comment?
<img src ="http://www.cnblogs.com/Rayinuk/aggbug/1146965.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41307/" target="_blank">[新闻]金山:360的免费杀毒只能是短期行为</a>]]></description></item><item><title>【娱乐】Windows错误音做成的音乐以及一个有意思的签名</title><link>http://www.cnblogs.com/Rayinuk/archive/2008/02/26/1082175.html</link><dc:creator>Ray Chang</dc:creator><author>Ray Chang</author><pubDate>Tue, 26 Feb 2008 06:00:00 GMT</pubDate><guid>http://www.cnblogs.com/Rayinuk/archive/2008/02/26/1082175.html</guid><wfw:comment>http://www.cnblogs.com/Rayinuk/comments/1082175.html</wfw:comment><comments>http://www.cnblogs.com/Rayinuk/archive/2008/02/26/1082175.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/Rayinuk/comments/commentRss/1082175.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Rayinuk/services/trackbacks/1082175.html</trackback:ping><description><![CDATA[<object height="400" width="480" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" xcodebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
<param name="Movie" value="http://player.youku.com/player.php/sid/XMTg3ODg0NTY="    /> <param name="Quality" value="high"   /><param name="wmode" value="transparent"   /><embed src="http://player.youku.com/player.php/sid/XMTg3ODg0NTY=" width="480" height="400" quality="high" wmode="transparent" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"   ></embed>
</object><br />
<br />
有意思的签名：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">丶丶丶当櫑欟欟櫑欟欟欟欟欟欟欟櫑欟櫑櫑翻麗謝叱丶丶丶丶丶<br />
丶丶丶覇竃櫑櫑欟欟欟欟欟欟欟櫑欟櫑欟欟欟層櫑艶旨丶丶丶丶<br />
丶丶丶層櫑欟欟欟欟欟欟欟欟欟嬲竃嬲竃竃欟櫑竃覇覇丶丶丶丶<br />
丶丶丶灑嬲欟欟嬲嬲嬲嬲嬲鬻辧卻眉贈幗層欟欟櫑竃櫑廴丶丶丶<br />
丶勹僧層櫑欟鬱綴綴局悦局局拇狐綴綴鋼幗幗竃欟竃櫑廬丶丶丶<br />
丶湘嬲嬲櫑欟辧綴仰災欠災沼卻局綴綴掴綱幗櫑嬲幗櫑廳丶丶丶<br />
丶勺覇欟櫑鬱即卻仰災災沿己卻凹句郊塀獅幗櫑櫑欟櫑勳丶丶丶<br />
丶丶濁幗欟圓扼卻仰災災沱災可沼笳鏑櫑雌彌幗櫑欟櫑欟眦丶丶<br />
丶丶層櫑櫑鬱狐猖旛幽迫己旧卻獅嬲嬲幗幗幗幗櫑欟櫑覇眇丶丶<br />
丶丶櫑欟欟鬱掴嚴憫笥局仰可局綮当踏審綱燒幗層欟櫑欟廴丶丶<br />
丶丶層覇櫑欟即尚旛籬籬枢叫猖鬱幣憫牒憫椹禰幗欟欟欟杉丶丶<br />
丶丶層欟櫑欟抓儕凹沼珱卻旧塀簡紹笳綴僻綴掴幗欟欟鬱丶丶丶<br />
丶丶丶層櫑欟仰卻旧突句己沒笵綴囹卻仰加仰塀禰層欟欟企丶丶<br />
丶丶丶瀰欟欟仰旧句災沼卻卻卻獅雌扼卻卻狐綴綱層欟欟歡丶丶<br />
丶丶丶湧欟欟紀凹句巡卻仰似局綴獅雌卻卻綴掴綱幗嬲覇黙丶丶<br />
丶丶丶丶層眼眼句旧卻卻鍵輔禰層嬲幗囹卻綴掴囃幗櫑歉丶丶丶<br />
丶丶丶丶勺龝圄句沒卻卻卻卻沺禰幗幗雌歳狐掴囃彌欟默丶丶丶<br />
丶丶丶丶丶丶丶句沒卻笳僻把洞雄櫺櫑顧綴鋼囃讃幗嚶丶丶丶丶<br />
丶丶丶丶丶丶丶勺句卻譲嬲霸嫻嬲幗難掴獅幗幗幗嬲艶二丶丶丶<br />
丶丶丶丶丶丶丶丶句旧卻卻綴掴燒辧辧讃幗幗幗幗杉欟欟幽丶丶<br />
丶丶丶丶丶丶丶丶丶刈皿狐卻仰瀉囃雌幗幗幗覇歉勺欟欟欟櫑幽<br />
丶丶丶丶丶丶丶丶丶丶勺牋綴燒雌幗幗幗幗幗鬱三儲欟欟欟櫑櫑<br />
丶丶丶丶丶丶丶丶二旛櫑封贈簡幗難幗幗櫑鬱災三灑欟欟欟櫑欟<br />
丶丶丶丶丶丶澁櫑櫑櫑櫑歡兆卻塀綱幗幗黙冖三消欟欟欟欟欟覇<br />
丶丶丶澁籬櫑櫑櫑櫑櫑櫑置丶筍綴綴諜冖丶丶三瀰欟欟欟欟欟覇<br />
丶誕櫑櫑櫑櫑櫑櫑櫑欟櫑置丶勺朔薪丶丶丶丶勺欟欟欟欟欟櫑櫑<br />
灑櫑櫑櫑櫑櫑櫑櫑櫑欟欟置丶俎幗雛止丶丶丶儲欟欟欟欟欟櫑櫑<br />
欟櫑櫑櫑櫑櫑櫑櫑櫑櫑欟置丶欟攜層櫑幽丶丶灑欟欟欟欟欟櫑櫑</span></div>
<img src ="http://www.cnblogs.com/Rayinuk/aggbug/1082175.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41306/" target="_blank">[新闻]江民科技回应杀毒软件免费说 没病不能乱吃药</a>]]></description></item><item><title>08年, 充电的无奈，CSDN的无奈，Google Group的无奈。。</title><link>http://www.cnblogs.com/Rayinuk/archive/2008/02/26/1081945.html</link><dc:creator>Ray Chang</dc:creator><author>Ray Chang</author><pubDate>Tue, 26 Feb 2008 04:00:00 GMT</pubDate><guid>http://www.cnblogs.com/Rayinuk/archive/2008/02/26/1081945.html</guid><wfw:comment>http://www.cnblogs.com/Rayinuk/comments/1081945.html</wfw:comment><comments>http://www.cnblogs.com/Rayinuk/archive/2008/02/26/1081945.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Rayinuk/comments/commentRss/1081945.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Rayinuk/services/trackbacks/1081945.html</trackback:ping><description><![CDATA[<img src="http://www.cnblogs.com/Emoticons/qface/055242240.gif"  alt="" />先给大家拜个晚年了～<br />
<br />
过完了春节，懒散许久的心情多少有些恢复，最近在组里大家也都兴致勃勃的计划着新一年的充电安排。。也因此大家伙决定建立个不公开的Blog进行学习的交流。。结果遇到了些无奈的事情，着实让人小郁闷。。。<br />
<br />
1. CSDN不能公开。。由于CSDN强大的资源库，让我们做为首选，然而遗憾的是，其并不支持&#8220;封闭式&#8221;，必须是公开的 Blog。。无奈，放弃。。。<br />
2. Google Group, 在国外的时候使用过Google Group，简单的界面但却很实用，可以限定访问权限，于是申请之，成功。。然而，发现在我们每次回复的时候，需要大约3-5分钟的迟缓才能显示。。。相关数据显示不准确（成员人数等～），而创建的新贴有时候在主页显示存在（例如：发贴数量），但是进入相应版块却是不知所踪，无奈。。。<br />
3. M群，在公司能够很好的利用该群进行交流，特别 是其群友博客的设置，让我感觉很好，但是。。。。。GoogleGroup的不能订阅，无奈，CSDN不能订阅，无奈。。。<br />
<br />
总结：看来看去，还是CNBlog最好啊~在新的一年里，希望我不要再有这么多无奈了～
<img src ="http://www.cnblogs.com/Rayinuk/aggbug/1081945.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41306/" target="_blank">[新闻]江民科技回应杀毒软件免费说 没病不能乱吃药</a>]]></description></item><item><title>将一个DataTable分解成多个DataTable</title><link>http://www.cnblogs.com/Rayinuk/archive/2007/04/11/709336.html</link><dc:creator>Ray Chang</dc:creator><author>Ray Chang</author><pubDate>Wed, 11 Apr 2007 10:04:00 GMT</pubDate><guid>http://www.cnblogs.com/Rayinuk/archive/2007/04/11/709336.html</guid><wfw:comment>http://www.cnblogs.com/Rayinuk/comments/709336.html</wfw:comment><comments>http://www.cnblogs.com/Rayinuk/archive/2007/04/11/709336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Rayinuk/comments/commentRss/709336.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Rayinuk/services/trackbacks/709336.html</trackback:ping><description><![CDATA[- Ray Chang &nbsp;2007年4月11日 <br>这两天遇到一个问题，我们所接触的一个系统在导出数据到Excel的时候，产生了内存溢出的错误。原因在于数据过大，它导出是将所有数据存放在一个DataSet的一个表中，再将这个数据集放入session,在导出功能所在的页面再读取该session的值，并绑定在一个DataGrid，再进行相关导出处理。因为系统不是我们开发的，我们就打算在数据存入session的时候，将数据表分解成多个表存入DataSet,这样在绑定DataGrid并处理的时候，能够一个个table的处理。测试后证明，方法是成功了。下面就把代码一贴，有类似需求的可以大概看看，希望能有所帮助。<br><br>C# 代码：<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;summary&gt;</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;分解数据表<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;/summary&gt;</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;param&nbsp;name="originalTab"&gt;</span><span style="COLOR: #008000">需要分解的表</span><span style="COLOR: #808080">&lt;/param&gt;</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;param&nbsp;name="rowsNum"&gt;</span><span style="COLOR: #008000">每个表包含的数据量</span><span style="COLOR: #808080">&lt;/param&gt;</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;returns&gt;&lt;/returns&gt;</span><span style="COLOR: #808080"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;DataSet&nbsp;SplitDataTable(DataTable&nbsp;originalTab,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;rowsNum)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">获取所需创建的表数量</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;tableNum&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;originalTab.Rows.Count&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;rowsNum;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">获取数据余数</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;remainder&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;originalTab.Rows.Count&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;rowsNum;<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;DataSet&nbsp;ds&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;DataSet();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果只需要创建1个表，直接将原始表存入DataSet</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(tableNum&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<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;&nbsp;ds.Tables.Add(originalTab);<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;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><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;&nbsp;DataTable[]&nbsp;tableSlice&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;DataTable[tableNum];<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;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Save&nbsp;orginal&nbsp;columns&nbsp;into&nbsp;new&nbsp;table.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;c</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">tableNum;&nbsp;c</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;tableSlice[c]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;DataTable();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">foreach</span><span style="COLOR: #000000">(DataColumn&nbsp;dc&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">&nbsp;originalTab.Columns)<br>&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;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tableSlice[c].Columns.Add(dc.ColumnName,dc.DataType);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&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;&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;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Import&nbsp;Rows</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;tableNum;&nbsp;i&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;if&nbsp;the&nbsp;current&nbsp;table&nbsp;is&nbsp;not&nbsp;the&nbsp;last&nbsp;one</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(i&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;tableNum&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">rowsNum&nbsp;;&nbsp;j&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;((i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">rowsNum);&nbsp;j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&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>&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;tableSlice[i].ImportRow(originalTab.Rows[j]);<br>&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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;k&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">rowsNum&nbsp;;&nbsp;k&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;((i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">rowsNum</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">remainder);&nbsp;k</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&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>&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;tableSlice[i].ImportRow(originalTab.Rows[k]);<br>&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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;}&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;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">add&nbsp;all&nbsp;tables&nbsp;into&nbsp;a&nbsp;dataset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">foreach</span><span style="COLOR: #000000">(DataTable&nbsp;dt&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">&nbsp;tableSlice)<br>&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;ds.Tables.Add(dt);<br>&nbsp;&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;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;ds;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br><br>VB.NET 代码：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #008000">'</span><span style="COLOR: #008000">===============================================================================</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">'</span><span style="COLOR: #008000">&nbsp;Author:&nbsp;Ray&nbsp;Chang</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">'</span><span style="COLOR: #008000">&nbsp;Date:&nbsp;2007/04/11</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">'</span><span style="COLOR: #008000">&nbsp;Description:&nbsp;This&nbsp;function&nbsp;splits&nbsp;a&nbsp;givin&nbsp;datatabe&nbsp;into&nbsp;several&nbsp;tables&nbsp;and&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">'</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;create&nbsp;a&nbsp;new&nbsp;dataset&nbsp;to&nbsp;hold&nbsp;these&nbsp;tables.&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">'</span><span style="COLOR: #008000">================================================================================</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Function</span><span style="COLOR: #000000">&nbsp;SplitDataTable(</span><span style="COLOR: #0000ff">ByVal</span><span style="COLOR: #000000">&nbsp;originalTab&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;DataTable,&nbsp;</span><span style="COLOR: #0000ff">ByVal</span><span style="COLOR: #000000">&nbsp;rowsNum&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Integer</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;DataSet<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Dim</span><span style="COLOR: #000000">&nbsp;tableNum&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Integer</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;originalTab.Rows.Count&nbsp;</span><span style="COLOR: #000000">\</span><span style="COLOR: #000000">&nbsp;rowsNum<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Dim</span><span style="COLOR: #000000">&nbsp;remainder&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Integer</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;originalTab.Rows.Count&nbsp;</span><span style="COLOR: #0000ff">Mod</span><span style="COLOR: #000000">&nbsp;rowsNum<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Dim</span><span style="COLOR: #000000">&nbsp;ds&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;DataSet&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">New</span><span style="COLOR: #000000">&nbsp;DataSet<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">'</span><span style="COLOR: #008000">if&nbsp;one&nbsp;table&nbsp;is&nbsp;big&nbsp;enough&nbsp;to&nbsp;store,&nbsp;use&nbsp;one&nbsp;table</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">If</span><span style="COLOR: #000000">&nbsp;tableNum&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Then</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ds.Tables.Add(originalTab)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Else</span><span style="COLOR: #000000"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Dim</span><span style="COLOR: #000000">&nbsp;tableSlice(tableNum&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;DataTable<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">'</span><span style="COLOR: #008000">Save&nbsp;orginal&nbsp;columns&nbsp;into&nbsp;new&nbsp;table</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Dim</span><span style="COLOR: #000000">&nbsp;c&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Integer</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">For</span><span style="COLOR: #000000">&nbsp;c&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">To</span><span style="COLOR: #000000">&nbsp;(tableNum&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tableSlice(c)&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">New</span><span style="COLOR: #000000">&nbsp;DataTable<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">For</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Each</span><span style="COLOR: #000000">&nbsp;dc&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;DataColumn&nbsp;</span><span style="COLOR: #0000ff">In</span><span style="COLOR: #000000">&nbsp;originalTab.Columns<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tableSlice(c).Columns.Add(dc.ColumnName,&nbsp;dc.DataType)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Next</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Next</span><span style="COLOR: #000000"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">'</span><span style="COLOR: #008000">Import&nbsp;Rows</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Dim</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Integer</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">For</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">To</span><span style="COLOR: #000000">&nbsp;(tableNum&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">'</span><span style="COLOR: #008000">if&nbsp;the&nbsp;current&nbsp;table&nbsp;is&nbsp;not&nbsp;the&nbsp;last&nbsp;table</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">If</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;&gt;</span><span style="COLOR: #000000">&nbsp;tableNum&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Then</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Dim</span><span style="COLOR: #000000">&nbsp;j&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Integer</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">For</span><span style="COLOR: #000000">&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;rowsNum&nbsp;</span><span style="COLOR: #0000ff">To</span><span style="COLOR: #000000">&nbsp;(((i&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;rowsNum)&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tableSlice(i).ImportRow(originalTab.Rows(j))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Next</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Dim</span><span style="COLOR: #000000">&nbsp;k&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Integer</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">For</span><span style="COLOR: #000000">&nbsp;k&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;rowsNum&nbsp;</span><span style="COLOR: #0000ff">To</span><span style="COLOR: #000000">&nbsp;(((i&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;rowsNum&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;remainder)&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tableSlice(i).ImportRow(originalTab.Rows(k))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Next</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">End</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">If</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Next</span><span style="COLOR: #000000"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">'</span><span style="COLOR: #008000">Add&nbsp;all&nbsp;tables&nbsp;into&nbsp;a&nbsp;dataset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">For</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">Each</span><span style="COLOR: #000000">&nbsp;dt&nbsp;</span><span style="COLOR: #0000ff">As</span><span style="COLOR: #000000">&nbsp;DataTable&nbsp;</span><span style="COLOR: #0000ff">In</span><span style="COLOR: #000000">&nbsp;tableSlice<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ds.Tables.Add(dt)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Next</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">End</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">If</span><span style="COLOR: #000000"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">'</span><span style="COLOR: #008000">return&nbsp;dataset</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SplitDataTable&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ds<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">End&nbsp;Function</span></div>
<br>先用Ｃ＃写的，可是系统用的却是VB.NET,只能又转成了VB.NET. 整个方法返回一个包含了分解后的table的DataSet, 所传入的参数主要２个：一是所需要分解的表，还有一个是每一个表所包含的数据量，而最后一个表将会包含设定的数据量加上余数。至于转换后如何操作，我就不罗嗦了。<br><br>这个方法应用的地方不多，除非特别案例，如果那个系统从开头设计好，估计后期也不用做这种改动。总之贴出来，能用到大家就用吧。<br>- Ray Chang &nbsp;2007年4月11日 <br>
<img src ="http://www.cnblogs.com/Rayinuk/aggbug/709336.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41305/" target="_blank">[新闻]WCG2008中国区总决赛打响</a>]]></description></item><item><title>[转] 关于ASP.NET页面打印技术的总结</title><link>http://www.cnblogs.com/Rayinuk/archive/2007/04/06/702518.html</link><dc:creator>Ray Chang</dc:creator><author>Ray Chang</author><pubDate>Fri, 06 Apr 2007 03:41:00 GMT</pubDate><guid>http://www.cnblogs.com/Rayinuk/archive/2007/04/06/702518.html</guid><wfw:comment>http://www.cnblogs.com/Rayinuk/comments/702518.html</wfw:comment><comments>http://www.cnblogs.com/Rayinuk/archive/2007/04/06/702518.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Rayinuk/comments/commentRss/702518.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Rayinuk/services/trackbacks/702518.html</trackback:ping><description><![CDATA[<p>这是我目前看到的最好的一篇关于Asp.NET中打印技术的文章，介绍的很全面，对于遇到ASP.NET页面中打印问题的朋友帮助很大，现转贴出来希望能帮助到大家。<br>在这里非常感谢作者，可惜没看到原文，不知道作者是哪位了，这里真要谢谢你了！<br>--Ray Chang 2007年4月6日 拜读<br>========================================================================</p>
<p><br>网络打印概述<br>&#8226; B/S结构导致了Web应用程序中打印的特殊性。<br>&#8226; 程序运行在浏览器中，打印机在本地，而文件确可能在服务器上，导致了打印控制<br>不是很灵活。<br>&#8226; 格式如何控制和定制等，是我们开发中可能会面对的问题。<br>&nbsp;<br>打印文档的生成<br>&#8226; 1、客户端脚本方式<br>一般情况下，主要使用JS 可以分析源页面的内容，将欲打印的页面元素提取出来，实现打印。通过分析源文档的内容，可以生成打印目标文档。<br>优点：客户端独立完成打印目标文档的生成，减轻服务器负荷；<br>缺点：源文档的分析操作复杂，并且源文档中的打印内容要有约定。<br>&#8226; 2、服务器端程序方式<br>利用后台代码从数据库中读取打印源，生成打印目标文档。当的页面生成时，还应适当考虑使用CSS 来实现强制分页控制。<br>优点：可以生成内容非常丰富的打印目标文档，目标文档的内容的可控性强。由于打印内容是从数据库中获取的，所以生成操作相对简单；<br>缺点：服务器端负载比较大；<br>&nbsp;<br>页面设置<br>&#8226; 页面设置主要是指设置打印文档的页边距、页眉、页脚、纸张等内容。页面设置将直接影响到打印文档版面的生成效果，所以它和打印文档的生成有着密切的关系。比如：表格的行数、大小、位置、字体的大小等。<br>现有的技术是利用IE6.0 内置的打印模板方式来控制页面设置，其可以对打印目标文档产生非常大的影响。打印模板可以控制页边距、页眉、页脚、奇偶页等内容，并可以将用户的设置取得，还可以将设置发送到服务器端。打印模板技术可以自定预览窗口和打印格式，最大限度地影响目标文档和打印效果。<br>IE直接打印<br>&#8226; 即直接调用window.print或者webrower控件的ExecWB方法来打印。<br>&#8226; 优点：方便快捷，客户端无需任何设置即可。<br>&#8226; 缺点：打印控制不是很灵活。如果直接调用<br>&nbsp;<br>window.print来打印页面，页面上别的元素也会被打印处理，页头页尾的格式也不好控制。<br>&#8226; 常用方法：大部分情况会把查询的结果绑定到DataGrid上来，然后打印DataGrid。这种情况的打印一般来说格式比较固定简单，确定后基本不会再作更改。所以可以采用IE直接打印。<br>&nbsp;<br>【实例代码】<br>注：①这是客户端通过window.print打印指定内容。这里定义sprnstr和eprnstr来指定内容<br>&nbsp;&nbsp;&nbsp;&nbsp; 执行代码：<br>&nbsp;&nbsp;&nbsp; input type="button" name="print" value="预览并打印" onclick="preview()"&gt;</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp; ②如果直接使用window.print将打印页面上的所有内容，但是我们可以使用<br>st&lt;&lt;style&gt; @media Print { .Noprn { DISPLAY: none }}<br>是用来指定不打印的内容。<br>&nbsp; <br>script language="javascript"&gt;<br>function preview()<br>{<br>&nbsp;&nbsp;&nbsp; bdhtml=window.document.body.innerHTML;<br>&nbsp;&nbsp;&nbsp; sprnstr="&lt;!--startprint--&gt;";<br>&nbsp;&nbsp;&nbsp; eprnstr="&lt;!--endprint--&gt;";<br>&nbsp;&nbsp;&nbsp; prnhtml=bdhtml.substr(bdhtml.indexOf(sprnstr)+17);<br>&nbsp;&nbsp;&nbsp; prnhtml=prnhtml.substring(0,prnhtml.indexOf(eprnstr));<br>&nbsp;&nbsp;&nbsp; window.document.body.innerHTML=prnhtml;<br>&nbsp;&nbsp;&nbsp; window.print();<br>}<br>&lt;/script&gt;<br>&lt;!--省略部分代码--&gt;<br>&lt;form id="WebForm1" method="post" runat="server"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;center&gt;本部分以上不被打印&lt;/center&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--startprint--&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;div align="center"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:DataGrid id="dgShow" runat="server"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--省略部分代码--&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/asp:DataGrid&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/div&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--endprint--&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;center&gt;本部分以下不被打印&lt;/center&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;div align="center"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="button" name="print" value="预览并打印" onclick="preview()"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/div&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;style&gt; @media Print { .Noprn { DISPLAY: none }}<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/style&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;p class="Noprn"&gt;不打印&lt;/p&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;table id="datagrid"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;打印&lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/table&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;input class="Noprn" type="button" onclick="window.print()" value="print"&gt;<br>&lt;/form&gt;</p>
<p><br>WebBrowser 控件技术<br>&#8226; 打印操作的实现<br>此功能的实现主要是利用WebBrowser控件的函数接口来实现打印、打印预览（默认的）、<br>页面设置（默认的）。<br>&lt;object ID=&#8216;WebBrowser1&#8217; WIDTH=0 HEIGHT=0<br>CLASSID=&#8216;CLSID:8856F961-340A-11D0-A96B-00C04FD705A2&#8217;&gt;<br>//打印<br>WebBrowser1.ExecWB(6,1);<br>//打印设置<br>WebBrowser1.ExecWB(8,1);<br>//打印预览<br>WebBrowser1.ExecWB(7,1);<br>//直接打印<br>WebBrowser1.ExecWB(6,6);<br>&nbsp;【实例代码】<br>//自定义类PrintClass<br>public string DGPrint(DataSet ds)<br>{<br>&nbsp;&nbsp;&nbsp; //DGPrint执行的功能：根据DataTable转换成对应的HTML对应的字符串<br>&nbsp;&nbsp;&nbsp;&nbsp; DataTable myDataTable=new DataTable();<br>&nbsp;&nbsp;&nbsp;&nbsp; myDataTable=ds.Tables[0];<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; int myRow=myDataTable.Rows.Count; <br>&nbsp;&nbsp;&nbsp;&nbsp; int myCol=myDataTable.Columns.Count;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; StringBuilder sb=new StringBuilder(); <br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; string colHeaders="&lt;html&gt;&lt;body&gt;"+"&lt;object ID='WebBrowser' WIDTH=0 HEIGHT=0 CLASSID='CLSID:8856F961-340A-11D0-A96B-00C04FD705A2'VIEWASTEXT&gt;&lt;/object&gt;" +"&lt;table&gt;&lt;tr&gt;"; <br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;myCol;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; colHeaders +="&lt;td&gt;"+ myDataTable.Columns[i].ColumnName.ToString()+"&lt;/td&gt;";<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; colHeaders += "&lt;/tr&gt;";<br>&nbsp;&nbsp;&nbsp;&nbsp; sb.Append(colHeaders);<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;myRow;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.Append("&lt;tr&gt;");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=0;j&lt;myCol;j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.Append("&lt;td&gt;");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.Append(myDataTable.Rows[i][j].ToString().Trim());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.Append("&lt;/td&gt;");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.Append("&lt;/tr&gt;");&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; sb.Append("&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;"); <br>&nbsp;&nbsp;&nbsp;&nbsp; colHeaders=sb.ToString();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; colHeaders+="&lt;script languge='javascript'&gt;WebBrowser.ExecWB(6,1); window.opener=null;window.close();&lt;/script&gt;";<br>&nbsp;&nbsp;&nbsp;&nbsp; return(colHeaders);<br>}<br>&nbsp;<br>//页面：打印按钮事件<br>PrintClass myP = new PrintClass();<br>Response.Write(myP.DGPrint(Bind()));</p>
<p>在把DataGrid转换为对应的HTML代码时，如果存在按钮列就会报错，最好把这一列隐藏，一般只能转换数据列。其次要注意分页问题，一般只能打印当前一页，最好在打印之前除掉分页<br>导出到Excel，Word中去打印<br>&#8226; 可以在服务端或者客户端进行。<br>&#8226; 优点：使用这种方法，可适应性比较强，控制较好。<br>&#8226; 缺点：在服务端使用的话，要求服务端要安装Word，Excel，在客户端使用的话，要<br>求客户端在IE的安全设置上有一定要求。<br>【实例代码】<br>protected void btnMIME_Click(object sender, System.EventArgs e)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; BindData();<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; Response.ContentType = "application/vnd.ms-excel";<br>&nbsp;&nbsp;&nbsp;&nbsp; Response.AddHeader("Content-Disposition", "inline;filename="+HttpUtility.UrlEncode("下载文件.xls",Encoding.UTF8));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; //如果输出为Word，修改为以下代码<br>&nbsp;&nbsp;&nbsp;&nbsp; //Response.ContentType = "application/ms-word" <br>&nbsp;&nbsp;&nbsp;&nbsp; //Response.AddHeader("Content-Disposition", "inline;filename=test.doc") <br>&nbsp;&nbsp;&nbsp;&nbsp; StringBuilder sb=new StringBuilder(); <br>&nbsp;&nbsp;&nbsp;&nbsp; System.IO.StringWriter sw = new System.IO.StringWriter(sb);<br>&nbsp;&nbsp;&nbsp;&nbsp; System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(sw);<br>&nbsp;&nbsp;&nbsp;&nbsp; sb.Append("&lt;html&gt;&lt;body&gt;");<br>&nbsp;&nbsp;&nbsp;&nbsp; dgShow.RenderControl(hw);<br>&nbsp;&nbsp;&nbsp;&nbsp; sb.Append("&lt;/body&gt;&lt;/html&gt;"); <br>&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(sb.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp; Response.End();<br>}<br>&nbsp;<br>protected void btnCom_Click(object sender, System.EventArgs e)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; ExportToExcel(BindData(),Server.MapPath("ComExcel.xls"));<br>&nbsp;<br>}<br>//从DataSet到出到Excel<br>#region从DataSet到出到Excel<br>///导出指定的Excel文件<br>public void ExportToExcel(DataSet ds,string strExcelFileName)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; if (ds.Tables.Count==0 || strExcelFileName=="") return;<br>&nbsp;&nbsp;&nbsp;&nbsp; doExport(ds,strExcelFileName);<br>}<br>///执行导出<br>private void doExport(DataSet ds,string strExcelFileName)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; Excel.Application excel= new Excel.Application();<br>&nbsp;&nbsp;&nbsp;&nbsp; int rowIndex=1;<br>&nbsp;&nbsp;&nbsp;&nbsp; int colIndex=0;<br>&nbsp;&nbsp;&nbsp;&nbsp; excel.Application.Workbooks.Add(true);<br>&nbsp;&nbsp;&nbsp;&nbsp; System.Data.DataTable table=ds.Tables[0] ;<br>&nbsp;&nbsp;&nbsp;&nbsp; foreach(DataColumn col in table.Columns)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; colIndex++;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excel.Cells[1,colIndex]=col.ColumnName;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; foreach(DataRow row in table.Rows)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rowIndex++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; colIndex=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach(DataColumn col in table.Columns)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; colIndex++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excel.Cells[rowIndex,colIndex]=row[col.ColumnName].ToString();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; excel.Visible=false;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; excel.ActiveWorkbook.SaveAs(strExcelFileName+".XLS",Excel.XlFileFormat.xlExcel9795,null,null,false,false,Excel.XlSaveAsAccessMode.xlNoChange,null,null,null,null,null);<br>&nbsp;&nbsp;&nbsp;&nbsp; excel.Quit();<br>&nbsp;&nbsp;&nbsp;&nbsp; excel=null;<br>&nbsp;&nbsp;&nbsp;&nbsp; GC.Collect();//垃圾回收<br>}<br>#endregion<br>利用.NET组件打印<br>利用.NET组件<br>&#8226; 优点：这种打印方式对于格式变化大，数据量小的应用来说非常合适。<br>&#8226; 缺点：<br>&#8211; 需要客户端安装NET framework组件。<br>&#8211; XML的解析上，如果文件较大速度上不是很理想。<br>&#8211; 页面首次加载时会有明显的延时。<br>&nbsp;<br>使用XSL和XSLT转换XML<br>&#8226; XSL：扩展样式表语言，可以通过它来把XML转换为其他的文本格式<br>&#8226; XSL转换包括发现或者选择一个模式匹配，通过使用XPath选择一个结果集，然后对结果集中的每一项，为这些匹配定义结果输出。<br>&#8226; XSL是一个功能强大的工具，可以把XML转换成任何你想要的格式。<br>【参考代码】<br>XslTransform xslt = new XslTransform();<br>xslt.Load(Server.MapPath( "StudentsToHTML.xsl") );<br>&nbsp;<br>XPathDocument XDoc = new XPathDocument(Server.MapPath( "Students.XML" ));<br>XmlWriter writer = new XmlTextWriter( Server.MapPath("Students.html"), System.Text.Encoding.UTF8 );<br>xslt.Transform( XDoc, null, writer );<br>writer.Close();<br>Response.Redirect("Students.html");<br>利用ActiveX控件打印<br>利用第三方控件<br>&#8226; 自己开发控件。这种方式很多商用软件采用这种方式，写成控件后已经无所谓是在web中使用还是应用程序中使用了。<br>&#8226; 优点：打印方式非常灵活，基本上程序能做到的web也能做得到。<br>&#8226; 缺点：客户端需要安装组件，部署不是很方便。<br>使用水晶报表<br>&#8226; 用户仅需要Web 浏览器就可以查看报表<br>&#8226; 报表查看器控件可以是应用程序中众多控件之一。<br>&#8226; 与报表轻松交互<br>&#8226; 用户可将报表导出为Microsoft Word 和Excel 格式，以及PDF、HTML 和Crystal Reports for Visual Studio .NET格式。<br>&#8226; 可以使用报表控件直接打印<br>&nbsp;<br>【实例代码】<br>//水晶报表的填充，省略连接代码<br>myReport ReportDoc = new myReport();<br>ReportDoc.SetDataSource(ds);<br>Crv.ReportSource = ReportDoc;<br>&nbsp;<br>//输出为指定类型文件<br>CrystalDecisions.Shared.DiskFileDestinationOptions DiskOpts = new&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CrystalDecisions.Shared.DiskFileDestinationOptions();<br>ReportDoc.ExportOptions.ExportDestinationType = CrystalDecisions.Shared.ExportDestinationType.DiskFile;<br>string strFileName = Server.MapPath("Output");<br>switch (ddlFormat.SelectedItem.Text)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; case "Rich Text (RTF)":<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReportDoc.ExportOptions.ExportFormatType =&nbsp;&nbsp; CrystalDecisions.Shared.ExportFormatType.RichText;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DiskOpts.DiskFileName =strFileName + ".rtf";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp; case "Portable Document (PDF)":<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReportDoc.ExportOptions.ExportFormatType =&nbsp;&nbsp; CrystalDecisions.Shared.ExportFormatType.PortableDocFormat;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DiskOpts.DiskFileName = strFileName + ".pdf";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp; case "MS Word (DOC)":<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReportDoc.ExportOptions.ExportFormatType =&nbsp;&nbsp; CrystalDecisions.Shared.ExportFormatType.WordForWindows;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DiskOpts.DiskFileName = strFileName + ".doc";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp; case "MS Excel (XLS)":<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReportDoc.ExportOptions.ExportFormatType =&nbsp;&nbsp; CrystalDecisions.Shared.ExportFormatType.Excel;//<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DiskOpts.DiskFileName = strFileName + ".xls";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp; default:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>}<br>ReportDoc.ExportOptions.DestinationOptions = DiskOpts;<br>ReportDoc.Export();<br>&nbsp;<br>//打印<br>// 指定打印机名称&nbsp;&nbsp; <br>string strPrinterName; <br>strPrinterName = @"Canon Bubble-Jet BJC-210SP";<br>// 设置打印页边距<br>PageMargins margins; <br>margins = ReportDoc.PrintOptions.PageMargins; <br>margins.bottomMargin = 250; <br>margins.leftMargin = 350; <br>margins.rightMargin = 350; <br>margins.topMargin = 450;&nbsp;&nbsp;&nbsp;&nbsp; <br>ReportDoc.PrintOptions.ApplyPageMargins(margins);&nbsp;&nbsp;&nbsp;&nbsp; <br>//应用打印机名称<br>ReportDoc.PrintOptions.PrinterName = strPrinterName;&nbsp;&nbsp;&nbsp;&nbsp; <br>// 打印&nbsp;&nbsp; // 打印报表。将startPageN 和endPageN <br>// 参数设置为0 表示打印所有页。<br>ReportDoc.PrintToPrinter(1, false,0,0);&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>========================================================================</p>
<img src ="http://www.cnblogs.com/Rayinuk/aggbug/702518.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41304/" target="_blank">[新闻]新型的编程语言:eC</a>]]></description></item><item><title>关于aspnet_profile表中的数据格式</title><link>http://www.cnblogs.com/Rayinuk/archive/2007/04/03/698096.html</link><dc:creator>Ray Chang</dc:creator><author>Ray Chang</author><pubDate>Tue, 03 Apr 2007 04:44:00 GMT</pubDate><guid>http://www.cnblogs.com/Rayinuk/archive/2007/04/03/698096.html</guid><wfw:comment>http://www.cnblogs.com/Rayinuk/comments/698096.html</wfw:comment><comments>http://www.cnblogs.com/Rayinuk/archive/2007/04/03/698096.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/Rayinuk/comments/commentRss/698096.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Rayinuk/services/trackbacks/698096.html</trackback:ping><description><![CDATA[<strong>关于aspnet_profile表中的数据格式<br></strong>作者：Ray<br>日期：2007年4月3日<br><br>上次谈membership的时候，说起这个表中的&#8220;分隔符&#8221;不知道是什么格式，查了以后，获取到了下面的信息。<br><br>aspnet_profile有着属于自己的格式，例如：<br>&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;<span style="COLOR: #0000ff">Department:S:0:12:Project:S:12:15:</span>&nbsp;&nbsp;&nbsp;&nbsp;<br><br>这里面，我们可以看到它们主要是利用&nbsp; 字母:数字1:数字2 来区分，那这些又代表什么呢？解释如下：<br><br>字母：代表类型，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">S&nbsp;= String&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B = Binary</span>&nbsp;<br><br>数字1：代表开始字节位置<br><br>数字2：代表值的长度<br><br>举个例子：<br><span style="COLOR: #0000ff"><u>PropertyNames</u><br>Department:S:0:12:Project:S:12:15:&nbsp;&nbsp;&nbsp;&nbsp;<br><br><u>PropertyValues</u><br>department 2credit sussis 2</span><br><br>我们可以看到，Department这个Property的值类型是S,从0开始计算12个字节，在PropertyValues中我们则可得出department2的结果，Project类似，得出credit sussis 2。<br><br>明白了这个分隔符的规则后，或许可以找出相应的方法去从aspnet_profile中分析出profile数据，有知道的朋友还请指导一下。<br>
<img src ="http://www.cnblogs.com/Rayinuk/aggbug/698096.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41303/" target="_blank">[新闻]免费的BitDefender能复制卡巴斯基的成功吗?</a>]]></description></item><item><title>初步掌握ASP.NET 2.0 Login控件 - 角色管理</title><link>http://www.cnblogs.com/Rayinuk/archive/2007/04/02/696711.html</link><dc:creator>Ray Chang</dc:creator><author>Ray Chang</author><pubDate>Mon, 02 Apr 2007 03:03:00 GMT</pubDate><guid>http://www.cnblogs.com/Rayinuk/archive/2007/04/02/696711.html</guid><wfw:comment>http://www.cnblogs.com/Rayinuk/comments/696711.html</wfw:comment><comments>http://www.cnblogs.com/Rayinuk/archive/2007/04/02/696711.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/Rayinuk/comments/commentRss/696711.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Rayinuk/services/trackbacks/696711.html</trackback:ping><description><![CDATA[&nbsp;
<p><strong><span>初步掌握ASP.NET 2.0 </span><span>Login</span></strong><strong><span>控件</span><span> -&nbsp;</span></strong><strong><span>角色管理</span></strong></p>
<p><strong><span>作者：</span></strong><strong><span>Ray </span></strong><strong><span><br></span></strong><strong><span>时间：</span></strong><strong><span>&nbsp;2007</span></strong><strong><span>年</span></strong><strong><span>4</span></strong><strong><span>月</span></strong><strong><span>2&nbsp;</span></strong><strong><span>日<br><a href="http://www.cnblogs.com/Rayinuk/archive/2007/04/02/696711.html">http://www.cnblogs.com/Rayinuk/archive/2007/04/02/696711.html</a><br><br></span></strong></p>
<p><span>总结一下角色管理方面的东西。</span></p>
<p><span>先给出</span><span>MSDN</span><span>有关</span><span>Role Manager</span><span>的文章，大家可以去看看：</span></p>
<p><span>http://msdn2.microsoft.com/en-us/library/ms998314.aspx</span></p>
<p><span><br>在最初的时候，我并没有想着去使用</span><span>VS</span><span>的角色管理，而是想自己创建一套自己的角色管理机制，这样可能会更灵活一些，但在后期，我还是改变了，处于学习的理由，我还是认为自己建立一套角色管理机制和权限机制会更加灵活。。</span></p>
<p><span>类似于</span><span>Profile, </span><span>我们仍需要在</span><span>web.config</span><span>启动</span><span>Role Manager</span><span>。这里插一句，其实我们可以在</span><span>IIS</span><span>中配置</span><span>ASP.NET</span><span>的属性，包括我们一起所做的修改均可以界面化实现，其配制按默认存储在</span><span>WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\web.config </span><span>，大家可以先行设置，然后去该文件察看。</span></p>
<p><span>在</span><span>Web.config</span><span>中配置如下：</span></p>
<p align=left><span><span></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">roleManager&nbsp;</span><span style="COLOR: #ff0000">enabled</span><span style="COLOR: #0000ff">="true"</span><span style="COLOR: #ff0000">&nbsp;defaultProvider</span><span style="COLOR: #0000ff">="SqlRoleManager"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">providers</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">add&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="SqlRoleManager"</span><span style="COLOR: #ff0000">&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</span><span style="COLOR: #0000ff">="System.Web.Security.SqlRoleProvider"</span><span style="COLOR: #ff0000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connectionStringName</span><span style="COLOR: #0000ff">="LocalSQLServer"</span><span style="COLOR: #ff0000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;applicationName</span><span style="COLOR: #0000ff">="FBHelper"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">providers</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">roleManager</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p align=left><br>&nbsp;&nbsp;&nbsp; <br></span></span><span>这里要提到的是里面的</span><span>connectionStringName</span><span>可设置为你当前</span><span>web.config</span><span>里已定义的连接字符串，不需要重新建立，</span><span>applicationName</span><span>则是你当前系统的名称（解决方案名称）。</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>Ok, </span><span>我们启用了</span><span>Role Manager</span><span>后，可在前台进行相关的操作。但在此前，我们需要先定义角色。定义一个角色可以采取以下方法：</span></p>
<p align=left><span><span>1）&nbsp;</span></span><span>利用</span><span>Role Provider</span><span>在前台代码实现。如下：</span></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Web.Security;&nbsp;<br><br></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">Roles.RoleExists(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">TestRole</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">))&nbsp;<br><br>{&nbsp;<br><br>&nbsp;Roles.CreateRole(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">TestRole</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><br>}<br><br></span></div>
<p align=left><span><span>2）&nbsp;</span></span><span>在数据库利用存储过程实现。利用</span><span>aspnet_roles_createrole</span><span>实现，如下：</span><span></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">EXEC</span><span style="COLOR: #000000">&nbsp;aspnet_Roles_CreateRole&nbsp;</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">ThisApplication</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">NewRole</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">EXEC</span><span style="COLOR: #000000">&nbsp;aspnet_UsersInRoles_AddUsersToRoles&nbsp;</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">ThisApplication</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">ThisUser</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">NewRole</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">,&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">8</span><span style="COLOR: #000000">&nbsp;</span></div>
<p align=left></span><span><br>所创建的</span><span>Role</span><span>将会存储在</span><span>aspnet_roles</span><span>中</span><span>，</span><span>和</span><span>aspnet_applications</span><span>及</span><span>aspnet_users</span><span>中</span><span>，</span><span>这个稍后再提。</span></p>
<p align=left><span>创建完角色后，我们可以在前台直接将用户分配给一个角色。</span> <span>比如我们现在需要在注册完一个新用户后，直接给用户分配一个角色。正如</span><span><a href="http://www.cnblogs.com/Rayinuk/archive/2007/03/30/694163.html"><span><span>上篇文章</span></span></a></span><span>所讲的，在添加用户的地方（</span><span>CreateUserWizard1_CreatedUser</span><span>事件中），我们可以添加以下代码来实现：</span></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;添加用户实现代码<br>&nbsp;<br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">添加用户至角色中</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>Roles.AddUserToRole(CreateUserWizard1.UserName,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Dept1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><br>&nbsp;<br></span></div>
<p align=left><span>上面的代码中，我是</span><span>Hard Code</span><span>了</span> <span>&#8220;</span><span>Dept1 </span><span>&#8221;这个角色，这个应该是</span><span>Role</span><span>的名称，主要根据自己项目中的设计来定了。</span></p>
<p align=left><span>OK,</span><span>现在我们可以检查一下数据库里发生的情况。角色</span> <span>的数据主要体现在</span><span>3</span><span>个表中，分别是：</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Aspnet_application</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Aspnet_users</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Aspnet_Roles</span></p>
<p align=left>&nbsp;<span>我第一次查看的时候，</span><span>aspnet_roles</span><span>存储的自然是我们所创建的</span><span>Role</span><span>的信息，但是</span><span>Role</span><span>与用户的关系体现在那里呢？后来我看到了</span><span>aspnet_user</span><span>表中多出了一个相同用户，但</span><span>applicationID </span><span>和</span><span> UserID</span><span>不同的数据，依此又查出在</span><span>aspnet_application</span><span>表中添加了一个新的</span><span>application</span><span>记录，我才明白，<strong>对于一个角色和用户的关系，系统将之定义为一个新的</strong></span><strong><span>application</span></strong><strong><span>，即看成一个新的机制，存储于上述的表中，因此在</span><span>aspnet_users</span></strong><strong><span>表中虽然有两条相同用户数据的记录，但是却处于不同的</span><span>application. </span></strong></p>
<p align=left><span>这是我目前对该机制的一个看法，不知道是不是正确的，还请知道的朋友确认一下。</span><strong></strong></p>
<p align=left>&nbsp;</p>
<p align=left><span>也因此，在我们想要从</span><span>aspnet_users</span><span>表中获取用户数据的时候，需要加入相应的条件来进行筛选。但只是获取自己系统用户的时候使用，因为对于</span><span>Role</span><span>系统，前台我们可以利用</span><span>.NET</span><span>的</span><span>Roles Manager</span><span>来处理。当然前台的</span><span>Membership Manager</span><span>在进行用户操作的时候，操作对象也是自动的指向了系统的用户，而不是角色系统中的用户。例如：删除一个用户时，表中的</span><span>Role</span><span>关系的用户依然存在。出于这种情况，看来需要手工代码来实现删除用户的同时，删除角色与用户的关系，以免数据库出现垃圾数据。</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>最后一步就是看如何在前台利用</span><span>Role Managers</span><span>进行角色信息的调用了。</span></p>
<p align=left><span>这个很简单，看看帮助就都出来了，这里就举个例子，一看就明白了：</span></p>
<p align=left><span>在</span><span>Login</span><span>控件中设置好</span><span>Destination</span><span>，例如</span><span>Default.aspx, </span><span>我们需要根据当前角色的不同，跳转到不同的界面，那么我们在</span><span>Default.aspx</span><span>的</span><span>Page_Load</span><span>中加入以下代码可以实现：</span></p>
<span><span>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Page_Load(</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">&nbsp;sender,&nbsp;EventArgs&nbsp;e)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lblMsgRole.Text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">您的角色是&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;Roles.GetRolesForUser(Profile.UserName)[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Write(</span><span style="COLOR: #000000">@"</span><span style="COLOR: #000000">&lt;script&nbsp;&nbsp;&nbsp;language='javascript'&gt;alert('注意:10秒钟后&nbsp;&nbsp;&nbsp;页面将自动跳转到您的部门页面!');&lt;/script&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(Roles.GetRolesForUser(Profile.UserName)[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].Equals(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Dept1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Write(</span><span style="COLOR: #000000">@"</span><span style="COLOR: #000000">&lt;script&nbsp;&nbsp;&nbsp;language='javascript'&gt;setTimeout('',10000);&lt;/script&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Write(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;meta&nbsp;&nbsp;&nbsp;http-equiv='refresh'&nbsp;&nbsp;&nbsp;content='10;URL=./dept1.aspx'&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span><span style="COLOR: #008000">//<br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Write(</span><span style="COLOR: #000000">@"</span><span style="COLOR: #000000">&lt;script&nbsp;&nbsp;&nbsp;language='javascript'&gt;setTimeout('',10000);&lt;/script&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Write(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;meta&nbsp;&nbsp;&nbsp;http-equiv='refresh'&nbsp;&nbsp;&nbsp;content='10;URL=./dept2.aspx'&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span><span style="COLOR: #008000">//<br></span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br></span></div>
<p align=left></span></span><span>可以看到，我们可以利用</span><span>Roles</span><span>.GetRolesForUser(Profile.UserName)[0];</span><span>来获取当前登录用户的角色信息，在根据角色的内容来做相关的处理。</span><span> </span><span>当然，这只是</span><span>Roles Manager</span><span>中的其中一个简单的应用，还有很多功能可以再从</span><span>MSDN</span><span>中获取学习。</span></p>
<p align=left><span>通过这两章的内容，应该可以基本上将</span><span>Login</span><span>控件应用于自己的系统，并将</span><span>.NET</span><span>预定义的数据库和自己的数据库连接起来，以缩短开发时间。其实我感觉一个</span><span>Login</span><span>控件更像是一个学习控件，一个体现</span><span>Membership, Roles, Users</span><span>应用的非常好的控件，当然它也可以很好的应用与系统，但是个人总感觉在该控件还不够灵活，对于一些大中型项目还是自己建立要更好些。</span></p>
<p align=left><span>呵呵，</span><span>Login</span><span>控件还真是&#8220;想说爱你不容易啊&#8221;！</span></p>
<img src ="http://www.cnblogs.com/Rayinuk/aggbug/696711.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41301/" target="_blank">[新闻]DNS漏洞攻击代码已经公布 危险迫在眉睫</a>]]></description></item><item><title>初步掌握ASP.NET 2.0 Login控件 -  迁徙数据库，个性化Login控件</title><link>http://www.cnblogs.com/Rayinuk/archive/2007/03/30/694163.html</link><dc:creator>Ray Chang</dc:creator><author>Ray Chang</author><pubDate>Fri, 30 Mar 2007 08:02:00 GMT</pubDate><guid>http://www.cnblogs.com/Rayinuk/archive/2007/03/30/694163.html</guid><wfw:comment>http://www.cnblogs.com/Rayinuk/comments/694163.html</wfw:comment><comments>http://www.cnblogs.com/Rayinuk/archive/2007/03/30/694163.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/Rayinuk/comments/commentRss/694163.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Rayinuk/services/trackbacks/694163.html</trackback:ping><description><![CDATA[<p>&nbsp; </p>
<p><span><strong>初步掌握ASP.NET 2.0 Login控件 -&nbsp; 迁徙数据库，个性化Login控件<br>作者：Ray <br>时间：&nbsp;2007年3月30&nbsp;
<table class=TableEdit id=TableEdit width="100%">
    <tbody>
        <tr>
            <td><a id=Editor_Edit_hlEntryLink title="view: 初步掌握Login控件 -  迁徙数据库，个性化Login控件" href="http://www.cnblogs.com/Rayinuk/archive/2007/03/30/694163.html" target=_blank><font color=#002c99>http://www.cnblogs.com/Rayinuk/archive/2007/03/30/694163.html</font></a></td>
        </tr>
    </tbody>
</table>
<br></strong><br>太久没有接触开发，前不久才开始学习一下</span><span>Visual Stuido 2005</span><span>的一些新功能，结果刚上来个</span><span>login </span><span>控件就把我拌了一下，呵呵。。</span></p>
<p>&nbsp;</p>
<p><span>Login</span><span>一系列的控件均是结合</span><span>Membership, Roles</span><span>和</span><span>Profile</span><span>来实现的。而这些机构的数据，按照默认的设置，是存储在</span><span>SQL Server Express </span><span>数据库中，其还包括如</span><span>ASP.NET</span><span>配置信息等其他重要数据。然而，万一我们用的数据库不是</span><span>Sql Server Express</span><span>，那怎么办呢？这是我接触到的第一个问题。</span></p>
<p><strong>&nbsp;</strong></p>
<p><strong><span>问题一：迁移数据库</span></strong></p>
<p><span>解决方法如下：</span></p>
<p><span>VS</span><span>配带了一个工具来允许我们实现该数据库的迁移，可以迁移到我们自己的</span><span>SQL Server </span><span>版本中。该工具是</span><span>SQL</span><span>注册工具，</span><span>aspnet_regsql.exe</span><span>，</span><span>在开始菜单中找到</span><span>Visual Studio 2005</span><span>中的</span><span>Visual Studio Tools</span><span>中选择</span><span>Open Visual Studio 2005 Command Prompt</span><span>，输入上面工具名称即可打开工具进行配置。具体的方法和内容，包括使用参数的方法，在网上有一大堆，我就不再啰嗦了。执行最后的结果是可以将</span><span>Sql Server Express</span><span>中的实例安装到我们指定的数据库中。</span></p>
<p>&nbsp;</p>
<p><span>在成功迁移后，我们就可以在数据库中和我们自己建立的表建立关系了。微软建立的这个实例可以说包括了用户管理，角色管理，个性化管理的所有操作，因此，我们完全可以在自己的数据库建模中，直接利用这些模块来节省开发时间，而且，在一定程度上，他们这些经过测试的代码，结构更在一定程度上增加了安全性，何乐而不为呢？我是坚信一点，在开发过程中，如果有一个现成的，经过测试是安全可靠的，而且是免费的，并能帮助到你的东西，用它，无需考虑。</span></p>
<p><span>走题了。。</span></p>
<p><span>Anyway, </span><span>在新的数据库中，从表名就可以辨别出表的内容，如果你愿意，你可以直接进行修改。。但是我没有那么做。之后，我兴冲冲的在前台放入</span><span>Login</span><span>控件，放入注册用户控件，运行，一切都看似非常的顺利。但是，我发现这些注册的信息都是固定的，我如何实现自己的注册信息呢？比如说，我需要有个</span><span>Department</span><span>和</span><span>Project</span><span>的选项。我原本单纯的以为，可以直接在数据库中修改表结构和存储过程，但是在我修改了表和存储过程后，发现在前台不知道怎么把值传给存储过程，汗。。如果再自己写，那微软这个也做的太。。。后来才知道，实现这个操作利用的是</span><span>Profile, </span><span>个性化操作。这也是遇到的第二个问题：</span></p>
<p>&nbsp;</p>
<p><strong><span>问题二：个性化</span><span>Login</span></strong><strong><span>控件</span></strong></p>
<p><span>解决方法如下：</span></p>
<p><span>对于</span><span>Profile</span><span>的设置，我们需要首先在</span><span>Web.Config</span><span>中配置自己所需要的</span><span>Profile</span><span>属性，例如</span><span>Department</span><span>和</span><span> Project. </span><span>代码如下：</span></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">anonymousIdentification&nbsp;</span><span style="COLOR: #ff0000">enabled</span><span style="COLOR: #0000ff">="true"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">profile</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">properties</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">add&nbsp;</span><span style="COLOR: #ff0000">name&nbsp;</span><span style="COLOR: #0000ff">="Department"</span><span style="COLOR: #ff0000">&nbsp;allowAnonymous</span><span style="COLOR: #0000ff">="true"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">add&nbsp;</span><span style="COLOR: #ff0000">name&nbsp;</span><span style="COLOR: #0000ff">="Project"</span><span style="COLOR: #ff0000">&nbsp;allowAnonymous</span><span style="COLOR: #0000ff">="true"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">properties</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">profile</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p align=left><span><span>&nbsp;</span></span><span>正如上面的代码所示，</span><span>&lt;</span><span>anonymousIdentification</span><span> </span><span>enabled</span><span>=</span><span>"<span>true</span>"<span> /&gt;</span></span><span> </span><span>允许匿名辨析，不加下面是定义的两个新的属性，</span><span>Department</span><span>和</span><span>project</span><span>，</span> <span>均可匿名访问。在定义完后，我们在前台就可以利用</span><span>Profile.Department</span><span>和</span><span>Profile.Project</span><span>来进行相关操作。</span></p>
<p align=left>&nbsp;<span>我们跟着要做的是在创建用户的时候将这些信息一并存储到数据库。按照下面的步骤就可以实现：</span></p>
<p align=left><span><span>1）&nbsp;</span></span><span>设置</span><span>CreateUserWizard</span><span>控件并加入</span><span>Department</span><span>和</span><span>Project</span><span>选项。</span></p>
<p align=left><span><span>2）&nbsp;</span></span><span>添加</span><span>CreateUserWizard</span><span>的</span><span>CreatedUser</span><span>事件，在事件中，利用</span><span>ProfileCommon</span><span>来对我们定义的属性添加</span><span>Value,</span><span>并存入数据库。如下：<br></span></p>
<p align=left><span><span></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CreateUserWizard1_CreatedUser(</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">&nbsp;sender,&nbsp;EventArgs&nbsp;e)<br><img id=Codehighlighter1_79_565_Open_Image onclick="this.style.display='none'; Codehighlighter1_79_565_Open_Text.style.display='none'; Codehighlighter1_79_565_Closed_Image.style.display='inline'; Codehighlighter1_79_565_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_79_565_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_79_565_Closed_Text.style.display='none'; Codehighlighter1_79_565_Open_Image.style.display='inline'; Codehighlighter1_79_565_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_79_565_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_79_565_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextBox&nbsp;txtDepartment&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(TextBox)(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Department</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextBox&nbsp;txtProject&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(TextBox)(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Project</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProfileCommon&nbsp;p&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ProfileCommon)ProfileCommon.Create(CreateUserWizard1.UserName,&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.Department&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;txtDepartment.Text;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.Project&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;txtProject.Text;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.Save();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p align=left><br>&nbsp;&nbsp;</span></span><span>方法中上面的两行代码主要是获取用户填写的数据，下面三行为存储数据。</span><span> </span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>3）&nbsp;</span></span><span>执行完成后，我们可以检查一下我们的数据库，可以看到在下面这几个表中出现了我们定义的数据：</span></p>
<p align=left><span>&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; aspnet_applications</span></p>
<p align=left><span>&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; aspnet_users</span></p>
<p align=left><span>&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; aspnet_profile</span></p>
<p align=left><span>&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; aspnet_Membership<span>&nbsp;&nbsp;&nbsp; </span></span></p>
<p align=left><span>aspnet_applications: </span><span>存储当前系统名称，一般为你解决方案的名称。</span></p>
<p align=left><span>Aspnet_user: </span><span>存储注册的用户的一些信息，例如用户</span><span>ID</span><span>，名称。（其它自己看吧）</span></p>
<p align=left><span>Aspnet_profile: </span><span>存储注册用户的一些个性化参数，</span><span>ok,</span><span>我们可以看到我们定义的</span><span>Department,&nbsp;Project</span><span>均出现在这个表中，他们被存储在一个字段，一行数据中，以一些分隔符区分。</span></p>
<p align=left><span>Aspnet_membership: </span><span>存储注册用户的一些细节信息，类似密码等。</span></p>
<p align=left><span>我们可以看出，系统是根据</span><span>application</span><span>来讲每个用户的所有个性化设置存储在一行数据中，在读取得时候根据分割符来区分数据。（说真的，我不知道那中间的代表什么，所以就说成分隔符，汗</span><span>~~p.s. 关于这个分隔符，请参考<a href="http://www.cnblogs.com/Rayinuk/archive/2007/04/03/698096.html">另一篇随笔</a></span><span>）</span></p>
<p align=left><span><span>4）&nbsp;</span></span><span>存储后的数据如何在前台读取呢？在用户成功登录系统后，我们可以就直接使用</span><span><strong>Profile.Department</strong> </span><span>或</span><span> <strong>Profile.Project</strong></span><span>来获取相对应的值了。</span></p>
<p align=left><span>上面的操作中，我省略了很多知识点，比若说</span><span>CreateUserWizard</span><span>的实现阿，如何利用</span><span>Membership</span><span>代码实现用户注册阿之类，这些在网上内容很多，有兴趣的朋友可以</span><span>Google</span><span>一下即可知道。另一方面，可能上述有些地方可以用更好的方法实现，我也是第一次研究，还没有深入，如果大家知道，不妨说出来分享一下。谢谢哈</span><span>~</span></p>
<p align=left><span>到这里，朋友们都知道如何去自由的定义自己需要的属性和读取它们的值了，基本来说，</span><span>Login</span><span>控件已经被我们初步的征服，可以让我们随心所欲的修改，让它来按照我们的方式工作。接下来就是要谈谈角色了，以及角色在系统中的应用，这个留着下次写吧。</span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<img src ="http://www.cnblogs.com/Rayinuk/aggbug/694163.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41300/" target="_blank">[新闻]十几万元天价笔记本电脑</a>]]></description></item><item><title>SharePoint Portal Server 03与.NET 1.1的一些Bad Points</title><link>http://www.cnblogs.com/Rayinuk/archive/2006/07/27/461467.html</link><dc:creator>Ray Chang</dc:creator><author>Ray Chang</author><pubDate>Thu, 27 Jul 2006 14:05:00 GMT</pubDate><guid>http://www.cnblogs.com/Rayinuk/archive/2006/07/27/461467.html</guid><wfw:comment>http://www.cnblogs.com/Rayinuk/comments/461467.html</wfw:comment><comments>http://www.cnblogs.com/Rayinuk/archive/2006/07/27/461467.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/Rayinuk/comments/commentRss/461467.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Rayinuk/services/trackbacks/461467.html</trackback:ping><description><![CDATA[<p>做Web Part的开发有一小段时间了，这一小段时间让我见识了SPS 03及.NET 1.1的&#8220;厉害&#8221;。。SharePoint Portal 给我的感觉简直就像一个玩具，除了能建立一些很&#8220;表面&#8221;的所谓的Portal，其对再开发方面的限制让人吃惊。或者我对它还不是很熟悉，只有个片面的认识，但同是Microsoft 家庭的成员，在对.NET方面就存在很大的限制，对兄弟都如此，更何况&#8220;外人&#8221;，当然，我这里谈的是VS 03。 举个真实的例子，我需要实现这样一个功能，读取一个Excel文件，获取其中的内容，再将这些内容做相应的处理并存入DB中。这个实现如果利用Web App或者Win App，可以轻松实现。但是当我在本地实现，把可爱的ascx文件放入在SPS服务器上，再将之转换成可爱的Web Part后，报错。而且SPS上是不会告诉你是什么错，只会显示出页面有问题。而如果你本机没有安装SPS,你还不能够调试。(这里不啰嗦你安装后调试SPS文件的烦琐了，不难，就是烦)。而可恶的是，在本地上调试运行一切通过，在程序中的Try..Catch通通失效。看来是权限的问题，SPS不允许你通过HtmlInputFile获取文件，并直接将之打开。郁闷，那就只好将之上传到服务器上，再进行操作了。Ok, 在上传过后，强大的SPS再度发挥其&#8220;丑陋&#8220;的一面，我不能够对该文件进行处理！！这回好点，告诉我让我确定Sheet$存在，我最后的解决方案是听一师兄的意见，新建一个站点，并建立一个Web App来做处理，处理完后自动跳回请求界面。呵呵，虽然实现功能，但就这么一个小小的功能在SPS上却实现的如此复杂，或者俺的水平有限，但不知大家有什么其它的方法。<br><br>谈起.NET 1.1，让人气愤的地方在于其会产生丢失事件的事情。在不知道什么时候（通常在修改页面的HTML代码后），一个页面上的事件会莫明其妙的消失，你必须重新捆绑一下才可以，在时间就是金钱的时代，这简直就是浪费偶口袋里的￥￥，Debug了半天发现没有触发事件，有时真能让人发疯~<br><br>不管如何，希望新的版本能够真正的发挥其功能，真正的能够解决一些实际的问题.</p>
<img src ="http://www.cnblogs.com/Rayinuk/aggbug/461467.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41299/" target="_blank">[新闻]英特尔:四核移动处理器八月推出</a>]]></description></item><item><title>生活的无奈~</title><link>http://www.cnblogs.com/Rayinuk/archive/2006/07/21/456832.html</link><dc:creator>Ray Chang</dc:creator><author>Ray Chang</author><pubDate>Fri, 21 Jul 2006 14:34:00 GMT</pubDate><guid>http://www.cnblogs.com/Rayinuk/archive/2006/07/21/456832.html</guid><wfw:comment>http://www.cnblogs.com/Rayinuk/comments/456832.html</wfw:comment><comments>http://www.cnblogs.com/Rayinuk/archive/2006/07/21/456832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Rayinuk/comments/commentRss/456832.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Rayinuk/services/trackbacks/456832.html</trackback:ping><description><![CDATA[<p>一直都想好好静下心来，利用空闲的时间好好冲冲电，但是生活的种种事情，根本让人停不下来，虽然很讨厌SHE,但是还是不自禁的想起她们的，"我不想~我不想~不想长大~~~&#8220;<br>父亲的手术，姐姐生孩子，工作项目的追赶，结婚的筹备等等事情几乎让我喘不过气。。或许我是在给自己找借口，逃避学习，但除了工作，我几乎都不开机~<br><br>前二天在园子首页看到一篇评论需求，技术的文章，忘记作者了，里面的一句话我感觉还是挺经典的，大意是&#8221;就算客户是头猪，能满足猪的需求的团队才是好的团队&#8220;。让我印象深刻，或许是由于作者的文章比较贴近现实的原故吧。其实对于需求也好，技术也好，二者是相辅相成的，<strong>站在不同的观察点，处于不同的岗位，就会有不同的重要程度</strong>。你做为一个需求分析员，不要求你有过硬的技术，而你做为一个Developer,则只要根据好的设计，明白整理后的需求，在自己的技术基础上开发就好，所以更侧重技术。让一个Developer去搞需求，不如直接close掉该项目好了。这也同样类似于DBA，QA，UI等等方面。总不能叫开发人员去搞UI，UI人员搞DB，DBA搞QA，QA搞开发，这都成什么。。大杂烩~~呵呵~<br><br>好了，累了，来小窝休息一下感觉挺舒服，但休息归休息，还要时刻提醒自己坚持冲电~<br>给自己加油吧~<br><br></p>
<img src ="http://www.cnblogs.com/Rayinuk/aggbug/456832.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41297/" target="_blank">[新闻]杨致远：孤独的守护人</a>]]></description></item><item><title>小谈.NET CLR</title><link>http://www.cnblogs.com/Rayinuk/archive/2006/06/22/433297.html</link><dc:creator>Ray Chang</dc:creator><author>Ray Chang</author><pubDate>Thu, 22 Jun 2006 14:09:00 GMT</pubDate><guid>http://www.cnblogs.com/Rayinuk/archive/2006/06/22/433297.html</guid><wfw:comment>http://www.cnblogs.com/Rayinuk/comments/433297.html</wfw:comment><comments>http://www.cnblogs.com/Rayinuk/archive/2006/06/22/433297.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Rayinuk/comments/commentRss/433297.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Rayinuk/services/trackbacks/433297.html</trackback:ping><description><![CDATA[今天的一节培训课上谈起了.NET&nbsp;的体系结构，让我也想起了当初所学的.NET CLR的相关知识。所以在这里小谈一下，也算是个&#8220;温故而知新&#8221;了，<img src="http://www.cnblogs.com/Emoticons/QQ/15.gif" border="0" height="20" width="20"  alt="" />&nbsp;还记的很久以前，曾在自己的另一篇文章中讨论过CLR和CLI的关系。从大家的回复中也明白了很多。(<a href="http://rayinuk.cnblogs.com/articles/95089.html">文章链接</a>) 大家有空自己再看看，我就不多啰嗦这一点了。<br />
<br />
大家都知道.NET是支持所谓的多语言的，但其实.NET只有一种语言，就是MSIL，其它所有的语言，按照今天培训课上讲的，就是MSIL的一种子语言。MSIL看起来类似一种汇编语言，想当初，用MSIL做一个虚拟机，做的是云里来，雾里去的，对汇编还是怕的很。在很多时候，MSIL都被当成一种基于栈的OO形式的汇编语言。而这种语言被CLR所编译，转换成本地执行文件。在这里要注明的是，MSIL并不像其它的汇编语言，它所包含汇编指令不是应用于一台真正的机器上，而一种抽象的机器上，也因为此，基于MSIL的程序可以应用于不同的机器上，这也是MSIL的特点之一。而在一台机器上，MSIL代码是不能被直接编译的，而是必须首先经过JIT转换成本地代码(native code)。<br />
<br />
那么MSIL究竟能做什么呢？呵呵，即然做为.NET的&#8220;唯一&#8221;的一种语言，凡是你在其它语言里能做到的，就是MSIL所做的。那在编译一个.NET文件中，MSIL具体在何时何地扮演何种角色呢？(很想画个图，可是不知道怎么在CNBlog中实现，好像以前直接从word里可以直接copy,现在不行了) 大概描述一下编译的流程，大家应该就能明白了。按照传统的编译流程，是将source code 编译成object code,再将object与一个library连接起来编译成binary文件，然后执行binary文件。而随后推出了Dynamic link Compilation, 即动态编译，其指的是将source code编译成一个object code,但是其在编译时不连接libary文件，而是在运行binary文件时，动态连接library 文件。那可能有人就问，library文件是什么？它其实包含的就是metadata,元数据。而在.NET CLR中采用的是所谓的JIT Compilation, (Just In Time Compilation)，它的实现原理与动态编译类似，将source code转换成MSIL，再利用JIT将MSIL转换成本地代码，在运行时，读取Assembly中的元数据进行相关操作。<br />
<br />
大概的流程就是这样了，不多说了，这个要说下去，就该谈谈metadata, 还有一些编译过程的细节，比如说JIT Engine, BackPatch, JMI Thunk等一系列的编译机制。有机会，下次再继续谈。先这样，呵呵，后会有期。<br />
<img src ="http://www.cnblogs.com/Rayinuk/aggbug/433297.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41298/" target="_blank">[新闻]SourceForge可正常访问</a>]]></description></item><item><title>郁闷的一天。。</title><link>http://www.cnblogs.com/Rayinuk/archive/2006/06/15/427050.html</link><dc:creator>Ray Chang</dc:creator><author>Ray Chang</author><pubDate>Thu, 15 Jun 2006 14:46:00 GMT</pubDate><guid>http://www.cnblogs.com/Rayinuk/archive/2006/06/15/427050.html</guid><wfw:comment>http://www.cnblogs.com/Rayinuk/comments/427050.html</wfw:comment><comments>http://www.cnblogs.com/Rayinuk/archive/2006/06/15/427050.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Rayinuk/comments/commentRss/427050.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Rayinuk/services/trackbacks/427050.html</trackback:ping><description><![CDATA[今天还不是普通的郁闷￣￣<br>先不说UI组的同事，2天过去一个UI也没给出，搞的我只能按照另一个确定的页面中抽取肯定的样式来修改我页面上的东东，可是补了西墙，却不知东墙是什么样的，真是郁闷，只能做罢，按他的话，耐心的等，唉，2天的任务量，一个也没有完成。<br>下午继续做没做完的CodeReivew,这个最大的好处是可以接触许多不同风格的代码，至少我从中看到过实现一种功能的几种不同的做法。稍感欣慰，略过~~但是郁闷的事随之而来，无意中查了一下交通违规的网站，发现6.2日竟然闯了红灯，一下子没了500个大洋，真是心痛啊~~<br>培训课上再次详细的讲解了如何利用Rose进行建模，以前对Rose理解不深，基本没怎么接触过，还好UML是通用的。回家后赶紧下个XDE，打算做些实际操作来学习学习，毕竟设计这玩意还是很有意思的。也希望在以后能对设计有更深的理解和认识。<br>差不多下完了，准备准备去做练习了。<br>
<img src ="http://www.cnblogs.com/Rayinuk/aggbug/427050.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41295/" target="_blank">[新闻]2008年7月25日IT博客精选</a>]]></description></item><item><title>谈谈最近的工作。。</title><link>http://www.cnblogs.com/Rayinuk/archive/2006/06/14/426117.html</link><dc:creator>Ray Chang</dc:creator><author>Ray Chang</author><pubDate>Wed, 14 Jun 2006 14:39:00 GMT</pubDate><guid>http://www.cnblogs.com/Rayinuk/archive/2006/06/14/426117.html</guid><wfw:comment>http://www.cnblogs.com/Rayinuk/comments/426117.html</wfw:comment><comments>http://www.cnblogs.com/Rayinuk/archive/2006/06/14/426117.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Rayinuk/comments/commentRss/426117.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Rayinuk/services/trackbacks/426117.html</trackback:ping><description><![CDATA[<p>这算是我第二份工吧，第一份工由于公司的原因，竟然把.NET的同胞们都放逐了，虽然转向java可以继续呆在公司，但我还是相信.NET，不是很想转回Java,所以离开了。现在的这家公司给我的感觉很不错，规模也要大的多。对于当初的选择还是感觉是正确的。<br><br>最近所做的项目还是比较忙的，功能方面的实现按客户的角度还算是满意的。但是对于UI方面，希望我们能有所加强。这可苦了一帮兄弟们，各各天天愁眉苦脸的修UI，虽然请了个UI组的同事过来帮忙，但毕竟难以应付众多的UI。今天确定下来，有许多的UI要换成新的，以前的设计也要。。。。代码也要。。。唉。。痛苦。。<br>对于我来说，最痛苦的事情就是。。。UI。。。。<br><br>但是客户是我的God.他们怎么说，我们怎么做吧，IT民工就是这样，没办法了。呵呵。。<br><br>今天还做了些项目组中的Code Review，感觉比之以前还是有很大的进步。虽然大家的代码还是不统一，不规范，但最少是有了进步。有这种意识是最主要的。规范是会随着时间不断的改进的。但经过目前的UI修改大潮，我感觉规范不仅仅是代码规范，还有种种的规范都需要在早期的时候确定下来，比如UI规范，代码规范，设计规范等等。而且一个规范也不能够当成一种形式，而是要看成是一种将要确切执行的东西。这样之后的开发过程才会变的轻松而有规律。<br><br>累了，不说了，明天还要早起。。</p>
<img src ="http://www.cnblogs.com/Rayinuk/aggbug/426117.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41292/" target="_blank">[新闻]微软称Windows 7开发很顺利 IE 8年底上市</a>]]></description></item><item><title>太久没有更新自己的小窝，打算重新打理打理。。</title><link>http://www.cnblogs.com/Rayinuk/archive/2006/06/14/426099.html</link><dc:creator>Ray Chang</dc:creator><author>Ray Chang</author><pubDate>Wed, 14 Jun 2006 14:07:00 GMT</pubDate><guid>http://www.cnblogs.com/Rayinuk/archive/2006/06/14/426099.html</guid><wfw:comment>http://www.cnblogs.com/Rayinuk/comments/426099.html</wfw:comment><comments>http://www.cnblogs.com/Rayinuk/archive/2006/06/14/426099.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Rayinuk/comments/commentRss/426099.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Rayinuk/services/trackbacks/426099.html</trackback:ping><description><![CDATA[<img height=20 src="http://www.cnblogs.com/Emoticons/QQ/24.gif" width=20 border=0>太久没有打理自己的小窝了，想起曾经这里也带给了我好多欢乐，以及很好的帮助。但是交作业，准备复习，考试，休息，找工作，忙碌的工作，不断的事情让我慢慢的遗忘这里，但有一天，我在找资料的时候，竟然意外显示出我曾经写过的文章，虽然不是解决方法，但一下让激起了重新打理的念头。<br><br>重出江湖是好事，但&#8220;年龄&#8221;已大了，呵呵，没有多少精力去像以前一样仔细的写篇心得，因此，打算更多的当成一种生活性的blog.当然，是与.NET相关的生活blog.<br><br>不在乎有没有人来看，自己感到满足就好了，典型的阿Q想法，呵呵.<br><br>祝自己好运。<br>
<img src ="http://www.cnblogs.com/Rayinuk/aggbug/426099.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41292/" target="_blank">[新闻]微软称Windows 7开发很顺利 IE 8年底上市</a>]]></description></item><item><title>[原创]分布式系统开发学习之CS模式（二） - CS模式的限制与应用及Scalability的补充讨论</title><link>http://www.cnblogs.com/Rayinuk/archive/2005/05/16/156786.html</link><dc:creator>Ray Chang</dc:creator><author>Ray Chang</author><pubDate>Mon, 16 May 2005 15:05:00 GMT</pubDate><guid>http://www.cnblogs.com/Rayinuk/archive/2005/05/16/156786.html</guid><wfw:comment>http://www.cnblogs.com/Rayinuk/comments/156786.html</wfw:comment><comments>http://www.cnblogs.com/Rayinuk/archive/2005/05/16/156786.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnblogs.com/Rayinuk/comments/commentRss/156786.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Rayinuk/services/trackbacks/156786.html</trackback:ping><description><![CDATA[<H1 style="MARGIN-LEFT: 409.25pt; TEXT-INDENT: -409.25pt; mso-char-indent-count: -18.53"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">分布式系统开发学习之</SPAN><SPAN lang=EN-US>CS</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式（</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-ansi-language: EN-GB">二</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</SPAN></H1>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">常建昭　</SPAN><?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><st1:chsdate w:st="on" IsROCDate="False" IsLunarDate="False" Day="16" Month="5" Year="2005"><SPAN lang=EN-US>2005-5-16</SPAN></st1:chsdate><SPAN lang=EN-GB style="mso-ansi-language: EN-GB"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P class=MsoNormal><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 14pt">CS</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式的限制与应用</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></SPAN></B></P>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我在上一篇总结的时候提到</SPAN><SPAN lang=EN-US>CS</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式含有一系列的限制。那这些限制都是什么呢？其实</SPAN><SPAN lang=EN-US>CS</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式最基本的问题在于其缺乏可量测性，主要原因是由于</SPAN><SPAN lang=EN-US>Server</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">逐渐的变成了性能的瓶颈。在前文里曾介绍可量测性和性能是分布式结构的二大特点。二者相辅相成，缺乏了可量测性也成为了</SPAN><SPAN lang=EN-US>CS</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式不是一种完全的分布式结构的一个原因。在</SPAN><SPAN lang=EN-US>CS</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式中，服务端通常需要通过获取和使用一些资源来处理</SPAN><SPAN lang=EN-US>Client</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的请求，比如说，连接数据库，获取数据信息等。对于一个软件的开发设计，任何一个需要访问共享资源的设计系统均应该在最短的时间内获取到所需资源，这样其它的用户就可以有机会去访问资源。试想一下，如果同一时间，大量的</SPAN><SPAN lang=EN-US>Client</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">同时对</SPAN><SPAN lang=EN-US>Server</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">发出请求，会出现什么的样的情况？可能会是</SPAN><SPAN lang=EN-US>Server</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的崩溃，也可能会是网络的停滞，但不管是什么，这一点将会让</SPAN><SPAN lang=EN-US>Server</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">变成一个性能的瓶颈，这也是为什么我说</SPAN><SPAN lang=EN-US>C/S</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式对于一个应用软件的可量测性来说含有一定的限制。</SPAN><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有关可量测性，在稍后会补充讨论</SPAN><SPAN lang=EN-US>)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US>C/S</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式不适合大型的网络系统，但对于局域网系统来说是个很好的选择，换句话说，</SPAN><SPAN lang=EN-US>C/S</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式适合</SPAN><SPAN lang=EN-US>10</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">到</SPAN><SPAN lang=EN-US>100</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用户的局域网的系统开发，而对于</SPAN><SPAN lang=EN-US>Internet</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用户的系统来说，这种模式就不适合了。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果说</SPAN><SPAN lang=EN-US>CS</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式不是一种完全的分布式系统，那么它与传统的分布式系统又有什么差别呢？正如我在上一篇学习总结中和一些朋友的讨论，</SPAN><SPAN lang=EN-US>CS</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式的大部处理是在</SPAN><SPAN lang=EN-US>Client </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中执行，而传统的分布式系统是在另一远程机器中进行处理。二者的边界有点模糊，但我认为针对不同的系统要进行正确的选择，这样才能设计出高性能的系统。在稍后我将会对其它的分布式架构做出学习的总结，例如点对点模式，多层架构模式等，同时也会涉及到一些分布式技术例如</SPAN><SPAN lang=EN-US>RPC, RMI, XML Web Service</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">及</SPAN><SPAN lang=EN-US>.NET Remoting</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><o:p></o:p></SPAN></P>
<P class=MsoNormal><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><BR><BR>可量测性</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 14pt">(Scalability)</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的讨论</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></SPAN></B></P>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在上一篇学习总结中，和一些朋友讨论了有关可量测性这一词，现做个简短的总结，希望大家能指教指教。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">博客园的朋友&#8220;小陆&#8221;指出将</SPAN><SPAN lang=EN-US>Scalability</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">翻译成可量测性不太准确，随后他给出了解释和例子，我在这里非常感谢，这里我贴出来，让大家看看，我认为他的比较容易明白。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>|=========&lt;</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">转</SPAN><SPAN lang=EN-US>&gt;=========</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>Scalability</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">翻译成可量测性不太准确</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个词的意思是</SPAN><SPAN lang=EN-US>: </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系统的性能会随着硬件条件的增加而同步增加</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基本上成比例增长</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">比如一个服务器的响应时间为</SPAN><SPAN lang=EN-US>100ms, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times