﻿<?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>IT博客-白开心-文章分类-经典收藏</title><link>http://www.cnitblog.com/hj627/category/1582.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 14:26:35 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 14:26:35 GMT</pubDate><ttl>60</ttl><item><title>Windows 性能监视器工具(转)</title><link>http://www.cnitblog.com/hj627/articles/72896.html</link><dc:creator>白开心</dc:creator><author>白开心</author><pubDate>Tue, 01 Mar 2011 07:12:00 GMT</pubDate><guid>http://www.cnitblog.com/hj627/articles/72896.html</guid><wfw:comment>http://www.cnitblog.com/hj627/comments/72896.html</wfw:comment><comments>http://www.cnitblog.com/hj627/articles/72896.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hj627/comments/commentRss/72896.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hj627/services/trackbacks/72896.html</trackback:ping><description><![CDATA[<h1 class=postTitle><a id=ctl03_TitleUrl class=postTitle2 href="http://www.cnblogs.com/xioxu/archive/2008/11/08/1329408.html"><font color=#0066cc>(转)Windows 性能监视器工具-perfmon</font></a> </h1>
<div class=clear></div>
<div class=postBody>
<div id=cnblogs_post_body>
<h3>Windows 性能监视器工具</h3>
<p>如果需要在一台计算机上监视多个 Report Server 实例，可以同时或单独监视这些实例。选择要包括的实例是计数器添加过程的一部分。有关使用 Windows 附带的性能工具的更多信息，请参见微软 Windows 产品文档。</p>
<p><strong>若要访问性能工具</strong></p>
<table border=0 cellSpacing=0 cellPadding=0>
    <tbody>
        <tr>
            <td class=listBullet vAlign=top>&#8226;</td>
            <td class=listItem>
            <p>从&#8220;开始&#8221;菜单上选择&#8220;运行&#8221;。</p>
            </td>
        </tr>
        <tr>
            <td class=listBullet vAlign=top>&#8226;</td>
            <td class=listItem>
            <p>在&#8220;打开&#8221;文本框中输入&#8220;perfmon&#8221;，然后单击&#8220;确定&#8221;。</p>
            </td>
        </tr>
        <tr>
            <td class=listBullet vAlign=top>&#8226;</td>
            <td class=listItem>
            <p>在性能监视器工具中，在左侧窗格里选择 System Monitor 对象，然后右击&#8220;性能&#8221;图表。</p>
            </td>
        </tr>
        <tr>
            <td class=listBullet vAlign=top>&#8226;</td>
            <td class=listItem>
            <p>选择&#8220;添加计数器&#8221;。</p>
            </td>
        </tr>
    </tbody>
</table>
<p>现在，可以开始选择这些对象和要监视的计数器了。</p>
<h3>ASP.NET 应用程序性能计数器 </h3>
<p>有关 ASP.NET 应用程序性能计数器的大部分信息最近已被合并到一个题为&#8220;改善 .NET 应用程序的性能和伸缩性&#8221;的综合文档中。下表描述了一些可用于监视和优化 ASP.NET 应用程序（包括 Reporting Services）性能的重要计数器。</p>
<table id=EOHAE class=dataTable border=0 cellSpacing=0 cellPadding=0>
    <thead>
        <tr class=stdHeader vAlign=top>
            <td id=colEQHAE width="14%">性能对象</td>
            <td id=colEUHAE width="20%">计数器</td>
            <td id=colEYHAE width="14%">实例</td>
            <td style="BORDER-RIGHT: #cccccc 1px solid" id=colE3HAE width="52%">描述</td>
        </tr>
    </thead>
    <tbody>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Processor（处理器）</p>
            </td>
            <td>
            <p class=lastInCell>% Processor Time（处理器时间百分比）</p>
            </td>
            <td>
            <p class=lastInCell>__Total</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>&#8220;% Processor Time&#8221;监视运行 Web 服务器的计算机的 CPU 利用率。低 CPU 利用率或者无法最大化 CPU 利用率（无论客户端负载为多少）都表明 Web 应用程序中存在对资源的争用或锁定。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Process（进程）</p>
            </td>
            <td>
            <p class=lastInCell>% Processor Time（处理器时间百分比）</p>
            </td>
            <td>
            <p class=lastInCell>aspnet_wp 或 w3wp（具体情况视 IIS 版本而定）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>由 ASP.NET 工作进程所使用的处理器时间所占的百分比。在将标准负载情况下的性能与先前捕获的基准进行对比时，如果此计数器的值出现下降，则说明降低了对处理器的需求，因此也提高了伸缩性。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Process（进程）</p>
            </td>
            <td>
            <p class=lastInCell>Working Set（工作集）</p>
            </td>
            <td>
            <p class=lastInCell>aspnet_wp 或 w3wp（具体情况视 IIS 版本而定）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>由 ASP.NET 主动使用的内存数量。虽然应用程序开发人员对应用程序使用的内存数量拥有最大的控制权，但系统管理员也可通过调整会话的超时期限来显著影响这一点。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Process（进程）</p>
            </td>
            <td>
            <p class=lastInCell>Private Bytes（专有字节）</p>
            </td>
            <td>
            <p class=lastInCell>aspnet_wp 或 w3wp（具体情况视 IIS 版本而定）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>Private Bytes 是当前分配给该进程且不能由其他进程共享的内存数量（以字节计）。不时出现的尖峰表明某些地方存在瓶颈，会导致工作进程继续持有不再需要的内存。如果此计数器突然下降为接近 0 的值，则可能表示 ASP.NET 应用程序由于无法预料的问题进行了重启。为了验证这一点，请监视&#8220;ASP.NET Application Restarts&#8221;计数器。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>ASP.NET Applications（ASP.NET 应用程序）</p>
            </td>
            <td>
            <p class=lastInCell>Requests/ Sec（每秒的请求数）</p>
            </td>
            <td>
            <p class=lastInCell>__Total</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>允许您检验请求的处理速度是否于发送速度相适应。如果每秒请求数的数值低于每秒产生的请求数，则会出现排队现象。这通常意味着已经超过了最大请求速度。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>ASP.NET Applications（ASP.NET 应用程序）</p>
            </td>
            <td>
            <p class=lastInCell>Errors Total（总错误数）</p>
            </td>
            <td>
            <p class=lastInCell>__Total</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>在执行 HTTP 请求期间发生的错误总数。包括任何分析器、编译或运行时错误。此计数器是&#8220;Errors During Compilation&#8221;（编译错误数）、&#8220;Errors During Preprocessing&#8221;（预处理错误数）和&#8220;Errors During Execution&#8221;（执行错误数）计数器的总和。运转正常的 Web 服务器不应产生任何错误。如果错误发生在 ASP.NET Web 应用程序中，它们的存在可能会让实际的吞吐量结果产生偏差。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>ASP.NET </p>
            </td>
            <td>
            <p class=lastInCell>Request Execution Time（请求执行时间）</p>
            </td>
            <td>
            <p class=lastInCell>&nbsp;</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>显示了呈现所请求页面并将其传送给用户所需的时间（以毫秒计）。跟踪此计数器通常要比跟踪页面呈现时间效果更好。此计数器可以更全面地衡量从开始到结束的整个请求时间。在与基准进行对比时，如果此计数器的平均值较低，则说明应用程序的伸缩性和性能均得到了改善。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>ASP.NET </p>
            </td>
            <td>
            <p class=lastInCell>Application Restarts（应用程序重新启动）</p>
            </td>
            <td>
            <p class=lastInCell>&nbsp;</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>应用程序在 Web 服务器生存期间发生重新启动的次数。每次发生 Application_OnEnd 事件时，应用程序的重新启动次数都会增加。应用程序进行重新启动的原因可能是：更改了 Web.config 文件、更改了存储在应用程序的 \bin 目录下的程序集、或者 Web Forms 页面中发生了太多的更改。如果此计数器的值出现意料之外的增加，说明某些不可预知的问题导致 Web 应用程序被关闭。在这种情况下，应该认真调查问题原因。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>ASP.NET </p>
            </td>
            <td>
            <p class=lastInCell>Requests Queued（排队的请求数）</p>
            </td>
            <td>
            <p class=lastInCell>&nbsp;</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>在队列中等待服务的请求数。如果此数字随着客户端负载的增加而呈现线性的增长，则说明 Web 服务器计算机已经达到了它能够处理的并发请求极限。此计数器的默认最大值为 5,000。您可以在计算机的 Machine.config 文件中更改此设置。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>ASP.NET </p>
            </td>
            <td>
            <p class=lastInCell>Worker Process Restarts（工作进程重新启动）</p>
            </td>
            <td>
            <p class=lastInCell>&nbsp;</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>工作进程在服务器计算机上重新启动的次数。如果出现意料之外的故障或者被有意回收，则工作进程会重新启动。如果此计数器的值出现意料之外的增加，应认真调查问题原因。</p>
            </td>
        </tr>
    </tbody>
</table>
<p>除了上表中介绍的这些核心监视要素之外，在您试图诊断 ASP.NET 应用程序具有的特定性能问题时，下表中的性能计数器也可对您有所帮助。</p>
<table id=E3KAE class=dataTable border=0 cellSpacing=0 cellPadding=0>
    <thead>
        <tr class=stdHeader vAlign=top>
            <td id=colE5KAE width="18%">性能对象</td>
            <td id=colECLAE width="14%">计数器</td>
            <td id=colEGLAE width="14%">实例</td>
            <td style="BORDER-RIGHT: #cccccc 1px solid" id=colEKLAE width="54%">描述</td>
        </tr>
    </thead>
    <tbody>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>ASP.NET Applications（ASP.NET 应用程序）</p>
            </td>
            <td>
            <p class=lastInCell>Pipeline Instance Count（管线实例计数）</p>
            </td>
            <td>
            <p class=lastInCell>__Total</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>指定 ASP.NET 应用程序的活动请求管线实例的数量。由于只有一个执行线程可以在管线实例内运行，所以此数值反映了为特定应用程序处理的并发请求的最大数量。大多数情况下，在存在负载的情况下此数值较低为佳，这表明处理器得到了很好的利用。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>.NET CLR Exceptions（.NET CLR 异常）</p>
            </td>
            <td>
            <p class=lastInCell># of Exceps Thrown（引发的异常数）</p>
            </td>
            <td>
            <p class=lastInCell>&nbsp;</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>显示应用程序中引发的异常数。如果此数值出现意料之外的增加，说明可能存在性能问题。如果仅仅存在异常，则并不需要担心，因为异常对于某些代码路径来说是正常工作的一部分。例如，HttpResponse.Redirect 方法通过引发一个不可捕获的异常 ThreadAbortException 来完成工作。同样，对 ASP.NET 应用程序跟踪此计数器也更加有用。使用&#8220;Errors Total&#8221;计数器确定该异常是否将导致应用程序出现意料之外的错误。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>System（系统）</p>
            </td>
            <td>
            <p class=lastInCell>Context Switches/ sec（每秒的上下文切换次数）</p>
            </td>
            <td>
            <p class=lastInCell>&nbsp;</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>测量 Web 服务器计算机上所有处理器切换线程上下文的速度。如果此计数器的值很高，可能表示对锁的争用频繁发生，或者在线程的用户模式和内核模式之间切换频繁。使用采样优化程序和其他工具执行进一步调查可证实上述猜测。</p>
            </td>
        </tr>
    </tbody>
</table>
<h3>Reporting Services 性能计数器 </h3>
<p>Reporting Services 包括一组它自己的性能计数器，用于收集有关报告处理和资源消耗方面的信息。可通过 Windows 性能监视器工具中出现的两个对象来监视实例和组件的状态和活动：MSRS 2005 Web Service 和 MSRS 2005 Windows Service 对象。</p>
<p>MSRS 2005 Web Service 性能对象包括一组用来跟踪 Report Server 处理过程的计数器，这些处理过程通常通过在线交互式报告浏览操作而引发。这些计数器在 ASP.NET 停止该 Web 服务后被重设。下表列出了可用于监视 Report Server 性能的计数器，并描述了它们的目的。</p>
<p><strong>性能对象：RS Web Service</strong></p>
<table id=ERMAE class=dataTable border=0 cellSpacing=0 cellPadding=0>
    <thead>
        <tr class=stdHeader vAlign=top>
            <td id=colETMAE width="35%">计数器</td>
            <td style="BORDER-RIGHT: #cccccc 1px solid" id=colEXMAE width="65%">描述</td>
        </tr>
    </thead>
    <tbody>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Active Sessions（活动会话数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>活动会话的数量。此计数器反映了尚未过期的所有浏览器会话总数。这并不是同时处理的请求数，而是存储在 ReportServerTempDB 数据库中的会话数量。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Cache Hits/Sec（每秒缓存命中次数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>每秒从目录中取得的报告请求的数量。如果此值增加，而&#8220;Memory Cache Hits&#8221;的值不增加，则说明报告数据没有被重新处理，但是页面被重新呈现。将此计数器与 Memory Cache Hits/Sec 计数器一同使用，可以确定用于缓存、磁盘或内存的资源是否充足。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Cache Misses/Sec（每秒缓存未命中数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>每秒未能从目录中（与内存中相对）返回报告的请求数量。将此计数器与 Memory Cache Misses/Sec 计数器一同使用，可以确定用于缓存、磁盘或内存的资源是否充足。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>First Session Requests/Sec（每秒的首次会话请求数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>每秒中从 Report Server 缓存中启动的新的用户会话数量。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Memory Cache Hits/Sec（每秒内存缓存命中数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>每秒中从内存中的缓存里取得报告的次数。内存中缓存是 Reporting Services 缓存的一部分，用于在内存或临时文件中保存已呈现过的报告。这样可以为请求提供最佳的性能，因为无需执行任何处理工作。如果使用内存中缓存，报告服务器将不会通过查询 SQL Server 来获得缓存的内容。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Memory Cache Misses/Sec（每秒内存缓存未命中数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>每秒中未能从内存中的缓存里取得报告的次数。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Next Session Requests/Sec（每秒的下一次会话请求）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>每秒在现有会话中请求打开报告的次数。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Report Requests（报告请求）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>当前处于活动状态并且将由 Report Server 进行处理的报告数量。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Reports Executed/Sec（每秒执行的报告数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>每秒成功执行的报告的数量。此计数器提供了有关报告处理量的统计信息。综合使用此计数器和 Request/Sec，比较可从缓存中返回的报告请求的执行情况。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Requests/Sec（每秒的请求数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>每秒向 Report Server 发出的请求数。此计数器跟踪由 Report Server 处理的所有类型的请求。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Total Cache Hits（缓存命中总数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>自服务启动以来，从缓存中获得报告的请求总数。此计数器在 ASP.NET 停止该 Web 服务后被重设。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Total Cache Misses（总的缓存未命中数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>自服务启动以来，不能从缓存中获得报告的总次数。此计数器在 ASP.NET 停止该 Web 服务后被重设。可使用此计数器确定磁盘空间和内存是否充足。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Total Memory Cache Hits（总的内存缓存命中数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>自服务启动以来，从内存中缓存里返回的已缓存报告的总数。此计数器在 ASP.NET 停止该 Web 服务后被重设。内存中缓存是在 CPU 内存中存储报告的那部分缓存。如果使用内存中缓存，报告服务器将不会通过查询 SQL Server 来获得缓存的内容。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Total Memory Cache Misses（总的缓存未命中数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>自服务启动以来，针对内存中缓存的缓存未命中总数。此计数器在 ASP.NET 停止该 Web 服务后被重设。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Total Processing Failures（处理故障总数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>自服务启动以来，发生的所有报告处理故障的总数。此计数器在 ASP.NET 停止该 Web 服务后被重设。处理故障可能来自报告处理器，也可能来自任何扩展。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Total Reports Executed（执行的报告总数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>自服务启动以来得到成功执行的报告的总数。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Total Requests（总请求数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>自服务启动以来，向 Report Server 发送的所有请求的总数。</p>
            </td>
        </tr>
    </tbody>
</table>
<p>RS Windows Service 性能对象包括一组用于跟踪报告处理过程的计数器，这些处理过程是通过预定操作而引发的。预定操作可能包括订阅和交付、报告执行快照以及报告历史。微软的工作负载中并不包含任何预定操作或交付操作，此处列出这些性能计数器仅是便于您进行参考。</p>
<p>可使用此性能对象监视 Report Server Windows 服务。如果您准备在一个横向伸缩配置中运行 Report Server，那么这些计数器应用于所选的服务器，而不是应用于横向伸缩配置整体。这些计数器在应用程序域回收之时将被重设。下表列出了可用于监视预定和交付操作的计数器，并描述了它们的目的。</p>
<p><strong>性能对象：RS Windows Service</strong></p>
<table id=EWPAE class=dataTable border=0 cellSpacing=0 cellPadding=0>
    <thead>
        <tr class=stdHeader vAlign=top>
            <td id=colEYPAE width="35%">计数器</td>
            <td style="BORDER-RIGHT: #cccccc 1px solid" id=colE3PAE width="65%">描述</td>
        </tr>
    </thead>
    <tbody>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Cache Flushes/Sec(每秒缓存刷新次数)</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>每秒刷新缓存的次数。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Cache Hits/Sec（每秒缓存命中数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>每秒获取到缓存报告的请求数量。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Cache Misses/Sec（每秒缓存未命中数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>每秒未能从缓存中获得报告的请求的数量。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Delivers/Sec（每秒交付数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>每秒从各种交付扩展交付的报告的数量。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Events/Sec（每秒事件数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>每秒处理的事件数量。被监视的事件，包括 SnapshotUpdated 和 TimedSubscription。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Memory Cache Hits/Sec（每秒内存缓存命中数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>每秒中从内存中的缓存里取得报告的次数。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Memory Cache Misses/Sec（每秒内存缓存未命中数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>每秒中未能从内存中的缓存里取得报告的次数。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Report Requests（报告请求数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>当前处于活动状态并且将由 Report Server 进行处理的报告数量。可使用此计数器评估缓存策略。向特定呈现扩展提交的请求数。请求的数量可能比执行的报告数量多许多。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Reports Executed/Sec（每秒执行的报告数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>每秒成功执行的报告的数量。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Snapshot Updates/Sec（每秒快照更新数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>每秒报告执行快照的预定更新数量。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Total App Domain Recycles（应用程序域回收总数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>自服务启动以来回收的应用程序域总数。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Total Cache Flushes（缓存刷新总数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>自服务启动以来，Report Server 的缓存更新总数。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Total Cache Hits（缓存命中总数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>自服务启动以来，从缓存中获得报告的请求总数。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Total Cache Misses（总的缓存未命中数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p>自服务启动以来，不能从缓存中获得报告的总次数。</p>
            <p>可使用此计数器确定是否需要更多磁盘空间或内存。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Total Deliveries（总交付数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>由 Scheduling and Delivery Processor 交付的报告总数（对于所有交付扩展）。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Total Events（总事件数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>自服务启动以来发生的事件的总数。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Total Memory Cache Hits（总的内存缓存命中数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>自服务启动以来，从内存中缓存里返回的已缓存报告的总数。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Total Memory Cache Misses（总的缓存未命中数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>自服务启动以来，针对内存中缓存的缓存未命中总数。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Total Processing Failures（处理故障总数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>自服务启动以来，发生的所有报告处理故障的总数。处理故障可能来自报告处理器，也可能来自任何扩展。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Total Rejected Threads（被拒绝的线程总数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>拒绝执行异步处理后在同一线程中作为同步过程在以后进行处理的数据处理线程总数。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Total Report Executions（报告执行总数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>已执行报告的总数。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Total Requests（请求总数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>自服务启动以来得到成功执行的报告的总数。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Total Snapshot Updates（快照更新总数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>自服务启动以来，报告执行快照进行更新的总数。</p>
            </td>
        </tr>
    </tbody>
</table>
<p>如果您打算排除 Reporting Services 存在的性能问题，记录以下性能计数器通常很有帮助：ASP.NET、ASP.NET Applications、Process、System、Memory、Physical Disks、.NET Exceptions、.NET Memory、.NET Loading、.NET CLR Locks and Threads 以及 .NET CLR Data。</p>
<h3>可选的 Reporting Services 性能计数器&nbsp;&nbsp;</h3>
<p>以下列出了一些适用于 RS Web Service 但在默认情况下并未安装的性能计数器。但是，在执行性能优化工作时，可以通过这些计数器来改善您洞察性能的能力。为实现这个目的，请在命令提示符中执行以下语句：</p>
<pre class=codeSample>installutil.exe /u ReportingServicesLibrary.dll</pre>
<p>然后再执行：</p>
<pre class=codeSample>installutil.exe ReportingServicesLibrary.dll</pre>
<p>为了成功执行该语句，您可能首先需要修改您的路径，在路径中包含 Microsoft .NET Framework 的安装目录。在路径修改完毕后，请从包含 ReportingServicesLibrary.dll 文件的目录下执行先前语句。默认情况下，该文件安装在 <span class=codeSample>C:\Program Files\Microsoft SQL Server\MSSQL\MSSQL.instance\Reporting Services\ReportServer\bin</span> 目录下。这些计数器没有进行彻底的本地化。</p>
<table id=EAUAE class=dataTable border=0 cellSpacing=0 cellPadding=0>
    <thead>
    </thead>
    <tbody>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Active Database Connections（活动数据库连接）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>某个时间处于活动状态的数据库连接的数量。只统计指向 Report Server 目录的连接。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Active Datasource Connections（活动数据源连接）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>某个时间处于活动状态的数据库连接的数量。只统计由当前运行的报告打开的数据源连接。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Active Threads（活动线程）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>当前处于活动状态的线程数量。在 Web 服务中，它包含一些为请求提供服务的线程。在交付服务中，它包含工作线程以及维护和轮询线程。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Byte count（字节计数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>对于上一次请求，在呈现当前报告时向客户端返回的字节数量。这与对应的执行日志条目相类似。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Row Count（行计数）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>对于上一次请求，由当前报告返回的行的数量。这与对应的执行日志条目相类似。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Time in Compression（压缩时间）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>对于上一次请求，在快照和 PDF 报告压缩上花费的时间（以毫秒计）。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Time in data source access（数据源访问时间）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>对于上一次请求，在获取报告的数据源信息上花费的时间（以毫秒计）。其中包括执行查询和取回结果所需的时间。这与对应的执行日志条目相类似。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Time in database（数据库时间）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>对于上一次请求，在获取 Report Server 目录信息上花费的时间（以毫秒计）。</p>
            </td>
        </tr>
        <tr class=record vAlign=top>
            <td>
            <p class=lastInCell>Time in processing（处理时间）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>对于上一次请求，在报告处理上花费的时间（以毫秒计）。这与对应的执行日志条目相类似。</p>
            </td>
        </tr>
        <tr class=evenRecord vAlign=top>
            <td>
            <p class=lastInCell>Time in rendering（呈现时间）</p>
            </td>
            <td style="BORDER-RIGHT: #cccccc 1px solid">
            <p class=lastInCell>对于上一次请求，在呈现报告上花费的时间（以毫秒计）。这与对应的执行日志条目相类似。</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
</div>
<img src ="http://www.cnitblog.com/hj627/aggbug/72896.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hj627/" target="_blank">白开心</a> 2011-03-01 15:12 <a href="http://www.cnitblog.com/hj627/articles/72896.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.net解决了防止用户重复登陆,session超时等问题(转)</title><link>http://www.cnitblog.com/hj627/articles/69027.html</link><dc:creator>白开心</dc:creator><author>白开心</author><pubDate>Wed, 22 Sep 2010 13:20:00 GMT</pubDate><guid>http://www.cnitblog.com/hj627/articles/69027.html</guid><wfw:comment>http://www.cnitblog.com/hj627/comments/69027.html</wfw:comment><comments>http://www.cnitblog.com/hj627/articles/69027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hj627/comments/commentRss/69027.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hj627/services/trackbacks/69027.html</trackback:ping><description><![CDATA[<p>一．设置web.config相关选项</p>
<p>　　先启用窗体身份验证和默认登陆页,如下。<br>&lt;authentication mode="Forms"&gt;<br>&lt;forms loginUrl="default.aspx"&gt;&lt;/forms&gt;<br>&lt;/authentication&gt;<br>　　设置网站可以匿名访问，如下<br>&lt;authorization&gt;<br>&lt;allow users="*" /&gt;<br>&lt;/authorization&gt;<br>　　然后设置跟目录下的admin目录拒绝匿名登陆，如下。注意这个小节在System.Web小节下面。<br>&lt;location path="admin"&gt;<br>&lt;system.web&gt;<br>&lt;authorization&gt;<br>&lt;deny users="?"&gt;&lt;/deny&gt;<br>&lt;/authorization&gt;<br>&lt;/system.web&gt;<br>&lt;/location&gt;<br>　　把http请求和发送的编码设置成GB2312,否则在取查询字符串的时候会有问题，如下。<br>&lt;globalization requestEncoding="gb2312" responseEncoding="gb2312" /&gt;<br>　　设置session超时时间为1分钟，并启用cookieless，如下。<br>&lt;sessionState mode="InProc" cookieless="true" timeout="1" /&gt;<br>　　为了启用页面跟踪，我们先启用每一页的trace，以便我们方便的调试，如下。<br>&lt;trace enabled="true" requestLimit="1000" pageOutput="true" traceMode="SortByTime" localOnly="true" /&gt;<br>　　二．设置Global.asax文件<br>　　处理Application_Start方法，实例化一个哈西表，然后保存在Cache里<br>protected void Application_Start(Object sender, EventArgs e)<br>{<br>Hashtable h=new Hashtable();<br>Context.Cache.Insert("online",h);<br>}<br>在Session_End方法里调用LogoutCache()方法，方法源码如下<br>/// &lt;summary&gt;<br>/// 清除Cache里当前的用户,主要在Global.asax的Session_End方法和用户注销的方法里调用 /// &lt;/summary&gt;<br>public void LogoutCache()<br>{<br>Hashtable h=(Hashtable)Context.Cache["online"];<br>if(h!=null)<br>{<br>if(h[Session.SessionID]!=null)<br>h.Remove(Session.SessionID);<br>Context.Cache["online"]=h;<br>}<br>}<br>　　三．设置相关的登陆和注销代码<br>　　登陆前调用PreventRepeatLogin()方法，这个方法可以防止用户重复登陆，如果上次用户登陆超时大于1分钟，也就是关闭了所有 admin目录下的页面达到60秒以上，就认为上次登陆的用户超时，你就可以登陆了，如果不超过60秒，就会生成一个自定义异常。在Cache ["online"]里保存了一个哈西表,哈西表的key是当前登陆用户的SessionID,而Value是一个ArrayList,这个 ArrayList有两个元素,第一个是用户登陆的名字第二个元素是用户登陆的时间,然后在每个admin目录下的页刷新页面的时候会更新当前登陆用户的登陆时间,而只admin目录下有一个页打开着,即使不手工向服务器发送请求,也会自动发送一个请求更新登陆时间,下面我在页面基类里写了一个函数来做到这一点,其实这会增加服务器的负担,但在一定情况下也是一个可行的办法.<br>/// &lt;summary&gt;<br>/// 防止用户重复登陆,在用户将要身份验证前使用<br>/// &lt;/summary&gt;<br>/// &lt;param name="name"&gt;要验证的用户名字&lt;/param&gt;<br>private void PreventRepeatLogin(string name)<br>{<br>Hashtable h=(Hashtable)Cache["online"];<br>if(h!=null)<br>{<br>IDictionaryEnumerator e1=h.GetEnumerator();<br>bool flag=false;<br>while(e1.MoveNext())<br>{<br>if((string)((ArrayList)e1.Value)[0]==name)<br>{<br>flag=true;<br>break;<br>}<br>}<br>if(flag)<br>{<br>TimeSpan ts=System.DateTime.Now.Subtract(Convert.ToDateTime(((ArrayList)e1.Value)[1]));<br>if(ts.TotalSeconds&lt;60)<br>throw new oa.cls.MyException("对不起，你输入的账户正在被使用中，如果你是这个账户的真正主人，请在下次登陆时及时的更改你的密码，因为你的密码极有可能被盗窃了!");<br>else<br>h.Remove(e1.Key);<br>}<br>}<br>else<br>{<br>h=new Hashtable();<br>}<br>ArrayList al=new ArrayList();<br>al.Add(name);<br>al.Add(System.DateTime.Now);<br>h[Session.SessionID]=al;<br>if(Cache["online"]==null)<br>{<br>Context.Cache.Insert("online",h);<br>}else<br>Cache["Online"]=h;<br>}<br>用户注销的时候调用上面提到LogoutCache()方法<br>　　四．设置admin目录下的的所有页面的基类<br>using System;<br>using System.Web;<br>using System.Web.UI;<br>using System.Web.UI.WebControls;<br>using System.Web.UI.HtmlControls;<br>using System.Collections;<br>namespace oa.cls<br>{<br>public class MyBasePage : System.Web.UI.Page<br>{<br>/// &lt;summary&gt;<br>/// 获取本页是否在受保护目录,我这里整个程序在OA的虚拟目录下,受保护的目录是admin目录<br>/// &lt;/summary&gt;<br>protected bool IsAdminDir<br>{<br>get<br>{<br>return Request.FilePath.IndexOf("/oa/admin")==0;<br>}<br>}<br>/// &lt;summary&gt;<br>/// 防止session超时,如果超时就注销身份验证并提示和转向到网站默认页<br>/// &lt;/summary&gt;<br>private void PreventSessionTimeout()<br>{<br>if(!this.IsAdminDir) return;<br>if(Session["User_Name"]==null&amp;&amp;this.IsAdminDir)<br>{<br>System.Web.Security.FormsAuthentication.SignOut();<br>this.Alert("登陆超时",Request.ApplicationPath)<br>}<br>}<br>/// &lt;summary&gt;<br>/// 每次刷新本页面的时候更新Cache里的登陆时间选项,在下面的OnInit方法里调用.<br>/// &lt;/summary&gt;<br>private void UpdateCacheTime()<br>{<br>Hashtable h=(Hashtable)Cache["online"];<br>if(h!=null)<br>{<br>((ArrayList)h[Session.SessionID])[1]=DateTime.Now;<br>}<br>Cache["Online"]=h;<br>}<br>/// &lt;summary&gt;<br>/// 在跟踪里输出一个HashTable的所有元素,在下面的OnInit方法里调用.以便方便的观察缓存数据<br>/// &lt;/summary&gt;<br>/// &lt;param name="myList"&gt;&lt;/param&gt;<br>private void TraceValues( Hashtable myList)<br>{<br>IDictionaryEnumerator myEnumerator = myList.GetEnumerator();<br>int i=0;<br>while ( myEnumerator.MoveNext() )<br>{<br>Context.Trace.Write( "onlineSessionID"+i, myEnumerator.Key.ToString());<br>ArrayList al=(ArrayList)myEnumerator.Value;<br>Context.Trace.Write( "onlineName"+i, al[0].ToString());<br>Context.Trace.Write( "onlineTime"+i,al[1].ToString());<br>TimeSpan ts=System.DateTime.Now.Subtract(Convert.ToDateTime(al[1].ToString()));<br>Context.Trace.Write("当前的时间和此登陆时间间隔的秒数",ts.TotalSeconds.ToString());<br>i++;<br>}<br>}<br>/// &lt;summary&gt;<br>/// 弹出信息并返回到指定页<br>/// &lt;/summary&gt;<br>/// &lt;param name="msg"&gt;弹出的消息&lt;/param&gt;<br>/// &lt;param name="url"&gt;指定转向的页面&lt;/param&gt;<br>protected void Alert(string msg,string url)<br>{<br>string scriptString = "&lt;script language=JavaScript&gt;alert(\""+msg+"\");location.href=\""+url+"\"&lt;/script&gt;";<br>if(!this.IsStartupScriptRegistered("alert"))<br>this.RegisterStartupScript("alert", scriptString);<br>}<br>/// &lt;summary&gt;<br>/// 为了防止常时间不刷新页面造成会话超时,这里写一段脚本,每隔一分钟向本页发送一个请求以维持会话不被超时，这里用的是xmlhttp的无刷新请求<br>/// 这个方法也在下面的OnInit方法里调用<br>/// &lt;/summary&gt;<br>protected void XmlReLoad()<br>{<br>System.Text.StringBuilder htmlstr=new System.Text.StringBuilder();<br>htmlstr.Append("&lt;SCRIPT LANGUAGE=\"JavaScript\"&gt;");<br>htmlstr.Append("function GetMessage(){");<br>htmlstr.Append(" var xh=new ActiveXObject(\"Microsoft.XMLHTTP\");");<br>htmlstr.Append(" xh.open(\"get\",window.location,false);");<br>htmlstr.Append(" xh.send();");<br>htmlstr.Append(" window.setTimeout(\"GetMessage()\",60000);");<br>htmlstr.Append("}");<br>htmlstr.Append("window.onload=GetMessage();");<br>htmlstr.Append("&lt;/SCRIPT&gt; ");<br>if(!this.IsStartupScriptRegistered("xmlreload"))<br>this.RegisterStartupScript("alert", htmlstr.ToString());<br>}<br>override protected void OnInit(EventArgs e)<br>{<br>base.OnInit(e);<br>this.PreventSessionTimeout();<br>this.UpdateCacheTime();<br>this.XmlReLoad();<br>if(this.Cache["online"]!=null)<br>{<br>this.TraceValues((System.Collections.Hashtable)Cache["online"]);<br>}<br>}<br>}<br>}<br>　　五． 写一个自定义异常类<br>　　首先要在跟目录下写一个错误显示页面ShowErr.aspx，这个页面根据传递过来的查询字符串msg的值，在一个Label上显示错误信息。<br>using System;<br>namespace oa.cls<br>{<br>/// &lt;summary&gt;<br>/// MyException 的摘要说明。<br>/// &lt;/summary&gt;<br>public class MyException:ApplicationException<br>{<br>/// &lt;summary&gt;<br>/// 构造函数<br>/// &lt;/summary&gt;<br>public MyException():base()<br>{<br>}<br>/// &lt;summary&gt;<br>/// 构造函数<br>/// &lt;/summary&gt;<br>/// &lt;param name="ErrMessage"&gt;异常消息&lt;/param&gt;<br>public MyException(string Message):base(Message)<br>{<br>System.Web.HttpContext.Current.Response.Redirect("~/ShowErr.aspx?msg="+Message);<br>}<br>/// &lt;summary&gt;<br>/// 构造函数<br>/// &lt;/summary&gt;<br>/// &lt;param name="Message"&gt;异常消息&lt;/param&gt;<br>/// &lt;param name="InnerException"&gt;引起该异常的异常类&lt;/param&gt;<br>public MyException(string Message,Exception InnerException):base(Message,InnerException)<br>{<br>}<br>}<br>}<br>　　六．总结<br>　　我发现在Session里保存的值，比如session["name"]是没有任何向服务器的请求达到1分钟后就会自动丢失,但是 session ID是关闭同一进程的浏览器页面后达1分钟后才会丢失并更换的,因为只要你开着浏览器就会有session ID,无论是在url里保存还是在cookies里。不知道这个结论对不对，反正我在设置了session的timeout为1分钟后，session ["name"]的值已经没有了，可是SessionID还是旧的，Global.asax里的Session_End里的代码也没有执行，而身份验证票据也没有丢失。我不知道这三者之间的关系是怎样的，谁先谁后，好像在&lt;authentication&gt;小节可以设置一个timeout属性，不过项目赶的紧，我没时间研究了。<br>　　以上这些代码比较零散，我花费了2天的时间才总结出来这套方案，不是很完美，但是暂时只能这样了，不能在这方面浪费很多时间了，大家可以把上面的代码组织到一个类里，然后把方法都修改成静态方法方便调用。</p>
<img src ="http://www.cnitblog.com/hj627/aggbug/69027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hj627/" target="_blank">白开心</a> 2010-09-22 21:20 <a href="http://www.cnitblog.com/hj627/articles/69027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FTP批处理上传</title><link>http://www.cnitblog.com/hj627/articles/63719.html</link><dc:creator>白开心</dc:creator><author>白开心</author><pubDate>Tue, 12 Jan 2010 15:34:00 GMT</pubDate><guid>http://www.cnitblog.com/hj627/articles/63719.html</guid><wfw:comment>http://www.cnitblog.com/hj627/comments/63719.html</wfw:comment><comments>http://www.cnitblog.com/hj627/articles/63719.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hj627/comments/commentRss/63719.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hj627/services/trackbacks/63719.html</trackback:ping><description><![CDATA[先将以下存为&nbsp; config.ftp&nbsp; 文件<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"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">open&nbsp;xx.xx.xx.xx<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>user&nbsp;用户名<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>密码<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>cd&nbsp;MyData<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>prompt<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>mput&nbsp;C:\MyData\*.txt<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>bye<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>quit<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>exit</span></div>
再将以下存为 xx.bat 文件<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"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">c:<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>ftp&nbsp;-n&nbsp;-s:E:\批处理\FTP\config.ftp</span></div>
<img src ="http://www.cnitblog.com/hj627/aggbug/63719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hj627/" target="_blank">白开心</a> 2010-01-12 23:34 <a href="http://www.cnitblog.com/hj627/articles/63719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.NET事务处理</title><link>http://www.cnitblog.com/hj627/articles/62781.html</link><dc:creator>白开心</dc:creator><author>白开心</author><pubDate>Mon, 23 Nov 2009 10:10:00 GMT</pubDate><guid>http://www.cnitblog.com/hj627/articles/62781.html</guid><wfw:comment>http://www.cnitblog.com/hj627/comments/62781.html</wfw:comment><comments>http://www.cnitblog.com/hj627/articles/62781.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hj627/comments/commentRss/62781.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hj627/services/trackbacks/62781.html</trackback:ping><description><![CDATA[<p>ASP.NET事务可以说是在.NET平台上事务实现方式最简单的一种，你仅仅需要一行代码即可。在aspx的页面声明中加一个额外的属性，即事务属性Transaction="Required"，它有如下的值：Disabled（默认）、NotSupported、Supported、Required和RequiresNew，这些设置和COM+及企业级服务中的设置一样，典型的一个例子是如果你想在页面上下文中运行事务，那么要将其设置为Required。如果页面中包含有用户控件，那么这些控件也会包含到事务中，事务会存在于页面的每个地方。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 代码示例：</p>
<p><br>页面声明Transaction="Required"：</p>
<p>&lt;%@ Page Transaction="Required"&nbsp; Language="C#" AutoEventWireup="true" </p>
<p>CodeBehind="WebForm3.aspx.cs" Inherits="WebApplication4.WebForm3" %&gt;</p>
<p>页面引用：using System.EnterpriseServices;。</p>
<p>然后，数据操作代码：</p>
<p>protected void Button1_Click(object sender, EventArgs e)<br>{<br>&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Work1();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Work2();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ContextUtil.SetComplete();&nbsp;&nbsp; //提交事务<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (System.Exception except)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ContextUtil.SetAbort();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //撤销事务<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(except.Message);<br>&nbsp;&nbsp;&nbsp; }&nbsp; <br>}&nbsp; </p>
<p>private void Work1()<br>{<br>&nbsp;&nbsp;&nbsp; string conString = "data source=127.0.0.1;database=codematic;user id=sa;password=";<br>&nbsp;&nbsp;&nbsp; SqlConnection myConnection = new SqlConnection(conString);<br>&nbsp;&nbsp;&nbsp; string strSql = "Insert Into P_Category(CategoryId,Name)values('1','test1')";<br>&nbsp;&nbsp;&nbsp; SqlCommand myCommand = new SqlCommand(strSql, myConnection);<br>&nbsp;&nbsp;&nbsp; myConnection.Open();<br>&nbsp;&nbsp;&nbsp; int rows = myCommand.ExecuteNonQuery();<br>&nbsp;&nbsp;&nbsp; myConnection.Close();</p>
<p>}</p>
<p>private void Work2()<br>{<br>&nbsp;&nbsp;&nbsp; string conString = "data source=127.0.0.1;database=codematic;user id=sa;password=";<br>&nbsp;&nbsp;&nbsp; SqlConnection myConnection = new SqlConnection(conString);<br>&nbsp;&nbsp;&nbsp; string strSql = "Insert Into P_Category(CategoryId,Name)values('2','test2')";<br>&nbsp;&nbsp;&nbsp; SqlCommand myCommand = new SqlCommand(strSql, myConnection);<br>&nbsp;&nbsp;&nbsp; myConnection.Open();<br>&nbsp;&nbsp;&nbsp; int rows = myCommand.ExecuteNonQuery();<br>&nbsp;&nbsp;&nbsp; myConnection.Close();<br>}<br><br>//////////////////////////////////////////////////////////////////////<br></p>
<p><span>现在我们对事务的概念和原理都有所了解了，并且作为已经有一些基础的</span><span><font face="Times New Roman">C#</font></span><span>开发者，我们已经熟知编写数据库交互程序的一些要点，即：</span></p>
<p><span>（</span><span><font face="Times New Roman">1</font></span><span>）使用</span><span><font face="Times New Roman">SqlConnection</font></span><span>类的对象的</span><span><font face="Times New Roman">Open()</font></span><span>方法建立与数据库服务器的连接。</span></p>
<p><span>（</span><span><font face="Times New Roman">2</font></span><span>）然后将该连接赋给</span><span><font face="Times New Roman">SqlCommand</font></span><span>对象的</span><span><font face="Times New Roman">Connection</font></span><span>属性。</span></p>
<p><span>（</span><span><font face="Times New Roman">3</font></span><span>）将欲执行的</span><span><font face="Times New Roman">SQL</font></span><span>语句赋给</span><span><font face="Times New Roman">SqlCommand</font></span><span>的</span><span><font face="Times New Roman">CommandText</font></span><span>属性。</span></p>
<p><span>（</span><span><font face="Times New Roman">4</font></span><span>）通过</span><span><font face="Times New Roman">SqlCommand</font></span><span>对象进行数据库操作。</span></p>
<p><span>创建一个</span><span><font face="Times New Roman">ADO.NET</font></span><span>事务是很简单的，需要定义一个</span><span><font face="Times New Roman">SqlTransaction</font></span><span>类型的对象。</span><span><font face="Times New Roman">SqlConnection </font></span><span>和</span><span><font face="Times New Roman">OleDbConnection</font></span><span>对象都有一个</span><span><font face="Times New Roman"> BeginTransaction </font></span><span>方法，它可以返回</span><span><font face="Times New Roman"> SqlTransaction </font></span><span>或者</span><span><font face="Times New Roman">OleDbTransaction </font></span><span>对象。然后赋给</span><span><font face="Times New Roman">SqlCommand</font></span><span>对象的</span><span><font face="Times New Roman">Transcation</font></span><span>属性，即实现了二者的关联。为了使事务处理可以成功完成，必须调用</span><span><font face="Times New Roman">SqlTransaction</font></span><span>对象的</span><span><font face="Times New Roman">Commit()</font></span><span>方法。如果有错误，则必须调用</span><span><font face="Times New Roman">Rollback()</font></span><span>方法撤销所有的操作。</span></p>
<p><span>基于以上认识，下面我们就开始动手写一个基于</span><span><font face="Times New Roman">ADO.NET</font></span><span>的事务处理程序。</span></p>
<p><span><font size=2><font size=+0><font face="Courier New">string conString = "data source=127.0.0.1;database=codematic;user id=sa;</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New">password=";</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New">SqlConnection myConnection = new SqlConnection(conString);</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New">myConnection.Open();</font></font></font></span></p>
<p><span><font face="Courier New" size=2>&nbsp;</font></span></p>
<p><font size=2><font size=+0><span><font face="Courier New">//</font></span><span>启动一个事务</span></font></font></p>
<p><strong><span><font size=2><font size=+0><font face="Courier New">SqlTransaction myTrans = myConnection.BeginTransaction();</font></font></font></span></strong></p>
<p><span><font face="Courier New" size=2>&nbsp;</font></span></p>
<p><font size=2><font size=+0><span><font face="Courier New">//</font></span><span>为事务创建一个命令</span></font></font></p>
<p><span><font size=2><font size=+0><font face="Courier New">SqlCommand myCommand = new SqlCommand();</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New">myCommand.Connection = myConnection;</font></font></font></span></p>
<p><strong><span><font size=2><font size=+0><font face="Courier New">myCommand.Transaction = myTrans;</font></font></font></span></strong></p>
<p><span><font size=2><font size=+0><font face="Courier New">try</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New">{</font></font></font></span></p>
<p><font size=2><font size=+0><span><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>myCommand.CommandText = "update P_Product set Name='</font></span><span>电脑</span><span><font face="Courier New">2' where Id=52";</font></span></font></font></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>myCommand.ExecuteNonQuery();</font></font></font></span></p>
<p><font size=2><font size=+0><span><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>myCommand.CommandText = "update P_Product set Name='</font></span><span>电脑</span><span><font face="Courier New">3' where Id=53";</font></span></font></font></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>myCommand.ExecuteNonQuery();</font></font></font></span></p>
<p><font size=2><font size=+0><span><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span><strong>myTrans.Commit();//</strong></font></span><strong><span>提交</span></strong><strong></strong></font></font></p>
<p><font size=2><font size=+0><span><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>Response.Write("</font></span><span>两条数据更新成功</span><span><font face="Courier New">");</font></span></font></font></p>
<p><span><font size=2><font size=+0><font face="Courier New">}</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New">catch (Exception ex)</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New">{</font></font></font></span></p>
<p><font size=2><font size=+0><span><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span><strong>myTrans.Rollback();//</strong></font></span><strong><span>遇到错误，回滚</span></strong><strong></strong></font></font></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>Response.Write(ex.ToString());<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New">}</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New">finally</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New">{</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>myConnection.Close();</font></font></font></span></p>
<p><font size=2><font size=+0><font face="Courier New"><span>}</span></font></font></font></p>
<p><span><font face="Times New Roman">ADO.NET</font></span><span>事务的优势和限制如下。</span></p>
<p><span>优势：</span></p>
<p><span><span>l&nbsp;</span></span><span>简单。</span></p>
<p><span><span>l&nbsp;</span></span><span>和数据库事务差不多快。</span></p>
<p><span><span>l&nbsp;</span></span><span>事务可以跨越多个数据库访问。</span></p>
<p><span><span>l&nbsp;</span></span><span>独立于数据库，不同数据库的专有代码被隐藏了。</span></p>
<p><span>限制：事务执行在数据库连接层上，所以需要在执行事务的过程中手动地维护一个连接。</span></p>
<p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=63>
            <p align=center></p>
            <p align=center><span>注<span>&nbsp;</span>意</span></p>
            </td>
            <td width=499>
            <p><span>所有命令都必须关联在同一个连接实例上，</span><span>ADO.NET</span><span>事务处理不支持跨多个连接的事务处理</span><span>。</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;////////////////////////////////////////////////////////////<br></p>
<p><span>在</span><span><font face="Times New Roman"> .NET Framework 2.0</font></span><span>中增加了</span><span><font face="Times New Roman">System.Transactions</font></span><span>，这是一种新的命名空间，完全专注于控制事务性行为。</span><span>引入了执行事务性工作的更简单方法及一些新的性能优化。</span><span><font face="Times New Roman">System.Transactions</font></span><span>提供了一个&#8220;轻量级&#8221;的、易于使用的</span><span><font face="Times New Roman">Transaction</font></span><span>框架。</span></p>
<p><span>在上节中，要实现</span><span><font face="Times New Roman">Transaction</font></span><span>需要利用</span><span><font face="Times New Roman">EnterpriseServices</font></span><span>，让组件从</span><span><font face="Times New Roman">ServiceComponent</font></span><span>继承下来。而通过</span><span><font face="Times New Roman">System.Transactions</font></span><span>，则只要简单的几行代码，不需要继承，不需要</span><span><font face="Times New Roman">Attribute</font></span><span>标记。用户根本不需要考虑是简单事务还是分布式事务。新模型会自动根据事务中涉及的对象资源判断使用何种事务管理器。简而言之，对于任何的事务，用户只要使用同一种方法进行处理即可。</span></p>
<p><span>下面介绍</span><span><font face="Times New Roman">System.Transactions</font></span><span>的几种用法。</span></p>
<p><span>首先要引用：</span><strong><span><font face="Times New Roman">using System.Transactions;</font></span></strong><span>。</span><strong></strong></p>
<p><span>其次，将事务操作代码放在</span><span><font face="Times New Roman">TransactionScope</font></span><span>中执行。如：</span><span><font face="Times New Roman"> </font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New">using (TransactionScope ts = new TransactionScope())</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New">{</font></font></font></span></p>
<p><font size=2><font size=+0><font face="Courier New"><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>//</span></font><span>事务操作代码</span></font></font></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>ts.Complete();</font></font></font></span></p>
<p><font size=2><font size=+0><font face="Courier New"><span>}</span></font></font></font></p>
<p>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>代码示例：</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<span>这是最简单，也是最常见的用法。创建了新的</span><span><font face="Times New Roman"> TransactionScope </font></span><span>对象后，即开始创建事务范围。如代码示例所示，建议使用</span><span><font face="Times New Roman"> using </font></span><span>语句创建范围。</span><span>位于</span><span><font face="Times New Roman"> using </font></span><span>块内的所有操作将成为一个事务的一部分，因为它们共享其所定义的事务执行上下文。本例中的最后一行，调用</span><span><font face="Times New Roman"> TransactionScope </font></span><span>的</span><span><font face="Times New Roman"> Complete </font></span><span>方法，将导致退出该块时请求提交该事务。此方法还提供了内置的错误处理，出现异常时会终止事务。</span><span><font face="Times New Roman"> </font></span></p>
<p><font size=2><font size=+0><strong><span><font face="Courier New">using (TransactionScope ts = new TransactionScope())//</font></span></strong><strong><span>使整个代码块成为事务性代码</span></strong><strong></strong></font></font></p>
<p><span><font size=2><font size=+0><font face="Courier New">{</font></font></font></span></p>
<p><font size=2><font size=+0><span><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>#region </font></span><span>在这里编写需要具备</span><span><font face="Courier New">Transaction</font></span><span>的代码</span></font></font></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>string msg = "";</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>string conString = "data source=127.0.0.1;database=codematic;user id=sa;</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New">password=";</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>SqlConnection myConnection = new SqlConnection(conString);</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>myConnection.Open();</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>SqlCommand myCommand = new SqlCommand();</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>myCommand.Connection = myConnection;</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp; </span>&nbsp;try</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>{</font></font></font></span></p>
<p><font size=2><font size=+0><font face="Courier New"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>myCommand.CommandText = "update P_Product set Name='</span></font><span>电脑</span><span><font face="Courier New">2' where Id=52";</font></span></font></font></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>myCommand.ExecuteNonQuery();</font></font></font></span></p>
<p><font size=2><font size=+0><font face="Courier New"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>myCommand.CommandText = "update P_Product set Name='</span></font><span>电脑</span><span><font face="Courier New">3' where Id=53";</font></span></font></font></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>myCommand.ExecuteNonQuery();</font></font></font></span></p>
<p><font size=2><font size=+0><span><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>msg = "</font></span><span>成功</span><span><font face="Courier New">!";</font></span></font></font></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>}</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>catch (Exception ex)</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>{</font></font></font></span></p>
<p><font size=2><font size=+0><span><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>msg = "</font></span><span>失败</span><span><font face="Courier New">:" + ex.Message;</font></span></font></font></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>}</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>finally</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>{</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>myConnection.Close();</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>}</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>#endregion</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span><strong>ts.Complete();</strong></font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>return msg;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></font></font></span></p>
<p><font size=2><font size=+0><font face="Courier New"><span>}<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></font></font></font></p>
<p><span>上面的代码演示了在一个</span><span><font face="Times New Roman">Transaction Scope</font></span><span>里面打开一个数据库连接的过程。这个数据库连接由于处在一个</span><span><font face="Times New Roman">Transaction Scope</font></span><span>里面，所以会自动获得</span><span><font face="Times New Roman">Transaction</font></span><span>的能力。如果这里数据库连接的是</span><span><font face="Times New Roman">SQL Server 2005</font></span><span>，那么这个</span><span><font face="Times New Roman">Transaction</font></span><span>将不会激活一个</span><span><font face="Times New Roman">MSDTC</font></span><span>管理的分布式事务，而是会由</span><span><font face="Times New Roman">.NET</font></span><span>创建一个</span><span><font face="Times New Roman">Local Transaction</font></span><span>，性能非常高。但是如果是</span><span><font face="Times New Roman">SQL Server 2000</font></span><span>，则会自动激活一个分布式事务，在性能上会受一定的损失。</span></p>
<p><span>再看下面的例子：</span></p>
<p><span><font size=2><font size=+0><font face="Courier New">void MethodMoreConn()</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New">{</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>using (TransactionScope ts = new TransactionScope())</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>{</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>using (SqlConnection conn = new SqlConnection(conString1))</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>conn.Open();</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>using (SqlConnection conn2 = new SqlConnection(conString2))</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>conn2.Open();</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span>}</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ts.Complete();</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>} </font></font></font></span></p>
<p><span><font face="Courier New" size=2>}</font></span></p>
<p><span>这个例子更加充分地说明了</span><span><font face="Times New Roman">Transaction Scope</font></span><span>的强大，两个数据库连接！虽然上面的</span><span><font face="Times New Roman">conn</font></span><span>和</span><span><font face="Times New Roman">conn2</font></span><span>是两个不同的连接对象，可能分别连接到不同的数据库，但是由于它们处在一个</span><span><font face="Times New Roman">TransactionScope</font></span><span>中，它们就具备了&#8220;联动&#8221;的</span><span><font face="Times New Roman">Transaction</font></span><span>能力。在这里，将自动激活一个</span><span><font face="Times New Roman">MSDTC</font></span><span>管理的分布式事务（可以通过打开【管理工具】里面的组件服务，来查看当前的分布式事务列表）。</span></p>
<h4><span><font face=Arial>1</font></span><span>．在分布式事务中登记</span></h4>
<p><span><font face="Times New Roman">ADO.NET 2.0 </font></span><span>中的新增功能支持使用</span><span><font face="Times New Roman"> EnlistTransaction </font></span><span>方法在分布式事务中登记。由于</span><span><font face="Times New Roman"> EnlistTransaction </font></span><span>在</span><span><font face="Times New Roman"> Transaction </font></span><span>实例中登记连接，因此，该方法利用</span><span><font face="Times New Roman"> System.Transactions </font></span><span>命名空间中的可用功能来管理分布式事务，从而比使用</span><span><font face="Times New Roman"> System.EnterpriseServices. ITransaction </font></span><span>对象的</span><span><font face="Times New Roman"> EnlistDistributedTransaction </font></span><span>更可取。此外，其语义也稍有不同：在一个事务中显式登记了某个连接后，如果第一个事务尚未完成，则无法取消登记或在另一个事务中登记该连接。</span></p>
<p><span><font size=2><font size=+0><font face="Courier New">void MethodEnlist()</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New">{</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>CommittableTransaction tx = new CommittableTransaction();</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>using (SqlConnection conn = new SqlConnection(conString))</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>{</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>conn.EnlistTransaction(tx);</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>}</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>tx.Commit();</font></font></font></span></p>
<p><span><font face="Courier New" size=2>}</font></span></p>
<h4><span><font face=Arial>2</font></span><span>．实现嵌套事务范围</span></h4>
<p><span><font size=2><font size=+0><font face="Courier New">void RootMethod()</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New">{</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>using (TransactionScope scope = new TransactionScope())</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>{</font></font></font></span></p>
<p><font size=2><font size=+0><span><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</font></span><span>操作代码</span></font></font></p>
<p><font size=2><font size=+0><span><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SonMethod();//</font></span><span>子事务方法</span></font></font></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>scope.Complete();</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>}</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New">}</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New">void SonMethod()</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New">{</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>using (TransactionScope scope = new TransactionScope())</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>{</font></font></font></span></p>
<p><font size=2><font size=+0><span><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</font></span><span>操作代码</span></font></font></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>scope.Complete();</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>}</font></font></font></span></p>
<p><span><font face="Courier New" size=2>}</font></span></p>
<h4><span><font face=Arial>3</font></span><span>．事务范围附加选项</span></h4>
<p><span>如果你想要保留代码部分执行的操作，并且在操作失败的情况下不希望中止环境事务，则</span><span><font face="Times New Roman">Suppress</font></span><span>对你很有帮助。例如，在你想要执行日志记录或审核操作时，不管你的环境事务是提交还是中止，上述值都很有用。该值允许你在事务范围内具有非事务性的代码部分，如以下示例所示。</span></p>
<p><span><font size=2><font size=+0><font face="Courier New">void MethodSuppress()</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New">{</font></font></font></span></p>
<p><font size=2><font size=+0><span><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>using (TransactionScope scope1 = new TransactionScope())//</font></span><span>开始事务</span></font></font></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp; </span>{</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>try</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</font></font></font></span></p>
<p><font size=2><font size=+0><span><font face="Courier New">&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>//</font></span><span>开始一个非事务范围</span><span><font face="Courier New"> </font></span></font></font></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>using (TransactionScope scope2 = new TransactionScope(</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong>TransactionScopeOption.Suppress</strong>))</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</font></font></font></span></p>
<p><font size=2><font size=+0><span><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</font></span><span>不受事务控制代码</span></font></font></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font></font></font></span></p>
<p><font size=2><font size=+0><span><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</font></span><span>从这里开始又回归事务处理</span></font></font></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>catch</font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{ }<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></font></font></span></p>
<p><span><font size=2><font size=+0><font face="Courier New">&nbsp;<span>&nbsp;&nbsp;</span>}</font></font></font></span></p>
<p><span><font face="Courier New" size=2>}</font></span></p>
<p><span>虽然</span><span><font face="Times New Roman">.NET 2.0</font></span><span>对事务提供了很好的支持，但是没有必要总是使用事务。使用事务的第一条规则是，在能够使用事务的时候都应该使用事务，但是不要使用过度。原因在于，每次使用事务都会占用一定的开销。另外，事务可能会锁定一些表的行。还有一条规则是，只有当操作需要的时候才使用事务。例如，如果只是从数据库中查询一些记录，或者执行单个查询，则在大部分时候都不需要使用显式事务。</span><font face="Times New Roman"> </font></p>
<p><span>开发人员应该在头脑中始终保持一个概念，就是用于修改多个不同表数据的冗长事务会严重妨碍系统中的所有其他用户。这很可能导致一些性能问题。当实现一个事务时，遵循下面的实践经验能够达到可接受的结果：</span></p>
<p><span><span>l&nbsp;</span></span><span>避免使用在事务中的</span><span><font face="Times New Roman">Select</font></span><span>返回数据，除非语句依赖于返回数据。</span></p>
<p><span><span>l&nbsp;</span></span><span>如果使用</span><span><font face="Times New Roman">Select</font></span><span>语句，则只选择需要的行，这样不会锁定过多的资源，而尽可能地提高性能。</span></p>
<p><span><span>l&nbsp;</span></span><span>尽量将事务全部写在</span><span><font face="Times New Roman">T-SQL</font></span><span>或者</span><span><font face="Times New Roman">API</font></span><span>中。</span></p>
<p><span><span>l&nbsp;</span></span><span>避免事务与多重独立的批处理工作结合，应该将这些批处理放置在单独的事务中。</span></p>
<p><span><span>l&nbsp;</span></span><span>尽可能避免大量更新。</span><span><font face="Times New Roman"> </font></span></p>
<p><span>另外，必须注意的一点就是事务的默认行为。在默认情况下，如果没有显式地提交事务，则事务会回滚。虽然默认行为允许事务的回滚，但是显式回滚方法总是一个良好的编程习惯。这不仅仅只是释放锁定数据，也将使得代码更容易读取并且更少错误。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .NET</span><span>提供的事务功能很强大，具体的内容远不止本文所讲解的这样简单。本文只是起到一个抛砖引玉的功能。希望读者能够灵活恰当地使用事务功能，而不要过度使用事务，否则可能会对性能起到消极的作用。</span><span>&nbsp;</span></p>
<p><span></span>&nbsp;</p>
<img src ="http://www.cnitblog.com/hj627/aggbug/62781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hj627/" target="_blank">白开心</a> 2009-11-23 18:10 <a href="http://www.cnitblog.com/hj627/articles/62781.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>静态网页传递数值的三种方法</title><link>http://www.cnitblog.com/hj627/articles/39231.html</link><dc:creator>白开心</dc:creator><author>白开心</author><pubDate>Wed, 23 Jan 2008 07:07:00 GMT</pubDate><guid>http://www.cnitblog.com/hj627/articles/39231.html</guid><wfw:comment>http://www.cnitblog.com/hj627/comments/39231.html</wfw:comment><comments>http://www.cnitblog.com/hj627/articles/39231.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hj627/comments/commentRss/39231.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hj627/services/trackbacks/39231.html</trackback:ping><description><![CDATA[<p><font size=4><strong><font color=#dc143c>Window.open篇</font></strong></font></p>
<p><font size=4>这两窗口之间存在着关系.父窗口parent.htm打开子窗口son.htm<br>子窗口可以通过window.opener指向父窗口.这样可以访问父窗口的对象.</font></p>
<p><font size=4>优点:取值方便.只要window.opener指向父窗口,就可以访问所有对象.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不仅可以访问值,还可以访问父窗口的方法.值长度无限制.<br>缺点:两窗口要存在着关系.就是利用window.open打开的窗口.不能跨域.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></p>
<p><font size=4>Post.htm</font></p>
<p><font size=4>&lt;input type=text name=maintext&gt;<br>&lt;input type=button onclick="window.open('Read.htm')" value="Open"&gt;</font></p>
<p><font size=4>Read.htm</font></p>
<p><font size=4>&lt;script language="javascript" &gt;<br>//window.open打开的窗口.<br>//利用opener指向父窗口.<br>var parentText = window.opener.document.all.maintext.value;<br>alert(parentText);<br>&lt;/script&gt;</font></p>
<p><font size=4><br><strong><font color=#dc143c>利用Cookie.</font></strong></font></p>
<p><font size=4>Cookie是浏览器存储少量命名数据.<br>它与某个特定的网页或网站关联在一起.<br>Cookie用来给浏览器提供内存,<br>以便脚本和服务器程序可以在一个页面中使用另一个页面的输入数据.</font></p>
<p><font size=4>优点:可以在同源内的任意网页内访问.生命期可以设置.<br>缺点:值长度有限制.</font></p>
<p><font size=4>Post.htm</font></p>
<p><font size=4>&lt;input type="text" name="txt1"&gt;<br>&lt;input type="button" onclick="setCookie('baobao',document.all.txt1.value)" value="Post"&gt;<br>&lt;script language="javascript" &gt;<br>function setCookie(name,value)<br>{<br>/*<br>&nbsp;*--------------- setCookie(name,value) -----------------<br>&nbsp;* setCookie(name,value)<br>&nbsp;* 功能:设置得变量name的值<br>&nbsp;* 参数:name,字符串;value,字符串.<br>&nbsp;* 实例:setCookie('username','baobao')<br>&nbsp;*--------------- setCookie(name,value) -----------------<br>&nbsp;*/<br>&nbsp;&nbsp;&nbsp; var Days = 30; //此 cookie 将被保存 30 天<br>&nbsp;&nbsp;&nbsp; var exp&nbsp; = new Date();<br>&nbsp;&nbsp;&nbsp; exp.setTime(exp.getTime() + Days*24*60*60*1000);<br>&nbsp;&nbsp;&nbsp; document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();<br>&nbsp;&nbsp;&nbsp; location.href = "Read.htm"; //接收页面.<br>}<br>&lt;/script&gt;</font></p>
<p><font size=4><br>Read.htm</font></p>
<p><font size=4>&lt;script language="javascript" &gt;<br>function getCookie(name)<br>{<br>/*<br>&nbsp;*--------------- getCookie(name) -----------------<br>&nbsp;* getCookie(name)<br>&nbsp;* 功能:取得变量name的值<br>&nbsp;* 参数:name,字符串.<br>&nbsp;* 实例:alert(getCookie("baobao"));<br>&nbsp;*--------------- getCookie(name) -----------------<br>&nbsp;*/<br>&nbsp;&nbsp;&nbsp; var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"));<br>&nbsp;&nbsp;&nbsp; if(arr !=null) return unescape(arr[2]); return null;<br>}<br>alert(getCookie("baobao"));<br>&lt;/script&gt;</font></p>
<p><font size=4><br><strong><font color=#dc143c>&nbsp;URL篇</font></strong></font></p>
<p><font size=4>能过URL进行传值.把要传递的信息接在URL上.</font></p>
<p><font size=4>优点:取值方便.可以跨域.<br>缺点:值长度有限制.</font></p>
<p><font size=4><strong>Post.htm</strong></font></p>
<p><font size=4>&lt;input type="text" name="username"&gt;<br>&lt;input type="text" name="sex"&gt;<br>&lt;input type="button" onclick="Post()" value="Post"&gt;<br>&lt;script language="javascript" &gt;<br>function Post()<br>{<br>&nbsp;&nbsp;&nbsp; //单个值 Read.htm?username=baobao;<br>&nbsp;&nbsp;&nbsp; //多全值 Read.htm?username=baobao&amp;sex=male;<br>&nbsp;&nbsp;&nbsp; url = "Read.htm?username="+escape(document.all.username.value);<br>&nbsp;&nbsp;&nbsp; url += "&amp;sex=" + escape(document.all.sex.value);<br>&nbsp;&nbsp;&nbsp; location.href=url;<br>}<br>&lt;/script&gt;</font></p>
<p><font size=4><br><strong>Read.htm</strong></font></p>
<p><font size=4>&lt;script language="javascript" &gt;<br>/*<br>&nbsp;*--------------- Read.htm -----------------<br>&nbsp;* Request[key]<br>&nbsp;* 功能:实现ASP的取得URL字符串,Request("AAA")<br>&nbsp;* 参数:key,字符串.<br>&nbsp;* 实例:alert(Request["AAA"])<br>&nbsp;*--------------- Request.htm -----------------<br>&nbsp;*/<br>var url=location.search;<br>var Request = new Object();<br>if(url.indexOf("?")!=-1)<br>{<br>&nbsp;&nbsp;&nbsp; var str = url.substr(1)&nbsp; //去掉?号<br>&nbsp;&nbsp;&nbsp; strs = str.split("&amp;");<br>&nbsp;&nbsp;&nbsp; for(var i=0;i&lt;strs.length;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Request[strs[i].split("=")[0]]=unescape(strs[i].split("=")[1]);<br>&nbsp;&nbsp;&nbsp; }<br>}<br>alert(Request["username"])<br>alert(Request["sex"])<br>&lt;/script&gt;</font></p>
<img src ="http://www.cnitblog.com/hj627/aggbug/39231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hj627/" target="_blank">白开心</a> 2008-01-23 15:07 <a href="http://www.cnitblog.com/hj627/articles/39231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ASP.NET常用代码 </title><link>http://www.cnitblog.com/hj627/articles/37631.html</link><dc:creator>白开心</dc:creator><author>白开心</author><pubDate>Wed, 12 Dec 2007 07:56:00 GMT</pubDate><guid>http://www.cnitblog.com/hj627/articles/37631.html</guid><wfw:comment>http://www.cnitblog.com/hj627/comments/37631.html</wfw:comment><comments>http://www.cnitblog.com/hj627/articles/37631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hj627/comments/commentRss/37631.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hj627/services/trackbacks/37631.html</trackback:ping><description><![CDATA[<p>1. 打开新的窗口并传送参数： <br>传送参数：<br>response.write("&lt;script&gt;window.open('*.aspx?id="+this.DropDownList1.SelectIndex+"&amp;id1="+...+"')&lt;/script&gt;")</p>
<p>接收参数：<br>string a = Request.QueryString("id");<br>string b = Request.QueryString("id1");</p>
<p><br>2.为按钮添加对话框</p>
<p><br>传送参数：<br>response.write("&lt;script&gt;window.open('*.aspx?id="+this.DropDownList1.SelectIndex+"&amp;id1="+...+"')&lt;/script&gt;")</p>
<p>接收参数：<br>string a = Request.QueryString("id");<br>string b = Request.QueryString("id1");</p>
<p><br>2.为按钮添加对话框</p>
<p>Button1.Attributes.Add("<em>onclick</em>","return confirm('确认?')");</p>
<p>button.attributes.add("<em>onclick</em>","if(confirm('are you sure...?')){return true;}else{return false;}")</p>
<p><br>3.删除表格选定记录</p>
<p>int intEmpID = (int)MyDataGrid.DataKeys[e.Item.ItemIndex];<br>string deleteCmd = "DELETE from Employee where emp_id = " + intEmpID.ToString()</p>
<p>4.删除表格记录警告<br>private void DataGrid_ItemCreated(Object sender,DataGridItemEventArgs e)<br>{<br>switch(e.Item.ItemType)<br>{<br>case ListItemType.Item :<br>case ListItemType.AlternatingItem :<br>case ListItemType.EditItem:<br>TableCell myTableCell;<br>myTableCell = e.Item.Cells[14];<br>LinkButton myDeleteButton ;<br>myDeleteButton = (LinkButton)myTableCell.Controls[0];<br>myDeleteButton.Attributes.Add("<em>onclick</em>","return confirm('您是否确定要删除这条信息');");<br>break;<br>default:<br>break;<br>}</p>
<p>}</p>
<p><br>5.点击表格行链接另一页</p>
<p>private void grdCustomer_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)<br>{<br>//点击表格打开<br>if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)<br>e.Item.Attributes.Add("<em>onclick</em>","window.open('Default.aspx?id=" + e.Item.Cells[0].Text + "');");<br>}</p>
<p><br>双击表格连接到另一页<br>在itemDataBind事件中<br>if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)<br>{<br>string OrderItemID =e.item.cells[1].Text;<br>...<br>e.item.Attributes.Add("ondblclick", "location.href='../ShippedGrid.aspx?id=" + OrderItemID + "'");<br>}<br>双击表格打开新一页<br>if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)<br>{<br>string OrderItemID =e.item.cells[1].Text;<br>...<br>e.item.Attributes.Add("ondblclick", "open('../ShippedGrid.aspx?id=" + OrderItemID + "')");<br>}<br>★特别注意：【?id=】 处不能为 【?id =】</p>
<p>6.表格超连接列传递参数<br>&lt;asp:HyperLinkColumn Target="_blank" headertext="ID号" DataTextField="id" NavigateUrl="aaa.aspx?id='&lt;%# DataBinder.Eval(Container.DataItem, "数据字段1")%&gt;' &amp; name='&lt;%# DataBinder.Eval(Container.DataItem, "数据字段2")%&gt;' /&gt;</p>
<p><br>7.表格点击改变颜色<br>if (e.Item.ItemType == ListItemType.Item ||e.Item.ItemType == ListItemType.AlternatingItem)<br>{<br>e.Item.Attributes.Add("<em>onclick</em>","this.style.backgroundColor='#99cc00';this.style.color='buttontext';this.style.cursor='default';");<br>}</p>
<p><br>写在DataGrid的_ItemDataBound里<br>if (e.Item.ItemType == ListItemType.Item ||e.Item.ItemType == ListItemType.AlternatingItem)<br>{<br>e.Item.Attributes.Add("<em>onmouse</em>over","this.style.backgroundColor='#99cc00';this.style.color='buttontext';this.style.cursor='default';");<br>e.Item.Attributes.Add("<em>onmouse</em>out","this.style.backgroundColor='';this.style.color='';");<br>}</p>
<p>8.关于日期格式</p>
<p>日期格式设定<br>DataFormatString="{0:yyyy-MM-dd}"</p>
<p>我觉得应该在itembound事件中<br>e.items.cell["你的列"].text=DateTime.Parse(e.items.cell["你的列"].text.ToString("yyyy-MM-dd"))</p>
<p>9.获取错误信息并到指定页面<br>不要使用Response.Redirect,而应该使用Server.Transfer<br>e.g<br>// in global.asax<br>protected void Application_Error(Object sender, EventArgs e) {<br>if (Server.GetLastError() is HttpUnhandledException)<br>Server.Transfer("MyErrorPage.aspx");</p>
<p>//其余的非HttpUnhandledException异常交给ASP.NET自己处理就okay了 :)<br>}</p>
<p>Redirect会导致post－back的产生从而丢失了错误信息，所以页面导向应该直接在服务器端执行，这样就可以在错误处理页面得到出错信息并进行相应的处理</p>
<p><br>10.清空Cookie<br>Cookie.Expires=[DateTime];<br>Response.Cookies("UserName").Expires = 0</p>
<p><br>11.自定义异常处理</p>
<p>//自定义异常处理类 <br>using System;<br>using System.Diagnostics;</p>
<p>namespace MyAppException<br>{<br>/// &lt;summary&gt;<br>/// 从系统异常类ApplicationException继承的应用程序异常处理类。<br>/// 自动将异常内容记录到Windows NT/2000的应用程序日志<br>/// &lt;/summary&gt;<br>public class AppException:System.ApplicationException<br>{<br>public AppException()<br>{<br>if (ApplicationConfiguration.EventLogEnabled)<br>LogEvent("出现一个未知错误。");<br>}</p>
<p>public AppException(string message)<br>{<br>LogEvent(message);<br>}</p>
<p>public AppException(string message,Exception innerException)<br>{<br>LogEvent(message);<br>if (innerException != null)<br>{<br>LogEvent(innerException.Message);<br>}<br>}</p>
<p>//日志记录类<br>using System;<br>using System.Configuration;<br>using System.Diagnostics;<br>using System.IO;<br>using System.Text;<br>using System.Threading;</p>
<p>namespace MyEventLog<br>{<br>/// &lt;summary&gt;<br>/// 事件日志记录类，提供事件日志记录支持 <br>/// &lt;remarks&gt;<br>/// 定义了4个日志记录方法 (error, warning, info, trace) <br>/// &lt;/remarks&gt;<br>/// &lt;/summary&gt;<br>public class ApplicationLog<br>{<br>/// &lt;summary&gt;<br>/// 将错误信息记录到Win2000/NT事件日志中<br>/// &lt;param name="message"&gt;需要记录的文本信息&lt;/param&gt;<br>/// &lt;/summary&gt;<br>public static void WriteError(String message)<br>{<br><br>WriteLog(TraceLevel.Error, message);<br>}<br><br>/// &lt;summary&gt;<br>/// 将警告信息记录到Win2000/NT事件日志中<br>/// &lt;param name="message"&gt;需要记录的文本信息&lt;/param&gt;<br>/// &lt;/summary&gt;<br>public static void WriteWarning(String message)<br>{<br><br>WriteLog(TraceLevel.Warning, message);<br>}<br><br>/// &lt;summary&gt;<br>/// 将提示信息记录到Win2000/NT事件日志中<br>/// &lt;param name="message"&gt;需要记录的文本信息&lt;/param&gt;<br>/// &lt;/summary&gt;<br>public static void WriteInfo(String message)<br>{<br>WriteLog(TraceLevel.Info, message);<br>}<br>/// &lt;summary&gt;<br>/// 将跟踪信息记录到Win2000/NT事件日志中<br>/// &lt;param name="message"&gt;需要记录的文本信息&lt;/param&gt;<br>/// &lt;/summary&gt;<br>public static void WriteTrace(String message)<br>{<br><br>WriteLog(TraceLevel.Verbose, message);<br>}<br><br>/// &lt;summary&gt;<br>/// 格式化记录到事件日志的文本信息格式<br>/// &lt;param name="ex"&gt;需要格式化的异常对象&lt;/param&gt;<br>/// &lt;param name="catchInfo"&gt;异常信息标题字符串.&lt;/param&gt;<br>/// &lt;retvalue&gt;<br>/// &lt;para&gt;格式后的异常信息字符串，包括异常内容和跟踪堆栈.&lt;/para&gt;<br>/// &lt;/retvalue&gt;<br>/// &lt;/summary&gt;<br>public static String FormatException(Exception ex, String catchInfo)<br>{<br>StringBuilder strBuilder = new StringBuilder();<br>if (catchInfo != String.Empty)<br>{<br>strBuilder.Append(catchInfo).Append("\r\n");<br>}<br>strBuilder.Append(ex.Message).Append("\r\n").Append(ex.StackTrace);<br>return strBuilder.ToString();<br>}</p>
<p>/// &lt;summary&gt;<br>/// 实际事件日志写入方法<br>/// &lt;param name="level"&gt;要记录信息的级别（error,warning,info,trace).&lt;/param&gt;<br>/// &lt;param name="messageText"&gt;要记录的文本.&lt;/param&gt;<br>/// &lt;/summary&gt;<br>private static void WriteLog(TraceLevel level, String messageText)<br>{<br><br>try<br>{ <br>EventLogEntryType LogEntryType;<br>switch (level)<br>{<br>case TraceLevel.Error:<br>LogEntryType = EventLogEntryType.Error;<br>break;<br>case TraceLevel.Warning:<br>LogEntryType = EventLogEntryType.Warning;<br>break;<br>case TraceLevel.Inf<br>LogEntryType = EventLogEntryType.Information;<br>break;<br>case TraceLevel.Verbose:<br>LogEntryType = EventLogEntryType.SuccessAudit;<br>break;<br>default:<br>LogEntryType = EventLogEntryType.SuccessAudit;<br>break;<br>}<br><br>EventLog eventLog = new EventLog("Application", ApplicationConfiguration.EventLogMachineName, ApplicationConfiguration.EventLogSourceName );<br>//写入事件日志<br>eventLog.WriteEntry(messageText, LogEntryType);<br><br>}<br>catch {} //忽略任何异常<br>} <br>} //class ApplicationLog<br>}</p>
<p><br>12.Panel 横向滚动，纵向自动扩展<br>&lt;asp:panel style="overflow-x:scroll;overflow-y:auto;"&gt;&lt;/asp:panel&gt;</p>
<p><br>13.回车转换成Tab <br>&lt;script language="javascript" for="document" event="<em>onkey</em>down"&gt;<br>if(event.keyCode==13 &amp;&amp; event.srcElement.type!='button' &amp;&amp; event.srcElement.type!='submit' &amp;&amp; event.srcElement.type!='reset' &amp;&amp; event.srcElement.type!=''&amp;&amp; event.srcElement.type!='textarea'); <br>event.keyCode=9;<br>&lt;/script&gt;</p>
<p><em>onkey</em>down="if(event.keyCode==13) event.keyCode=9"</p>
<p><a href="http://dotnet.aspx.cc/exam/enter2tab.aspx"><font color=#002c99>http://dotnet.aspx.cc/exam/enter2tab.aspx</font></a></p>
<p><br>14.DataGrid超级连接列<br>DataNavigateUrlField="字段名" DataNavigateUrlFormatString="<a href="http://xx/inc/delete.aspx?ID={0"><font color=#002c99>http://xx/inc/delete.aspx?ID={0</font></a>}"</p>
<p><br>15.DataGrid行随鼠标变色<br>private void DGzf_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)<br>{<br>if (e.Item.ItemType!=ListItemType.Header)<br>{<br>e.Item.Attributes.Add( "<em>onmouse</em>out","this.style.backgroundColor=\""+e.Item.Style["BACKGROUND-COLOR"]+"\"");<br>e.Item.Attributes.Add( "<em>onmouse</em>over","this.style.backgroundColor=\""+ "#EFF3F7"+"\"");<br>}<br><br>}</p>
<p><br>16.模板列<br>&lt;ASP:TEMPLATECOLUMN visible="False" sortexpression="demo" headertext="ID"&gt;<br>&lt;ITEMTEMPLATE&gt;<br>&lt;ASP:LABEL text='&lt;%# DataBinder.Eval(Container.DataItem, "ArticleID")%&gt;' runat="server" width="80%" id="lblColumn" /&gt;<br>&lt;/ITEMTEMPLATE&gt;<br>&lt;/ASP:TEMPLATECOLUMN&gt;</p>
<p><br>&lt;ASP:TEMPLATECOLUMN headertext="选中"&gt;<br>&lt;HEADERSTYLE wrap="False" horizontalalign="Center"&gt;&lt;/HEADERSTYLE&gt;<br>&lt;ITEMTEMPLATE&gt;<br>&lt;ASP:CHECKBOX id="chkExport" runat="server" /&gt;<br>&lt;/ITEMTEMPLATE&gt;<br>&lt;EDITITEMTEMPLATE&gt;<br>&lt;ASP:CHECKBOX id="chkExportON" runat="server" enabled="true" /&gt;<br>&lt;/EDITITEMTEMPLATE&gt;<br>&lt;/ASP:TEMPLATECOLUMN&gt;</p>
<p>后台代码</p>
<p>protected void CheckAll_CheckedChanged(object sender, System.EventArgs e)<br>{<br>//改变列的选定，实现全选或全不选。<br>CheckBox chkExport ;<br>if( CheckAll.Checked)<br>{<br>foreach(DataGridItem oDataGridItem in MyDataGrid.Items)<br>{<br>chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");<br>chkExport.Checked = true;<br>}<br>}<br>else<br>{<br>foreach(DataGridItem oDataGridItem in MyDataGrid.Items)<br>{<br>chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");<br>chkExport.Checked = false;<br>}<br>}<br>}</p>
<p>17.数字格式化<br>【&lt;%#Container.DataItem("price")%&gt;的结果是500.0000，怎样格式化为500.00?】</p>
<p>&lt;%#Container.DataItem("price","{0:￥#,##0.00}")%&gt;</p>
<p>int i=123456;<br>string s=i.ToString("###,###.00");</p>
<p>18.日期格式化</p>
<p>【aspx页面内：&lt;%# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date")%&gt;<br>显示为： 2004-8-11 19:44:28<br>我只想要：2004-8-11 】</p>
<p>&lt;%# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date","{0:yyyy-M-d}")%&gt;</p>
<p>应该如何改？</p>
<p><br>【格式化日期】<br>取出来,一般是object<br>((DateTime)objectFromDB).ToString("yyyy-MM-dd");</p>
<p><br>【日期的验证表达式】<br>A.以下正确的输入格式： [2004-2-29], [2004-02-29 10:29:39 pm], [2004/12/31] </p>
<p>^((\d{2}(([02468][048])|([13579][26]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|([1-2][0-9])))))|(\d{2}(([02468][1235679])|([13579][01345789]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\s(((0?[1-9])|(1[0-2]))\:([0-5][0-9])((\s)|(\:([0-5][0-9])\s))([AM|PM|am|pm]{2,2})))?$</p>
<p>B.以下正确的输入格式：[0001-12-31], [9999 09 30], [2002/03/03] </p>
<p>^\d{4}[\-\/\s]?((((0[13578])|(1[02]))[\-\/\s]?(([0-2][0-9])|(3[01])))|(((0[469])|(11))[\-\/\s]?(([0-2][0-9])|(30)))|(02[\-\/\s]?[0-2][0-9]))$ </p>
<p><br>【大小写转换】</p>
<p>HttpUtility.HtmlEncode(string);<br>HttpUtility.HtmlDecode(string)</p>
<p>19.如何设定全局变量<br>Global.asax中</p>
<p>Application_Start()事件中</p>
<p>添加Application[属性名] ＝ xxx;</p>
<p>就是你的全局变量</p>
<p>20.怎样作到HyperLinkColumn生成的连接后，点击连接，打开新窗口？</p>
<p>HyperLinkColumn有个属性Target,将器值设置成"_blank"即可.(Target="_blank")</p>
<p>【ASPNETMENU】点击菜单项弹出新窗口<br>在你的menuData.xml文件的菜单项中加入URLTarget="_blank"<br>如：<br>&lt;?xml version="1.0" encoding="GB2312"?&gt;<br>&lt;MenuData ImagesBaseURL="images/"&gt; <br>&lt;MenuGroup&gt;<br>&lt;MenuItem Label="内参信息" URL="Infomation.aspx" &gt;<br>&lt;MenuGroup ID="BBC"&gt;<br>&lt;MenuItem Label="公告信息" URL="Infomation.aspx" URLTarget="_blank" LeftIcon="file.gif"/&gt;<br>&lt;MenuItem Label="编制信息简报" URL="NewInfo.aspx" LeftIcon="file.gif" /&gt;<br>......<br>最好将你的aspnetmenu升级到1.2版</p>
<p>21.委托讨论<br><a href="http://community.csdn.net/Expert/topic/2651/2651579.xml?temp=.7183191"><font color=#002c99>http://community.csdn.net/Expert/topic/2651/2651579.xml?temp=.7183191</font></a><br><a href="http://dev.csdn.net/develop/article/22/22951.shtm"><font color=#002c99>http://dev.csdn.net/develop/article/22/22951.shtm</font></a></p>
<p>22.读取DataGrid控件TextBox值</p>
<p>foreach(DataGrid dgi in yourDataGrid.Items)<br>{<br>TextBox tb = (TextBox)dgi.FindControl("yourTextBoxId");<br>tb.Text....<br>}</p>
<p>23.在DataGrid中有3个模板列包含Textbox分别为 DG_ShuLiang (数量) DG_DanJian(单价) DG_JinE(金额)分别在5.6.7列，要求在录入数量及单价的时候自动算出金额即:数量*单价=金额还要求录入时限制为 数值型.我如何用客户端脚本实现这个功能?</p>
<p>〖思归〗<br>&lt;asp:TemplateColumn HeaderText="数量"&gt; <br>&lt;ItemTemplate&gt;<br>&lt;asp:TextBox id="ShuLiang" runat='server' Text='&lt;%# DataBinder.Eval(Container.DataItem,"DG_ShuLiang")%&gt;' <br><em>onkey</em>up="javascript：DoCal()"<br>/&gt;</p>
<p>&lt;asp:RegularExpressionValidator id="revS" runat="server" ControlToValidate="ShuLiang" ErrorMessage="must be integer" ValidationExpression="^\d+$" /&gt;<br>&lt;/ItemTemplate&gt;<br>&lt;/asp:TemplateColumn&gt;</p>
<p>&lt;asp:TemplateColumn HeaderText="单价"&gt; <br>&lt;ItemTemplate&gt;<br>&lt;asp:TextBox id="DanJian" runat='server' Text='&lt;%# DataBinder.Eval(Container.DataItem,"DG_DanJian")%&gt;' <br><em>onkey</em>up="javascript：DoCal()"<br>/&gt;</p>
<p>&lt;asp:RegularExpressionValidator id="revS2" runat="server" ControlToValidate="DanJian" ErrorMessage="must be numeric" ValidationExpression="^\d+(\.\d*)?$" /&gt;</p>
<p>&lt;/ItemTemplate&gt;<br>&lt;/asp:TemplateColumn&gt;</p>
<p>&lt;asp:TemplateColumn HeaderText="金额"&gt; <br>&lt;ItemTemplate&gt;<br>&lt;asp:TextBox id="JinE" runat='server' Text='&lt;%# DataBinder.Eval(Container.DataItem,"DG_JinE")%&gt;' /&gt;<br>&lt;/ItemTemplate&gt;<br>&lt;/asp:TemplateColumn&gt;</p>
<p>&lt;script language="javascript"&gt;<br>function DoCal()<br>{<br>var e = event.srcElement;<br>var row = e.parentNode.parentNode;<br>var txts = row.all.tags("INPUT");<br>if (!txts.length || txts.length &lt; 3)<br>return;<br><br>var q = txts[txts.length-3].value;<br>var p = txts[txts.length-2].value;</p>
<p>if (isNaN(q) || isNaN(p))<br>return;</p>
<p>q = parseInt(q);<br>p = parseFloat(p);</p>
<p>txts[txts.length-1].value = (q * p).toFixed(2);<br>}<br>&lt;/script&gt;</p>
<p><br>24.datagrid选定比较底下的行时，为什么总是刷新一下，然后就滚动到了最上面，刚才选定的行因屏幕的关系就看不到了<br>page_load <br>page.smartNavigation=true</p>
<p>25.在Datagrid中修改数据，当点击编辑键时，数据出现在文本框中，怎么控制文本框的大小 ? </p>
<p>private void DataGrid1_ItemDataBound(obj sender,DataGridItemEventArgs e)<br>{<br>for(int i=0;i&lt;e.Item.Cells.Count-1;i++)<br>if(e.Item.ItemType==ListItemType.EditType)<br>{<br>e.Item.Cells[i].Attributes.Add("Width", "80px")</p>
<p>} <br>}</p>
<p><br>26.对话框<br>private static string ScriptBegin = "&lt;script language=\"JavaScript\"&gt;";<br>private static string ScriptEnd = "&lt;/script&gt;";</p>
<p>public static void ConfirmMessageBox(string PageTarget,string Content)<br>{</p>
<p>string ConfirmContent="var retValue=window.confirm('"+Content+"');"+"if(retValue){window.location='"+PageTarget+"';}";<br><br>ConfirmContent=ScriptBegin + ConfirmContent + ScriptEnd;<br><br>Page ParameterPage = (Page)System.Web.HttpContext.Current.Handler;<br>ParameterPage.RegisterStartupScript("confirm",ConfirmContent);<br>//Response.Write(strScript);<br><br>}</p>
<p>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</p>
<p>27. 将时间格式化：string aa=DateTime.Now.ToString("yyyy年MM月dd日"); </p>
<p>1.1 取当前年月日时分秒 <br>currentTime=System.DateTime.Now; </p>
<p>1.2 取当前年 <br>int 年= DateTime.Now.Year; </p>
<p>1.3 取当前月 <br>int 月= DateTime.Now.Month; </p>
<p>1.4 取当前日 <br>int 日= DateTime.Now.Day; </p>
<p>1.5 取当前时 <br>int 时= DateTime.Now.Hour; </p>
<p>1.6 取当前分 <br>int 分= DateTime.Now.Minute; </p>
<p>1.7 取当前秒 <br>int 秒= DateTime.Now.Second; </p>
<p>1.8 取当前毫秒 <br>int 毫秒= DateTime.Now.Millisecond; </p>
<p>28．自定义分页代码：</p>
<p>先定义变量 ：public static int pageCount; //总页面数 </p>
<p>public static int curPageIndex=1; //当前页面 </p>
<p>下一页： </p>
<p>if(DataGrid1.CurrentPageIndex &lt; (DataGrid1.PageCount - 1)) </p>
<p>{ </p>
<p>DataGrid1.CurrentPageIndex += 1; </p>
<p>curPageIndex+=1; </p>
<p>} </p>
<p>bind(); // DataGrid1数据绑定函数 </p>
<p>上一页： </p>
<p>if(DataGrid1.CurrentPageIndex &gt;0) </p>
<p>{ </p>
<p>DataGrid1.CurrentPageIndex += 1; </p>
<p>curPageIndex-=1; </p>
<p>} </p>
<p>bind(); // DataGrid1数据绑定函数 </p>
<p>直接页面跳转： </p>
<p>int a=int.Parse(JumpPage.Value.Trim());//JumpPage.Value.Trim()为跳转值 </p>
<p>if(a&lt;DataGrid1.PageCount) </p>
<p>{ </p>
<p>this.DataGrid1.CurrentPageIndex=a; </p>
<p>} </p>
<p>bind(); </p>
<p>29．DataGrid使用： </p>
<p>3．1添加删除确认： </p>
<p>private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) </p>
<p>{ </p>
<p>foreach(DataGridItem di in this.DataGrid1.Items) </p>
<p>{ </p>
<p>if(di.ItemType==ListItemType.Item||di.ItemType==ListItemType.AlternatingItem) </p>
<p>{ </p>
<p>((LinkButton)di.Cells[8].Controls[0]).Attributes.Add("<em>onclick</em>","return confirm('确认删除此项吗?');"); </p>
<p>} </p>
<p>} </p>
<p>} </p>
<p>3．2样式交替： </p>
<p>ListItemType itemType = e.Item.ItemType; </p>
<p>if (itemType == ListItemType.Item ) </p>
<p>{ </p>
<p>e.Item.Attributes["<em>onmouse</em>out"] = "javascript：this.style.backgroundColor='#FFFFFF';"; </p>
<p>e.Item.Attributes["<em>onmouse</em>over"] = "javascript：this.style.backgroundColor='#d9ece1';cursor='hand';" ; </p>
<p>} </p>
<p>else if( itemType == ListItemType.AlternatingItem) </p>
<p>{ </p>
<p>e.Item.Attributes["<em>onmouse</em>out"] = "javascript：this.style.backgroundColor='#a0d7c4';"; </p>
<p>e.Item.Attributes["<em>onmouse</em>over"] = "javascript：this.style.backgroundColor='#d9ece1';cursor='hand';" ; </p>
<p>} </p>
<p>3．3添加一个编号列： </p>
<p>DataTable dt= c.ExecuteRtnTableForAccess(sqltxt); //执行sql返回的DataTable </p>
<p>DataColumn dc=dt.Columns.Add("number",System.Type.GetType("System.String")); </p>
<p>for(int i=0;i&lt;dt.Rows.Count;i++) </p>
<p>{ </p>
<p>dt.Rows[i]["number"]=(i+1).ToString(); </p>
<p>} </p>
<p>DataGrid1.DataSource=dt; </p>
<p>DataGrid1.DataBind(); </p>
<p>3．4 DataGrid1中添加一个CheckBox，页面中添加一个全选框 </p>
<p>private void CheckBox2_CheckedChanged(object sender, System.EventArgs e) </p>
<p>{ </p>
<p>foreach(DataGridItem thisitem in DataGrid1.Items) </p>
<p>{ </p>
<p>((CheckBox)thisitem.Cells[0].Controls[1]).Checked=CheckBox2.Checked; </p>
<p>} </p>
<p>} </p>
<p>将当前页面中DataGrid1显示的数据全部删除 </p>
<p>foreach(DataGridItem thisitem in DataGrid1.Items) </p>
<p>{ </p>
<p>if(((CheckBox)thisitem.Cells[0].Controls[1]).Checked) </p>
<p>{ </p>
<p>string strloginid= DataGrid1.DataKeys[thisitem.ItemIndex].ToString(); </p>
<p>Del (strloginid); //删除函数 </p>
<p>} </p>
<p>} </p>
<p>30．当文件在不同目录下，需要获取数据库连接字符串（如果连接字符串放在Web.config，然后在Global.asax中初始化） </p>
<p>在Application_Start中添加以下代码： </p>
<p>Application["ConnStr"]=this.Context.Request.PhysicalApplicationPath+ConfigurationSettings.AppSettings["ConnStr"].ToString(); </p>
<p>31． 变量.ToString() <br>字符型转换 转为字符串 <br>12345.ToString("n"); //生成 12,345.00 <br>12345.ToString("C"); //生成 ￥12,345.00 <br>12345.ToString("e"); //生成 1.234500e+004 <br>12345.ToString("f4"); //生成 12345.0000 <br>12345.ToString("x"); //生成 3039 (16进制) <br>12345.ToString("p"); //生成 1,234,500.00% </p>
<p>32、变量.Substring(参数1,参数2); <br>截取字串的一部分，参数1为左起始位数，参数2为截取几位。 <br>如：string s1 = str.Substring(0,2); </p>
<p><br>34.在自己的网站上登陆其他网站：(如果你的页面是通过嵌套方式的话，因为一个页面只能有一个FORM，这时可以导向另外一个页面再提交登陆信息) </p>
<p><br>＜SCRIPT language="javascript"＞ <br>＜!-- <br>　function gook(pws) <br>　{ <br>　　frm.submit(); <br>　} <br>//--＞ </p>
<p>＜/SCRIPT＞ ＜body leftMargin="0" topMargin="0" onload="javascript：gook()" marginwidth="0" marginheight="0"＞ <br>＜form name="frm" action=" <a href="http://220.194.55.68:6080/login.php?retid=7259"><font color=#002c99>http://220.194.55.68:6080/login.php?retid=7259</font></a> " method="post"＞ <br>＜tr＞ <br>＜td＞<br>＜input id="f_user" type="hidden" size="1" name="f_user" runat="server"＞<br>＜input id="f_domain" type="hidden" size="1" name="f_domain" runat="server"＞<br>＜input class="box" id="f_pass" type="hidden" size="1" name="pwshow" runat="server"＞ </p>
<p>＜INPUT id="lng" type="hidden" maxLength="20" size="1" value="5" name="lng"＞<br>＜INPUT id="tem" type="hidden" size="1" value="2" name="tem"＞ </p>
<p>＜/td＞ </p>
<p>＜/tr＞ </p>
<p>＜/form＞ </p>
<p>文本框的名称必须是你要登陆的网页上的名称，如果源码不行可以用vsniffer 看看。 <br>　　下面是获取用户输入的登陆信息的代码： </p>
<p><br>string name; <br>name=Request.QueryString["EmailName"]; </p>
<p>try <br>{ <br>　int a=name.IndexOf("@",0,name.Length); <br>　f_user.Value=name.Substring(0,a); <br>　f_domain.Value=name.Substring(a+1,name.Length-(a+1)); <br>　f_pass.Value=Request.QueryString["Psw"]; <br>} </p>
<p>catch <br>{ <br>　Script.Alert("错误的邮箱!"); <br>　Server.Transfer("index.aspx"); <br>}</p>
<p>35.警告窗口 </p>
<p>/**//// &lt;summary&gt; <br>/// 服务器端弹出alert对话框 <br>/// &lt;/summary&gt; <br>/// &lt;param name="str_Message"&gt;提示信息,例子："不能为空!"&lt;/param&gt; <br>/// &lt;param name="page"&gt;Page类&lt;/param&gt; <br>public void Alert(string str_Message,Page page) <br>{ <br>page.RegisterStartupScript("","&lt;script&gt;alert('"+str_Message+"');&lt;/script&gt;"); <br>} </p>
<p>36.重载此警告窗口,使某控件获得焦点</p>
<p><br>/**//// &lt;summary&gt; <br>/// 服务器端弹出alert对话框，并使控件获得焦点 <br>/// &lt;/summary&gt; <br>/// &lt;param name="str_Ctl_Name"&gt;获得焦点控件Id值,比如：txt_Name&lt;/param&gt; <br>/// &lt;param name="str_Message"&gt;提示信息,例子："请输入您姓名!"&lt;/param&gt; <br>/// &lt;param name="page"&gt;Page类&lt;/param&gt; <br>public void Alert(string str_Ctl_Name,string str_Message,Page page) <br>{ <br>page.RegisterStartupScript("","&lt;script&gt;alert('"+str_Message+"');document.forms(0)."+str_Ctl_Name+".focus(); document.forms(0)."+str_Ctl_Name+".select();&lt;/script&gt;"); <br>} </p>
<p>37.确认对话框 </p>
<p><br>/**//// &lt;summary&gt; <br>/// 服务器端弹出confirm对话框 <br>/// &lt;/summary&gt; <br>/// &lt;param name="str_Message"&gt;提示信息,例子："您是否确认删除!"&lt;/param&gt; <br>/// &lt;param name="btn"&gt;隐藏Botton按钮Id值,比如：btn_Flow&lt;/param&gt; <br>/// &lt;param name="page"&gt;Page类&lt;/param&gt; <br>public void Confirm(string str_Message,string btn,Page page) <br>{ <br>page.RegisterStartupScript("","&lt;script&gt; if (confirm('"+str_Message+"')==true){document.forms(0)."+btn+".click();}&lt;/script&gt;"); <br>} </p>
<p>38.重载确认对话框，点击确定触发一个隐藏按钮事件，点击取消触发一个隐藏按钮事件</p>
<p><br>/**//// &lt;summary&gt; <br>/// 服务器端弹出confirm对话框,询问用户准备转向那些操作，包括&#8220;确定&#8221;和&#8220;取消&#8221;时的操作 <br>/// &lt;/summary&gt; <br>/// &lt;param name="str_Message"&gt;提示信息，比如："成功增加数据,单击\"确定\"按钮填写流程,单击\"取消\"修改数据"&lt;/param&gt; <br>/// &lt;param name="btn_Redirect_Flow"&gt;"确定"按钮id值&lt;/param&gt; <br>/// &lt;param name="btn_Redirect_Self"&gt;"取消"按钮id值&lt;/param&gt; <br>/// &lt;param name="page"&gt;Page类&lt;/param&gt; <br>public void Confirm(string str_Message,string btn_Redirect_Flow,string btn_Redirect_Self,Page page) <br>{ <br>page.RegisterStartupScript("","&lt;script&gt; if (confirm('"+str_Message+"')==true){document.forms(0)."+btn_Redirect_Flow+".click();}else{document.forms(0)."+btn_Redirect_Self+".click();}&lt;/script&gt;"); <br>} </p>
<p>39.获得焦点 </p>
<p><br>/**//// &lt;summary&gt; <br>/// 使控件获得焦点 <br>/// &lt;/summary&gt; <br>/// &lt;param name="str_Ctl_Name"&gt;获得焦点控件Id值,比如：txt_Name&lt;/param&gt; <br>/// &lt;param name="page"&gt;Page类&lt;/param&gt; <br>public void GetFocus(string str_Ctl_Name,Page page) <br>{ <br>page.RegisterStartupScript("","&lt;script&gt;document.forms(0)."+str_Ctl_Name+".focus(); document.forms(0)."+str_Ctl_Name+".select();&lt;/script&gt;"); <br>} </p>
<p>40.子窗体返回主窗体</p>
<p><br>/**////&lt;summary&gt; <br>///名称：redirect <br>///功能：子窗体返回主窗体 <br>///参数：url <br>///返回值：空 <br>///&lt;/summary&gt; <br>public void redirect(string url,Page page) <br>{ <br>if ( Session["IfDefault"]!=(object)"Default") <br>{ <br>page.RegisterStartupScript("","&lt;script&gt;window.top.document.location.href='"+url+"';&lt;/script&gt;"); <br>} <br>} </p>
<p><br>41.判断是否为数字 </p>
<p><br>/**//// &lt;summary&gt; <br>/// 名称：IsNumberic <br>/// 功能：判断输入的是否是数字 <br>/// 参数：string oText：源文本 <br>/// 返回值：　bool true:是　false:否 <br>/// &lt;/summary&gt; <br><br>public bool IsNumberic(string oText) <br>{ <br>try <br>{ <br>int var1=Convert.ToInt32 (oText); <br>return true; <br>} <br>catch <br>{ <br>return false; <br>} <br>} </p>
<p>获得字符串实际长度（包括中文字符） </p>
<p>//获得字符串oString的实际长度 <br>public int StringLength(string oString) <br>{ <br>byte[] strArray=System.Text .Encoding.Default .GetBytes (oString); <br>int res=strArray.Length ; <br>return res; <br>} </p>
<p>42.将回车转换为TAB </p>
<p><br>//当在有keydown事件的控件上敲回车时，变为tab <br>public void Tab(System.Web .UI.WebControls .WebControl webcontrol) <br>{ <br>webcontrol.Attributes .Add ("<em>onkey</em>down", "if(event.keyCode==13) event.keyCode=9"); <br>} </p>
<p>43.datagrid分页中如果删除时出现超出索引 </p>
<p><br>public void jumppage(System.Web.UI.WebControls.DataGrid dg) <br>{ <br>int int_PageLess; //定义页面跳转的页数 <br>//如果当前页是最后一页 <br>if(dg.CurrentPageIndex == dg.PageCount-1) <br>{ <br>//如果就只有一页 <br>if(dg.CurrentPageIndex == 0) <br>{ <br>//删除后页面停在当前页 <br>dg.CurrentPageIndex = dg.PageCount-1; <br>} <br>else <br>{ <br>//如果最后一页只有一条记录 <br>if((dg.Items.Count % dg.PageSize == 1) || dg.PageSize == 1) <br>{ <br>//把最后一页最后一条记录删除后，页面应跳转到前一页 <br>int_PageLess = 2; <br>} <br>else //如果最后一页的记录数大于1，那么在最后一页删除记录后仍然停在当前页 <br>{ <br>int_PageLess = 1; <br>} <br>dg.CurrentPageIndex = dg.PageCount - int_PageLess; <br>} <br>} <br>} <br><br><br>--------------------------<br></p>
<div class=postTitle><a id=AjaxHolder_ctl01_TitleUrl href="http://www.cnblogs.com/skylaugh/archive/2007/09/04/881801.html"><font color=#000080>asp.net c#中对cookie的操作</font></a> </div>
<div class=postText>
<p>// 写cookie<br>HttpCookie cookie = new HttpCookie("Info");//定义cookie对象以及名为Info的项<br>DateTime dt = DateTime.Now;//定义时间对象<br>TimeSpan ts=new TimeSpan(1,0,0,0);//cookie有效作用时间，具体查msdn<br>cookie.EXPires = dt.Add(ts);//添加作用时间<br>cookie.Values.Add("user","cxbkkk");//增加属性<br>cookie.Values.Add("userid","1203");<br>Response.AppendCookie(cookie);//确定写入cookie中&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 读取cookie<br>if(Request.Cookies["Info"]!=null)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; string temp=Convert.ToString(Request.Cookies["Info"].Values["user"])+"&nbsp; "+Convert.ToString(Request.Cookies["Info"].Values["userid"]);<br>&nbsp;&nbsp;&nbsp; //读全部就用Request.Cookies["Info"].Value)<br>&nbsp;&nbsp;&nbsp;&nbsp; if(temp=="")<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write("空");<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(temp);<br>}<br>else<br>{<br>&nbsp;&nbsp;&nbsp; Response.Write("error");<br>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 修改cookie<br>Response.Cookies["Info"]["user"] = "2";<br>Response.Cookies["Info"].Expires = DateTime.Now.AddDays(1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>// 删除cookie下的属性<br>HttpCookie acookie=Request.Cookies["Info"];<br>acookie.Values.Remove("userid");<br>acookie.Expires = DateTime.Now.AddDays(1);<br>Response.Cookies.Add(acookie);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 删除所有cookie，就是设置过期时间为现在就行了<br>int limit=Request.Cookies.Count - 1;<br>for(int i=0;i&lt;limit;i++)<br>{<br>&nbsp;&nbsp; acookie = Request.Cookies(i)<br>&nbsp;&nbsp; acookie.Expires = DateTime.Now.AddDays(-1)<br>&nbsp;&nbsp; Response.Cookies.Add(acookie)<br>} </p>
<p><br>// 读取所有 cookies<br>HttpCookieCollection cookies;<br>HttpCookie oneCookie;<br>cookies = Request.Cookies;</p>
<p>string[] cookieArray = cookies.AllKeys;<br>for (int i=0; i &lt; cookieArray.Length; i++) <br>{<br>&nbsp;oneCookie = cookies[cookieArray[i]];<br>&nbsp;Response.Write(oneCookie.Name + " - " + oneCookie.Value);<br>} </p>
<p>// 添加单个cookies<br>if (Request.Browser.Cookies == true)<br>{<br>&nbsp;if (Request.Cookies["LastVisited1"] == null)<br>&nbsp;{<br>&nbsp;&nbsp;HttpCookie newCookie = new HttpCookie("LastVisited1",DateTime.Now.ToString());<br>&nbsp;&nbsp;newCookie.Expires = DateTime.Now.AddYears(1);<br>&nbsp;&nbsp;Response.Cookies.Add(newCookie);<br>&nbsp;} <br>&nbsp;else <br>&nbsp;{<br>&nbsp;&nbsp;Response.Write(Request.Cookies["LastVisited1"].Value);<br>&nbsp;}&nbsp; <br>}</p>
</div>
<img src ="http://www.cnitblog.com/hj627/aggbug/37631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hj627/" target="_blank">白开心</a> 2007-12-12 15:56 <a href="http://www.cnitblog.com/hj627/articles/37631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>讲故事谈.NET委托:一个C#睡前故事 </title><link>http://www.cnitblog.com/hj627/articles/20974.html</link><dc:creator>白开心</dc:creator><author>白开心</author><pubDate>Fri, 22 Dec 2006 06:41:00 GMT</pubDate><guid>http://www.cnitblog.com/hj627/articles/20974.html</guid><wfw:comment>http://www.cnitblog.com/hj627/comments/20974.html</wfw:comment><comments>http://www.cnitblog.com/hj627/articles/20974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hj627/comments/commentRss/20974.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hj627/services/trackbacks/20974.html</trackback:ping><description><![CDATA[
		<p>从前，在南方一块奇异的土地上，有个工人名叫彼得，他非常勤奋，对他的老板总是百依百顺。但是他的老板是个吝啬的人，从不信任别人，坚决要求随时知道彼得的工作进度，以防止他偷懒。但是彼得又不想让老板呆在他的办公室里站在背后盯着他，于是就对老板做出承诺：无论何时，只要我的工作取得了一点进展我都会及时让你知道。彼得通过周期性地使用“带类型的引用”(原文为：“typed reference” 也就是delegate？？)“回调”他的老板来实现他的承诺，如下：</p>
		<p>class Worker {<br />    public void Advise(Boss boss) { _boss = boss; }<br />    public void DoWork() {<br />        Console.WriteLine(“工作: 工作开始”);<br />        if( _boss != null ) _boss.WorkStarted();</p>
		<p>        Console.WriteLine(“工作: 工作进行中”);<br />        if( _boss != null ) _boss.WorkProgressing();</p>
		<p>        Console.WriteLine("“工作: 工作完成”");<br />        if( _boss != null ) {<br />            int grade = _boss.WorkCompleted();<br />            Console.WriteLine(“工人的工作得分＝” + grade);<br />    }<br />}<br />private Boss _boss;<br />}</p>
		<p>class Boss {<br />    public void WorkStarted() { /* 老板不关心。 */ }<br />    public void WorkProgressing() { /*老板不关心。 */ }<br />    public int WorkCompleted() {<br />        Console.WriteLine(“时间差不多！”);<br />        return 2; /* 总分为10 */<br />    }<br />}</p>
		<p>class Universe {<br />    static void Main() {<br />        Worker peter = new Worker();<br />        Boss boss = new Boss();<br />        peter.Advise(boss);<br />        peter.DoWork();</p>
		<p>        Console.WriteLine(“Main: 工人工作完成”);<br />        Console.ReadLine();<br />    }<br />}</p>
		<p>接口<br />现在，彼得成了一个特殊的人，他不但能容忍吝啬的老板，而且和他周围的宇宙也有了密切的联系，以至于他认为宇宙对他的工作进度也感兴趣。不幸的是，他必须也给宇宙添加一个特殊的回调函数Advise来实现同时向他老板和宇宙报告工作进度。彼得想要把潜在的通知的列表和这些通知的实现方法分离开来，于是他决定把方法分离为一个接口：</p>
		<p>interface IWorkerEvents {<br />    void WorkStarted();<br />    void WorkProgressing();<br />    int WorkCompleted();<br />}</p>
		<p>class Worker {<br />    public void Advise(IWorkerEvents events) { _events = events; }<br />    public void DoWork() {<br />        Console.WriteLine(“工作: 工作开始”);<br />        if( _events != null ) _events.WorkStarted();</p>
		<p>        Console.WriteLine(“工作: 工作进行中”);<br />        if(_events != null ) _events.WorkProgressing();</p>
		<p>        Console.WriteLine("“工作: 工作完成”");<br />        if(_events != null ) {<br />            int grade = _events.WorkCompleted();</p>
		<p>            Console.WriteLine(“工人的工作得分＝” + grade);<br />            }<br />    }<br />    private IWorkerEvents _events;<br />}</p>
		<p>class Boss : IWorkerEvents {<br />    public void WorkStarted() { /* 老板不关心。 */ }<br />    public void WorkProgressing() { /* 老板不关心。 */ }<br />    public int WorkCompleted() {<br />        Console.WriteLine(“时间差不多！”);<br />        return 3; /* 总分为10 */<br />    }<br />}</p>
		<p>委托<br />不幸的是，每当彼得忙于通过接口的实现和老板交流时，就没有机会及时通知宇宙了。至少他应该忽略身在远方的老板的引用，好让其他实现了IWorkerEvents的对象得到他的工作报告。（”At least he'd abstracted the reference of his boss far away from him so that others who implemented the IWorkerEvents interface could be notified of his work progress” 原话如此，不理解到底是什么意思 ）</p>
		<p>他的老板还是抱怨得很厉害。“彼得！”他老板吼道，“你为什么在工作一开始和工作进行中都来烦我？！我不关心这些事件。你不但强迫我实现了这些方法，而且还在浪费我宝贵的工作时间来处理你的事件，特别是当我外出的时候更是如此！你能不能不再来烦我？”</p>
		<p>于是，彼得意识到接口虽然在很多情况都很有用，但是当用作事件时，“粒度”不够好。他希望能够仅在别人想要时才通知他们，于是他决定把接口的方法分离为单独的委托，每个委托都像一个小的接口方法：</p>
		<p>delegate void WorkStarted();<br />delegate void WorkProgressing();<br />delegate int WorkCompleted();</p>
		<p>class Worker {<br />    public void DoWork() {<br />        Console.WriteLine(“工作: 工作开始”);<br />        if( started != null ) started();</p>
		<p>        Console.WriteLine(“工作: 工作进行中”);<br />        if( progressing != null ) progressing();</p>
		<p>        Console.WriteLine("“工作: 工作完成”");<br />        if( completed != null ) {<br />            int grade = completed();<br />            Console.WriteLine(“工人的工作得分＝” + grade);<br />        }<br />    }<br />    public WorkStarted started;<br />    public WorkProgressing progressing;<br />    public WorkCompleted completed;<br />}</p>
		<p>class Boss {<br />    public int WorkCompleted() {<br />    Console.WriteLine("Better...");<br />    return 4; /* 总分为10 */<br />}<br />}</p>
		<p>class Universe {<br />    static void Main() {<br />        Worker peter = new Worker();<br />        Boss boss = new Boss();<br />        peter.completed = new WorkCompleted(boss.WorkCompleted);<br />        peter.DoWork();</p>
		<p>        Console.WriteLine(“Main: 工人工作完成”);<br />        Console.ReadLine();<br />    }<br />}<br />静态监听者<br />这样，彼得不会再拿他老板不想要的事件来烦他老板了，但是他还没有把宇宙放到他的监听者列表中。因为宇宙是个包涵一切的实体，看来不适合使用实例方法的委托（想像一下，实例化一个“宇宙”要花费多少资源…..），于是彼得就需要能够对静态委托进行挂钩，委托对这一点支持得很好：</p>
		<p>class Universe {<br />    static void WorkerStartedWork() {<br />        Console.WriteLine("Universe notices worker starting work");<br />    }</p>
		<p>    static int WorkerCompletedWork() {<br />        Console.WriteLine("Universe pleased with worker's work");<br />        return 7;<br />    }</p>
		<p>    static void Main() {<br />        Worker peter = new Worker();<br />        Boss boss = new Boss();<br />        peter.completed = new WorkCompleted(boss.WorkCompleted);<br />        peter.started = new WorkStarted(Universe.WorkerStartedWork);<br />        peter.completed = new WorkCompleted(Universe.WorkerCompletedWork);<br />        peter.DoWork();</p>
		<p>        Console.WriteLine(“Main: 工人工作完成”);<br />        Console.ReadLine();<br />    }<br />}</p>
		<p>事件<br />不幸的是，宇宙太忙了，也不习惯时刻关注它里面的个体，它可以用自己的委托替换了彼得老板的委托。这是把彼得的Worker类的的委托字段做成public的一个无意识的副作用。同样，如果彼得的老板不耐烦了，也可以决定自己来激发彼得的委托（真是一个粗鲁的老板）：</p>
		<p>// Peter's boss taking matters into his own hands<br />if( peter.completed != null ) peter.completed();</p>
		<p>彼得不想让这些事发生，他意识到需要给每个委托提供“注册”和“反注册”功能，这样监听者就可以自己添加和移除委托，但同时又不能清空整个列表也不能随意激发彼得的事件了。彼得并没有来自己实现这些功能，相反，他使用了event关键字让C#编译器为他构建这些方法：</p>
		<p>class Worker {<br />...<br />    public event WorkStarted started;<br />    public event WorkProgressing progressing;<br />    public event WorkCompleted completed;<br />}</p>
		<p>彼得知道event关键字在委托的外边包装了一个property，仅让C#客户通过+= 和 -=操作符来添加和移除，强迫他的老板和宇宙正确地使用事件。</p>
		<p>static void Main() {<br />    Worker peter = new Worker();<br />    Boss boss = new Boss();<br />    peter.completed += new WorkCompleted(boss.WorkCompleted);<br />    peter.started += new WorkStarted(Universe.WorkerStartedWork);<br />    peter.completed += new WorkCompleted(Universe.WorkerCompletedWork);<br />    peter.DoWork();</p>
		<p>    Console.WriteLine(“Main: 工人工作完成”);<br />    Console.ReadLine();<br />}</p>
		<p>“收获”所有结果<br />到这时，彼得终于可以送一口气了，他成功地满足了所有监听者的需求，同时避免了与特定实现的紧耦合。但是他注意到他的老板和宇宙都为它的工作打了分，但是他仅仅接收了一个分数。面对多个监听者，他想要“收获”所有的结果，于是他深入到代理里面，轮询监听者列表，手工一个个调用：</p>
		<p>public void DoWork() {<br />    ...<br />    Console.WriteLine("“工作: 工作完成”");<br />    if( completed != null ) {<br />        foreach( WorkCompleted wc in completed.GetInvocationList() ) {<br />            int grade = wc();<br />            Console.WriteLine(“工人的工作得分＝” + grade);<br />        }<br />    }<br />}</p>
		<p>异步通知：激发 &amp; 忘掉<br />同时，他的老板和宇宙还要忙于处理其他事情，也就是说他们给彼得打分所花费的事件变得非常长：</p>
		<p>class Boss {<br />    public int WorkCompleted() {<br />        System.Threading.Thread.Sleep(3000);<br />        Console.WriteLine("Better..."); return 6; /* 总分为10 */<br />    }<br />}</p>
		<p>class Universe {<br />    static int WorkerCompletedWork() {<br />        System.Threading.Thread.Sleep(4000);<br />        Console.WriteLine("Universe is pleased with worker's work");<br />        return 7;<br />    }<br />    ...<br />}</p>
		<p>很不幸，彼得每次通知一个监听者后必须等待它给自己打分，现在这些通知花费了他太多的工作事件。于是他决定忘掉分数，仅仅异步激发事件：</p>
		<p>public void DoWork() {<br />    ...<br />    Console.WriteLine("“工作: 工作完成”");<br />    if( completed != null ) {<br />        foreach( WorkCompleted wc in completed.GetInvocationList() )<br />        {<br />            wc.BeginInvoke(null, null);<br />        }<br />    }<br />}</p>
		<p>异步通知：轮询<br />这使得彼得可以通知他的监听者，然后立即返回工作，让进程的线程池来调用这些代理。随着时间的过去，彼得发现他丢失了他工作的反馈，他知道听取别人的赞扬和努力工作一样重要，于是他异步激发事件，但是周期性地轮询，取得可用的分数。</p>
		<p>public void DoWork() {<br />    ...<br />    Console.WriteLine("“工作: 工作完成”");<br />    if( completed != null ) {<br />        foreach( WorkCompleted wc in completed.GetInvocationList() ) {<br />            IAsyncResult res = wc.BeginInvoke(null, null);<br />            while( !res.IsCompleted ) System.Threading.Thread.Sleep(1);<br />            int grade = wc.EndInvoke(res);<br />            Console.WriteLine(“工人的工作得分＝” + grade);<br />        }<br />    }<br />}</p>
		<p>异步通知：委托<br />不幸地，彼得有回到了一开始就想避免的情况中来，比如，老板站在背后盯着他工作。于是，他决定使用自己的委托作为他调用的异步委托完成的通知，让他自己立即回到工作，但是仍可以在别人给他的工作打分后得到通知：</p>
		<p>    public void DoWork() {<br />        ...<br />        Console.WriteLine("“工作: 工作完成”");<br />        if( completed != null ) {<br />            foreach( WorkCompleted wc in completed.GetInvocationList() ) {<br />                wc.BeginInvoke(new AsyncCallback(WorkGraded), wc);<br />            }<br />        }<br />    }</p>
		<p>    private void WorkGraded(IAsyncResult res) {<br />        WorkCompleted wc = (WorkCompleted)res.AsyncState;<br />        int grade = wc.EndInvoke(res);<br />        Console.WriteLine(“工人的工作得分＝” + grade);<br />    }</p>
		<p>宇宙中的幸福<br />彼得、他的老板和宇宙最终都满足了。彼得的老板和宇宙可以收到他们感兴趣的事件通知，减少了实现的负担和非必需的往返“差旅费”。彼得可以通知他们，而不管他们要花多长时间来从目的方法中返回，同时又可以异步地得到他的结果。彼得知道，这并不*十分*简单，因为当他异步激发事件时，方法要在另外一个线程中执行，彼得的目的方法完成的通知也是一样的道理。但是，迈克和彼得是好朋友，他很熟悉线程的事情，可以在这个领域提供指导。</p>
		<p>他们永远幸福地生活下去……&lt;完&gt;</p>
<img src ="http://www.cnitblog.com/hj627/aggbug/20974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hj627/" target="_blank">白开心</a> 2006-12-22 14:41 <a href="http://www.cnitblog.com/hj627/articles/20974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>小写金额转换成大写</title><link>http://www.cnitblog.com/hj627/articles/6138.html</link><dc:creator>白开心</dc:creator><author>白开心</author><pubDate>Thu, 12 Jan 2006 02:56:00 GMT</pubDate><guid>http://www.cnitblog.com/hj627/articles/6138.html</guid><wfw:comment>http://www.cnitblog.com/hj627/comments/6138.html</wfw:comment><comments>http://www.cnitblog.com/hj627/articles/6138.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hj627/comments/commentRss/6138.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hj627/services/trackbacks/6138.html</trackback:ping><description><![CDATA[<P>/********************************************************<BR>作者：(<A href="mailto:wleii165@yahoo.com">wleii165@yahoo.com</A>)<BR>版本：1.0<BR>创建时间：20020227<BR>修改时间：<BR>功能：小写金额转换成大写<BR>参数：n_LowerMoney 小写金额<BR>v_TransType 种类 -- 1: directly translate, 0: read it in words <BR>输出：大写金额<BR>********************************************************/<BR>CREATE PROCEDURE dbo.L2U <BR>(<BR>@n_LowerMoney numeric(15,2),<BR>@v_TransType int,<BR>@RET VARCHAR(200) output<BR>)<BR>AS </P>
<P>Declare @v_LowerStr VARCHAR(200) -- 小写金额 <BR>Declare @v_UpperPart VARCHAR(200) <BR>Declare @v_UpperStr VARCHAR(200) -- 大写金额<BR>Declare @i_I int</P>
<P>set nocount on</P>
<P>select @v_LowerStr = LTRIM(RTRIM(STR(@n_LowerMoney,20,2))) --四舍五入为指定的精度并删除数据左右空格</P>
<P>select @i_I = 1<BR>select @v_UpperStr = ''</P>
<P>while ( @i_I &lt;= len(@v_LowerStr))<BR>begin<BR>select @v_UpperPart = case substring(@v_LowerStr,len(@v_LowerStr) - @i_I + 1,1)<BR>WHEN '.' THEN '元'<BR>WHEN '0' THEN '零'<BR>WHEN '1' THEN '壹'<BR>WHEN '2' THEN '贰'<BR>WHEN '3' THEN '叁'<BR>WHEN '4' THEN '肆'<BR>WHEN '5' THEN '伍'<BR>WHEN '6' THEN '陆'<BR>WHEN '7' THEN '柒'<BR>WHEN '8' THEN '捌'<BR>WHEN '9' THEN '玖'<BR>END<BR>+ <BR>case @i_I<BR>WHEN 1 THEN '分'<BR>WHEN 2 THEN '角'<BR>WHEN 3 THEN ''<BR>WHEN 4 THEN ''<BR>WHEN 5 THEN '拾'<BR>WHEN 6 THEN '佰'<BR>WHEN 7 THEN '仟'<BR>WHEN 8 THEN '万'<BR>WHEN 9 THEN '拾'<BR>WHEN 10 THEN '佰'<BR>WHEN 11 THEN '仟'<BR>WHEN 12 THEN '亿'<BR>WHEN 13 THEN '拾'<BR>WHEN 14 THEN '佰'<BR>WHEN 15 THEN '仟'<BR>WHEN 16 THEN '万'<BR>ELSE ''<BR>END<BR>select @v_UpperStr = @v_UpperPart + @v_UpperStr<BR>select @i_I = @i_I + 1<BR>end</P>
<P><BR>if ( @v_TransType=0 )<BR>begin<BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零拾','零') <BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零佰','零') <BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零仟','零') <BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零零零','零')<BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零零','零')<BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零角零分','整')<BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零分','整')<BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零角','零')<BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零亿零万零元','亿元')<BR>select @v_UpperStr = REPLACE(@v_UpperStr,'亿零万零元','亿元')<BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零亿零万','亿')<BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零万零元','万元')<BR>select @v_UpperStr = REPLACE(@v_UpperStr,'万零元','万元')<BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零亿','亿')<BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零万','万')<BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零元','元')<BR>select @v_UpperStr = REPLACE(@v_UpperStr,'零零','零')<BR>end</P>
<P>-- 对壹元以下的金额的处理 <BR>if ( substring(@v_UpperStr,1,1)='元' )<BR>begin<BR>select @v_UpperStr = substring(@v_UpperStr,2,(len(@v_UpperStr) - 1))<BR>end</P>
<P>if (substring(@v_UpperStr,1,1)= '零')<BR>begin<BR>select @v_UpperStr = substring(@v_UpperStr,2,(len(@v_UpperStr) - 1))<BR>end</P>
<P>if (substring(@v_UpperStr,1,1)='角')<BR>begin<BR>select @v_UpperStr = substring(@v_UpperStr,2,(len(@v_UpperStr) - 1))<BR>end</P>
<P>if ( substring(@v_UpperStr,1,1)='分')<BR>begin<BR>select @v_UpperStr = substring(@v_UpperStr,2,(len(@v_UpperStr) - 1))<BR>end</P>
<P>if (substring(@v_UpperStr,1,1)='整')<BR>begin<BR>select @v_UpperStr = '零元整'<BR>end</P>
<P>select @ret=@v_UpperStr</P>
<P>GO<BR></P><img src ="http://www.cnitblog.com/hj627/aggbug/6138.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hj627/" target="_blank">白开心</a> 2006-01-12 10:56 <a href="http://www.cnitblog.com/hj627/articles/6138.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>