多平台免费虚拟机软件VirtualBox

  对于 VMWare、Virtual PC 这些虚拟机软件,可能大家都比较熟悉。这里介绍的是另一个虚拟机软件—VirtualBox。
  VirtualBox是一款功能强大的虚拟机软件,它不仅具有丰富的特色,而且性能也很优异。更可喜的是,VirtualBox于数日前走向开源,成为了一个发布在GPL许可之下的自由软件。

VirtualBox支持简体中文界面。

  VirtualBox 不仅具有丰富的特色,而且性能也很优异。VirtualBox 可以在 Linux 和 Windows 主机中运行,并支持在其中安装 Windows (NT 4.0、2000、XP、Server 2003、Vista)、DOS/Windows 3.x、Linux (2.4 和 2.6)、OpenBSD 等系列的客户操作系统。

  假如你曾经有用过虚拟机软件的经历的话,相信使用VirtualBox不在话下。即便你是一个新手,也没有关系。VirtualBox 提供了详细的文档,可以助你在短期内入门。

  VirtualBox 独到之处包括 Remote Desktop Protocol (RDP远程桌面)、iSCSI 及 USB 的支持,VirtualBox 在客户机操作系统上已可以支持 USB 2.0 的硬件装置了。

  相对VMWare、Virtual PC 来说,VirtualBox 具有体积小巧(才20多M),运行速度快的优点。

  VirtualBox 官方网站:http://www.virtualbox.org

  各版本下载:
  [url=http://down1.tech.sina.com.cn/download/down_contents/1182614400/35861.shtml]VirtualBox for Windows 1.6.2[/url],[url=http://down1.tech.sina.com.cn/download/down_contents/1182614400/35863.shtml]VirtualBox for Linux 1.6.2[/url],[url=http://down1.tech.sina.com.cn/download/down_contents/1182614400/35862.shtml]VirtualBox for MAC OS X(Intel) 1.6.2[/url],[url=http://www.virtualbox.org/wiki/Downloads]官方下载[/url]

免费杀毒软件:德国小红伞AntiVir 个人版

  AntiVir被称作德国小红伞,就如同的德国给人的一贯印象一样,没有华丽的界面,没有耍噱头而无用的多余项目,有的就只是高品质的防毒功能。目前其个人版是免费的杀毒软件,为个人电脑免受到电脑病毒的侵害提供全方位防护,支持检测、杀除超过70,000种流行病毒、宏病毒、引导区病毒等等,其可靠性经过多次对比试验和独立的商业纪录证明。

  AntiVir仅供私人使用情况下才可免费合法使用,而且不可使用于商业用途。免费版的病毒库仅次于 BD,居世界第二,它还另有一套付费版本,病毒库世界第一,它们彼此可以共用病毒码,所以完全不用担心支援上的问题。只要保持在线更新,就可以让病毒码永远处于最新状态。它的启动和升级速度之快,让许多同类软件望尘莫及。
  个人版有两个版本,一个是完全免费的Classic,另一个是收费的Premiun。据说这款软件有60万以上的病毒库,不知道是不是真的,看不出来~~~不过查杀那个病毒测试包,杀出了3千7百多个病毒,是目前我见过最多的,当然这并不说明它就比卡巴强~~内存占用适中,三个进程大概10M左右。
如果要说缺点,那就是小红伞不能对下载的压缩文件自动扫描。
(注意,免费版是不用key直接升级的,以前那个所谓申请的 key是用在小型企业版的)

免费版和收费版的病毒库一致

主要区别为

专业版版增加:
Adware/Spyware detection 侦察Adware/Spyware
Fully automated update 完全自动更新
POP3-Scanner POP3 扫描仪
Exclusive download server 专用的更新服务器
New graphic surface 新图表界面
Scan function for directories 能够扫描
License Management 注册许可管理

工作站版增加:
Comprehensive protection 全面的保护
Full security 完全安全
Network-wide administration 网络管理
有 Avira AntiVir Security Management Center (SMC) 安全管理中心
Automated update procedure 自动更新程序
Multiplatform support 支持多种操作平台

可以看出和免费版差别不大
需要防Adware/Spyware安装个EWIDO即可
邮件监控因为实时监控会检测写入硬盘文件所以可有可无(我是从来不开邮件监控的)

推荐开启默认的macrovirus启发式,关闭win 32启发式。误报情况明显改善。

推荐用小红伞的朋友只用默认设置,如果需要排除的,可以开启专家模式设置一下例外的文件夹和程序,其它的最好用默认的。

但AntiVir不支持中文版,不懂英文的朋友要用的话可能要费些脑筋了。

下载站点:http://download.enet.com.cn/html/030202005121601.htm

.NET Framework 开发人员指南 之 使用连接池

  连接到数据库服务器通常由几个需要很长时间的步骤组成。必须建立物理通道(例如套接字或命名管道),必须与服务器进行初次握手,必须分析连接字符串信息,必须由服务器对连接进行身份验证,必须运行检查以便在当前事务中登记,等等。

  实际上,大多数应用程序仅使用一个或几个不同的连接配置。这意味着在执行应用程序期间,许多相同的连接将反复地打开和关闭。为了使打开的连接成本最低,ADO.NET 使用称为连接池的优化方法。

  连接池减少新连接需要打开的次数。池进程保持物理连接的所有权。通过为每个给定的连接配置保留一组活动连接来管理连接。只要用户在连接上调用 Open,池进程就会检查池中是否有可用的连接。如果某个池连接可用,会将该连接返回给调用者,而不是打开新连接。应用程序在该连接上调用 Close 时,池进程会将连接返回到活动连接池集中,而不是真正关闭连接。连接返回到池中之后,即可在下一个 Open 调用中重复使用。

  只有配置相同的连接可以建立池连接。ADO.NET 同时保留多个池,每个配置一个池。连接由连接字符串以及 Windows 标识(在使用集成的安全性时)分为多个池。

  池连接可以大大提高应用程序的性能和可缩放性。默认情况下,ADO.NET 中启用连接池。除非显式禁用,否则,连接在应用程序中打开和关闭时,池进程将对连接进行优化。还可以提供几个连接字符串修饰符来控制连接池的行为。有关更多信息,请参见本主题后面的“使用连接字符串关键字控制连接池”。

池的创建和分配

  在初次打开连接时,将根据完全匹配算法创建连接池,该算法将池与连接中的连接字符串关联。每个连接池与不同的连接字符串关联。打开新连接时,如果连接字符串并非与现有池完全匹配,将创建一个新池。按进程、按应用程序域、按连接字符串以及(在使用集成的安全性时)按 Windows 标识来建立池连接。

  在以下 C# 示例中创建了三个新的 SqlConnection 对象,但是管理时只需要两个连接池。注意,根据为 Initial Catalog 分配的值,第一个和第二个连接字符串有所不同。

 
using (SqlConnection connection = new SqlConnection(
  "Integrated Security=SSPI;Initial Catalog=Northwind"))
    {
        connection.Open();     
        // Pool A is created.
    }

using (SqlConnection connection = new SqlConnection(
  "Integrated Security=SSPI;Initial Catalog=pubs"))
    {
        connection.Open();     
        // Pool B is created because the connection strings differ.
    }

using (SqlConnection connection = new SqlConnection(
  "Integrated Security=SSPI;Initial Catalog=Northwind"))
    {
        connection.Open();     
        // The connection string matches pool A.
    }

  如果 MinPoolSize 在连接字符串中未指定或指定为零,池中的连接将在一段时间不活动后关闭。但是,如果指定的 MinPoolSize 大于零,在 AppDomain 被卸载并且进程结束之前,连接池不会被破坏。非活动或空池的维护只需要最少的系统开销。

Note注意

如果发生致命错误(例如故障转移或注册表中的别名更改),池将自动清除。

添加连接

  连接池是为每个唯一的连接字符串创建的。当创建一个池后,将创建多个连接对象并将其添加到该池中,以满足最小池大小的要求。连接根据需要添加到池中,但是不能超过指定的最大池大小(默认值为 100)。连接在关闭或断开时释放回池中。

  在请求 SqlConnection 对象时,如果存在可用的连接,将从池中获取该对象。连接要可用,必须未使用,具有匹配的事务上下文或未与任何事务上下文关联,并且具有与服务器的有效链接。

  连接池进程通过在连接释放回池中时重新分配连接,来满足这些连接请求。如果已达到最大池大小且不存在可用的连接,则该请求将会排队。然后,池进程尝试重新建立任何连接,直到到达超时时间(默认值为 15 秒)。如果池进程在连接超时之前无法满足请求,将引发异常。

Caution note警告

我们建议您在使用完连接时一定要关闭连接,以便连接可以返回池。要关闭连接,可以使用 Connection 对象的 Close 或 Dispose 方法,也可以通过在 C# 的 using 语句中或在 Visual Basic 的 Using 语句中打开所有连接。不是显式关闭的连接可能不会添加或返回到池中。例如,如果连接已超出范围但没有显式关闭,则仅当达到最大池大小而该连接仍然有效时,该连接才会返回到连接池中。有关更多信息,请参见 Visual Basic 的using 语句(C# 参考)如何:释放系统资源

Note注意

不要在类的 Finalize 方法中对 Connection、DataReader 或任何其他托管对象调用 Close 或 Dispose。在终结器中,仅释放类直接拥有的非托管资源。如果类不拥有任何非托管资源,则不要在类定义中包含 Finalize 方法。有关更多信息,请参见垃圾回收

移除连接

  连接池进程定期扫描连接池,查找没有通过 Close 或 Dispose 关闭的未用连接,并重新建立找到的连接。如果应用程序没有显式关闭或断开其连接,连接池进程可能需要很长时间才能重新建立连接,所以,最好确保在连接中显式调用 Close 和 Dispose。

  如果连接长时间空闲,或池进程检测到与服务器的连接已断开,连接池进程会将该连接从池中移除。注意,只有在尝试与服务器进行通信之后才能检测到断开的连接。如果发现某连接不再连接到服务器,则会将其标记为无效。无效连接只有在关闭或重新建立后,才会从连接池中移除。

  如果存在与已消失的服务器的连接,那么即使连接池管理程序未检测到已断开的连接并将其标记为无效,仍有可能将此连接从池中取出。这种情况是因为检查连接是否仍有效的系统开销将造成与服务器的另一次往返,从而抵消了池进程的优势。发生此情况时,初次尝试使用该连接将检测连接是否曾断开,并引发异常。

清除池

  ADO.NET 2.0 引入了两种新的方法来清除池:ClearAllPoolsClearPool。ClearAllPools 清除给定提供程序的连接池,ClearPool 清除与特定连接关联的连接池。如果在调用时连接正在使用,将进行相应的标记。连接关闭时,将被丢弃,而不是返回池中。

事务支持

  连接是根据事务上下文来从池中取出并进行分配的。除非在连接字符串中指定了 Enlist=false,否则,连接池将确保连接在 Current 上下文中登记。如果连接使用登记的 System.Transactions 事务关闭并返回池中,连接将保留在池中,以便使用相同 System.Transactions 事务对该连接池的下一次请求将返回相同的连接。如果该事务没有可用连接,在该连接打开时,将自动注册该连接。

  当连接关闭时,它将被释放回池中,并根据其事务上下文放入相应的子部分。因此,即使分布式事务仍然挂起,仍可以关闭该连接而不会生成错误。这样,您就可以在随后提交或中止分布式事务。

使用连接字符串关键字控制连接池

  SqlConnection 对象的 ConnectionString 属性支持连接字符串键/值对,可以用于调整连接池逻辑的行为。有关更多信息,请参见 ConnectionString

池碎片

  池碎片是许多 Web 应用程序中的一个常见问题,应用程序可能会创建大量在进程退出后才会释放的池。这样,将打开大量的连接,占用许多内存,从而影响性能。

因为集成安全性产生的池碎片

  连接根据连接字符串以及用户标识来建立池连接。因此,如果使用网站上的基本身份验证或 Windows 身份验证以及集成的安全登录,每个用户将获得一个池。尽管这样可以提高单个用户的后续数据库请求的性能,但是该用户无法利用其他用户建立的连接。这样还使每个用户至少产生一个与数据库服务器的连接。这对特定 Web 应用程序结构会产生副作用,因为开发人员需要衡量安全性和审计要求。

因为许多数据库产生的池碎片

  许多 Internet 服务提供商在一台服务器上托管多个网站。他们可能使用单个数据库确认窗体身份验证登录,然后为该用户或用户组打开与特定数据库的连接。与身份验证数据库的连接将建立池连接,供每个用户使用。但是,每个数据库的连接存在一个独立的池,因此增加了与服务器的连接数。

  这也会对应用程序设计产生副作用。但是,可以通过一个相对简单的方式避免此副作用,而又不会影响连接 SQL Server 时的安全性。不是为每个用户或组连接独立的数据库,而是连接到服务器上的相同数据库,然后执行 Transact-SQL USE 语句来切换为所需的数据库。以下代码段演示入如何创建与 master 数据库的初始连接,然后切换到 databaseName 字符串变量中指定的所需数据库。

ADO.NET 2.0技术内幕 之 连接池

 连  接  池

与微软以前的数据访问技术类似,ADO.NET包括对连接池的内置支持。

1  连接句柄和物理连接

如果正在使用Visual Studio,可以使用Visual Studio调试工具检查对象的一些内部私有属性。例如,编写一些代码来打开一个SqlConnection,并在调用Open方法的地方设置断点。右击代码中的对象,并选择【添加监视】,将该对象添加到【监视】窗口。在【监视】窗口中,展开标有Non-Pubic Members的区域。向下滚动,将会看到一个称为InnerConnection的私有属性。

从结构上讲,InnerConnection属性的内容是一个非常薄的层,位于数据库的物理连接之上。为在这里进行讨论,InnerConnection属性和到该数据库的物理连接是可交换的。在逐步执行代码时,将会看到在打开和关闭连接时,InnerConnection属性的值发生变化。当调用Open方法时,SQL Client .NET数据提供程序将SqlConnection对象关联至该数据库的物理连接,所以可以执行查询并返回结果。

打开和关闭数据库连接的代价非常高。为了帮助节省资源并提高性能,.NET Framework中的.NET数据提供程序在默认情况下均使用连接池。

2  连接池是什么

连接池是一种在打开数据存储区的连接时提高应用程序性能的机制。在调用SqlConnection对象的Close方法时,SQL Client .NET数据提供程序并不实际关闭内部连接。相反,数据提供程序将该内部连接存储到一个池中,以便在以后再次使用。甚至在SqlConnection对象被处理之后,该内部连接也保留在池中。如果在以后使用相同连接字符串和凭据调用SqlConnection对象的Open方法,将会再次使用同一内部连接与数据库进行通信。

如果希望确认是否真正再次利用了同一内部连接,可以使用.NET Reflection中的功能以可编程方式访问私有InnerConnection属性的内容。以下代码(其需要对System.Reflection命名空间的引用)在Using代码块中打开一个SqlConnection,并存储SqlConnection的InnerConnection属性的值。通过利用Using代码块,在该代码块的末尾隐式处理了SqlConnection。此代码在Using代码块中打开另一个SqlConnection,并存储SqlConnection的InnerConnection属性的值。最后,此代码对比InnerConnection属性的内容,确认它们实际上为同一对象。

Visual Basic

Dim strConn As String = "Data Source=.SQLExpress;Integrated Security=True;"
Dim propInnerConn As PropertyInfo
propInnerConn = GetType(SqlConnection).GetProperty("InnerConnection", _
                            BindingFlags.NonPublic or BindingFlags.Instance)
Dim objInnerConn1, objInnerConn2 As Object
Using cn As New SqlConnection(strConn)
    cn.Open()
    objInnerConn1 = propInnerConn.GetValue(cn, Nothing)
    cn.Close()
End Using

Using cn As New SqlConnection(strConn)
    cn.Open()
    objInnerConn2 = propInnerConn.GetValue(cn, Nothing)
    cn.Close()
End Using

Console.WriteLine(objInnerConn1 Is objInnerConn2)

Visual C#

string strConn = @"Data Source=.SQLExpress;Integrated Security=True;";
PropertyInfo propInnerConn;
propInnerConn = typeof(SqlConnection).GetProperty("InnerConnection",
                                BindingFlags.NonPublic | BindingFlags.Instance);
object objInnerConn1, objInnerConn2;
using (SqlConnection cn = new SqlConnection(strConn))
{
    cn.Open();
    objInnerConn1 = propInnerConn.GetValue(cn, null);
    cn.Close();
}

using (SqlConnection cn = new SqlConnection(strConn))
{
    cn.Open();
    objInnerConn2 = propInnerConn.GetValue(cn, null);
    cn.Close();
}

Console.WriteLine(objInnerConn1 == objInnerConn2);

两个SqlConnection对象是在不同的Using代码块中创建的,所以其资源将在每个Using代码块的末尾被清除。InnerConnection属性的内容及其所封装的物理连接没有被处理,而是存储在池中,以便在以后被再次利用。

 注意    如果在连接字符串中禁用了连接池(稍后将解释如何禁用),将会看到此内部连接不能被重复利用。

3  连接池如何改进代码

考虑一个访问SQL Server数据库的典型ASP.NET或WebServices应用程序。客户端应用程序每次需要查询数据库时,就会在服务器端代码中进行往返,以打开SqlConnection来执行查询。在许多此类应用程序中,这一代码以相同凭据一次又一次地连接到相同数据库。理论上,这意味着客户端应用程序每次需要执行查询时,服务器端代码需要执行三个操 作——登录到数据库(需要检查所提供的凭据)、执行查询、然后注销。

连接池可以真正地提高此类应用程序的性能。通过将内部连接存储在池中,并在以后进行重复利用,就不再因为登录数据库以及从中注销而降低性能。对SqlConnection对象的Open和Close方法的调用可以短时间内返回,从而可以提高代码的性能和响应速度(请参见图3.4)。

图3.4  典型ASP.NET或WebServices应用程序中的连接池

4  启用连接池

在ADO.NET中,连接池是默认启用的。以下代码段将同一SqlConnection对象打开和关闭5次。由于连接池是默认启用的,所以当调用Close方法时,到数据库的实际连接没有被实际关闭,而是将该数据库连接发送到池中,以便在以后重复利用。

Visual Basic

Dim strConn As String
strConn = "Data Source=.SQLExpress;Integrated Security=True;"
Dim cn As New SqlConnection(strConn)
For intCounter As Integer = 1 To 5
    cn.Open()
    cn.Close()
Next intCounter

Visual C#

string strConn;
strConn = @"Data Source=.SQLExpress;Integrated Security=True;";
SqlConnection cn = new SqlConnection(strConn);
for (int intCounter = 1; intCounter <= 5; intCounter++)
{ 
    cn.Open();
    cn.Close();
}

5  放入池中的连接何时关闭

在调用Close方法时,SqlClient将该连接返回到池中。假定该连接没有被再次使用,将在大约5分钟后将其从池中删除。但具体在多少秒后删除,并没有确切的数值。其行为取决于所生成的随机数以及创建该池时的相对湿度(relative humidity)。当然,如果在退出应用程序时存在已打开的连接池,那么作为应用程序正常清除过程的一部分,这些连接将被关闭和处理。

6  禁用连接池

您可能不希望使用连接池。例如,如果正在使用一个直接与数据库进行通信的简单Windows应用程序,那么可能希望禁用连接池。在采用这一架构时,各个客户端应用程序需要自己的连接。在启用连接池时,每个应用程序的连接被放入池中,如果在清除连接池之前重新打开该连接,将重复利用放入池中的连接。所以,如果应用程序频繁重复使用连接,那么在启用连接池的情况下,对SqlConnection.Open的调用将会更快速地返回。但是,这种方法将会导致在任意给定时刻存在许多活动的数据库连接。禁用连接池将会降低任意时刻的活动数据库连接数目,但这样会强制所有对SqlConnection.Open的调用都建立一个新的数据库连接。

如果希望禁用连接池,可以通过向连接字符串中添加Pooling=False,逐个连接地禁用连接池。

幸运的是,在ADO.NET 2.0中不再需要记忆诸如此类的属性。如果存在疑问,可以检查SqlConnectionStringBuilder类的选项。在这个类中可以找到一个Pooling属性,其取值为Boolean类型。默认情况下,此值被设置为True。将该值设置为False将会禁止将该连接放入池中。因此,在调用SqlConnection对象的Close方法时,将会关闭与数据库的实际连接。

 注意    在“偶尔进行连接”的Windows应用程序中,使用连接池可能很有帮助,具体取决于应用程序。如果应用程序希望定期重新连接到数据库,则可以发挥连接池的作用,将与数据库的物理连接保持打开状态,至少暂时如此。如果在从池中删除该物理连接之前,应用程序尝试重新连接到该数据库,则连接池逻辑(pooling logic)将会重新使用与该数据库的物理连接。

7  有关连接池的常见问题

学习连接池的开发人员越多,出现的问题也会越多。例如,在我听到的连接池相关问题中,最常见的一个是“我怎样才能知道与数据库的物理连接是被真正关闭了,还是仅仅被放入池中了?”,另一个常见问题是“我怎样才能分辨刚刚打开的连接是建立了一个新物理连接,还是重新利用了一个被放在池中的连接?”。

有许多工具可以帮助回答有关连接池的问题。其中一些工具更出色一些。我定期使用SQL Server事件探查器来监视对SQL Server数据库的连接和查询。在ADO.NET的2.0版中,还可以使用Windows中的【性能监视器】。

ADO.NET 2.0中的SQL Client .NET数据提供程序包括用于连接池的性能计数器。现在可以使用诸如【性能监视器】等工具来查看以下数目:放入池中的连接、活动连接、自由连接、活动与非活动连接池及活动与非活动连接池组。还可以搜集有关在每秒内进行连接和断开连接数目的信息。

在某些情况下,维护性能计数器会产生一些性能影响。为此,SQL Client .NET数据提供程序没有维护以下性能计数器:活动或自由连接的数目,或者每秒内放入池中的连接数目或断开连接的数目。可以通过向应用程序的配置文件中添加一项,以启用应用程序中的这些性能计数器。如需有关使用这些性能计数器的详细信息,请参阅MSDN网站上的文章“Using ADO.NET Performance Counters”(使用ADO.NET性能计数器)。

为便于您提出有关连接池的问题,也便于我回答这些问题,我已经开发了一个示例应用程序,如图3.5所示,它可以作为本书示例代码中的一部分进行下载。这一应用程序允许使用如图3.3所示的SqlConnectionStringBuilder/PropertyGrid对话框生成连接字符串。可以很容易地生成新的SqlConnection,打开和关闭现有连接,以及调用ClearPool和ClearAllPools方法。此示例还可以通过【性能监视器】访问SQL Client性能计数器,而不需要以手动方式添加性能计数器。此应用程序的配置文件中包含一项,其能够启用在默认情况下被关闭的性能计数器。在每次创建、打开或关闭SqlConnection或关闭一个或所有连接池时,此示例中的性能计数器都会被更新。

图3.5  研究连接池

8  ADO.NET如何确定是否使用放入池中的连接

简单地说,假定连接池未被禁用,则SQL Client .NET数据提供程序在您调用SqlConnection对象的Open方法时检查ConnectionString,并确定池中是否存在可用连接。如果存在可用连接,则SQL Client使用该连接。否则,打开一个到数据库的新连接。

实际上还有一些需要说明的内容。设想一个ASP.NET应用程序,其中有多位用户以模拟(impersonation)登录同一数据库,每位用户都使用自己的凭据访问SQL Server数据库。每位用户的连接字符串都是相同的,但他们的凭据有很大不同。由于SQL Client考虑了用户权限,所以用于确定池中有哪些连接可供使用的逻辑要稍微复杂一些。

9  强制ADO.NET使用新

GridView 72般绝技

GridView无代码分页排序
GridView选中,编辑,取消,删除
GridView正反双向排序
GridView和下拉菜单DropDownList结合
GridView和CheckBox结合
鼠标移到GridView某一行时改变该行的背景色方法一
鼠标移到GridView某一行时改变该行的背景色方法二
GridView实现删除时弹出确认对话框
GridView实现自动编号
GridView实现自定义时间货币等字符串格式
GridView实现用“…”代替超长字符串
GridView一般换行与强制换行
GridView显示隐藏某一列
GridView弹出新页面/弹出新窗口
GridView固定表头(不用javascript只用CSS,2行代码,很好用)
GridView合并表头多重表头无错完美版(以合并3列3行举例)
GridView突出显示某一单元格(例如金额低于多少,分数不及格等)
GridView加入自动求和求平均值小计
GridView数据导入Excel/Excel数据读入GridView

1.GridView无代码分页排序

效果图:

1.AllowSorting设为True,aspx代码中是AllowSorting="True";
2.默认1页10条,如果要修改每页条数,修改PageSize即可,在aspx代码中是PageSize="12"。
3.默认的是单向排序的,右击GridView弹出“属性”,选择AllowSorting为True即可。

2.GridView选中,编辑,取消,删除:

效果图:

后台代码:
你可以使用sqlhelper,本文没用。代码如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;

public partial class _Default : System.Web.UI.Page
{

//清清月儿http://blog.csdn.net/21aspnet 
    SqlConnection sqlcon;
    SqlCommand sqlcom;
    string strCon = "Data Source=(local);Database=数据库名;Uid=帐号;Pwd=密码";
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            bind();
        }
    }
    protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
    {
        GridView1.EditIndex = e.NewEditIndex;
        bind();
    }

//删除
    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        string sqlstr = "delete from 表 where id='" + GridView1.DataKeys[e.RowIndex].Value.ToString() + "'";
        sqlcon = new SqlConnection(strCon);
        sqlcom = new SqlCommand(sqlstr,sqlcon);
        sqlcon.Open();
        sqlcom.ExecuteNonQuery();
        sqlcon.Close();
        bind();
    }

//更新
    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        sqlcon = new SqlConnection(strCon);
        string sqlstr = "update 表 set 字段1='"
            + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString().Trim() + "',字段2='"
            + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[2].Controls[0])).Text.ToString().Trim() + "',字段3='"
            + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[3].Controls[0])).Text.ToString().Trim() + "' where id='"
            + GridView1.DataKeys[e.RowIndex].Value.ToString() + "'";
        sqlcom=new SqlCommand(sqlstr,sqlcon);
        sqlcon.Open();
        sqlcom.ExecuteNonQuery();
        sqlcon.Close();
        GridView1.EditIndex = -1;
        bind();
    }

//取消
    protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
        GridView1.EditIndex = -1;
        bind();
    }

//绑定
    public void bind()
    {
        string sqlstr = "select * from 表";
        sqlcon = new SqlConnection(strCon);
        SqlDataAdapter myda = new SqlDataAdapter(sqlstr, sqlcon);
        DataSet myds = new DataSet();
        sqlcon.Open();
        myda.Fill(myds, "表");
        GridView1.DataSource = myds;
        GridView1.DataKeyNames = new string[] { "id" };//主键
        GridView1.DataBind();
        sqlcon.Close();
    }
}

前台主要代码:
                            … …
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4"
                        ForeColor="#333333" GridLines="None" OnRowDeleting="GridView1_RowDeleting" OnRowEditing="GridView1_RowEditing"
                        OnRowUpdating="GridView1_RowUpdating" OnRowCancelingEdit="GridView1_RowCancelingEdit">
                        <FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
                        <Columns>
                            <asp:BoundField DataField="身份证号码" HeaderText="用户ID" ReadOnly="True" />
                            <asp:BoundField DataField="姓名" HeaderText="用户姓名" />
                            <asp:BoundField DataField="员工性别" HeaderText="性别" />
                            <asp:BoundField DataField="家庭住址" HeaderText="家庭住址" />
                            <asp:CommandField HeaderText="选择" ShowSelectButton="True" />
                            <asp:CommandField HeaderText="编辑" ShowEditButton="True" />
                            <asp:CommandField HeaderText="删除" ShowDeleteButton="True" />
                        </Columns>
                        <RowStyle ForeColor="#000066" />
                        <SelectedRowStyle BackColor="#669999" Font-Bold="True" ForeColor="White" />
                        <PagerStyle BackColor="White" ForeColor="#000066" HorizontalAlign="Left" />
                        <HeaderStyle BackColor="#006699" Font-Bold="True" ForeColor="White" />
                    </asp:GridView>

3.GridView正反双向排序:
效果图:点姓名各2次的排序,点其他也一样可以。

后台代码:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
public partial class Default3 : System.Web.UI.Page
{

//清清月儿的博客http://blog.csdn.net/21as

Asp.Net Web 部署项目

当 ASP 第一次发布时,Web 编程还比较困难,因为需要 IIS 来处理 ASP 页。后来,ASP.NET 2.0 和 Visual Studio® 2005 通过引入网站开发模型使一切工作都变得容易了。借助该网站模型,您不必在 Visual Studio 中创建新项目,而是可以指向一个目录并开始编写网页和代码。此外,您还可以使用内置的 ASP.NET Development Server 快速测试站点,ASP.NET Development Server 将 ASP.NET 寄宿在一个本地进程中,并消除了必须安装 IIS 才能进行开发这一先决条件。该网站模型的魅力在于您在开发 Web 应用程序时无需考虑打包和部署。需要其他类时怎么办?向 App_Code 目录添加一个 .cs 文件即可开始编写。希望将可本地化的字符串存储在资源文件中时怎么办?向 App_GlobalResources 目录添加一个 .resx 文件并键入字符串。一切都顺顺当当;您根本就不必考虑编译和部署方面的事情。
在准备进行部署时,您有多种可选方案。最简单的方案是将文件复制到主运行服务器并按要求编译每一个文件(和在测试环境中一样)。第二种方案是使用 aspnet_compiler.exe 实用工具将应用程序预编译为二进制版本,之后将只剩下要放到服务器上的一组程序集、静态内容和配置文件。第三种方案也使用 aspnet_compiler.exe,但要创建一个可更新的二进制部署,其中 .as*x 文件保持不变(并且可修改),而所有代码文件都编译为二进制程序集。
这似乎涵盖了每一种可能的情况,开发人员可以一心一意地编写 Web 应用程序,而在以后实际部署时再作打包和部署决定。不过,此模型也遭到了相当大的反对,特别是那些习惯了自己开发的 Web 项目是在实际项目文件中指定的实际项目的开发人员的反对,这些项目允许注入生成前和生成后函数、从生成过程排除文件以及使用命令行开关在调试和发布版本之间进行切换等操作。有鉴于此,Microsoft 迅速推出了 Web 应用程序项目(即 WAP),最初它是作为 Visual Studio 2005 的插件发布的,现在包含在 Visual Studio 2005 Service Pack 1 (SP1) 中,Visual Studio 2005 Service Pack 1 (SP1) 可从 msdn.microsoft.com/vstudio/support/vs2005sp1 下载。
WAP 可替代与 Visual Studio .NET 2003 Web 项目模型非常接近的网站模型。新的 WAP 模型会在生成过程中编译所有源代码文件,并在本地的 /bin 目录中生成一个用于部署的程序集。WAP 还使得增量采用 ASP.NET 2.0 引入的新的分部类代码隐藏模型变得更加容易,因为现在您可以打开 Visual Studio .NET 2003 项目,并且在转换过程中只修改 .sln 和 .csproj(或 .vbproj)文件。然后可将每个文件及其代码隐藏类转换为与项目中任何其他文件都无关的新的分部类模型(操作方法是:在解决方案资源管理器中右键单击各个文件并选择“转换为 Web 应用程序”),也可以让它们仍然使用旧模型。这与将 Visual Studio .NET 2003 Web 项目转换为网站模型大不相同,转换为网站模型会同时转换所有文件,并且不支持增量采用。
最后,还有一个称为“Web 部署项目”(本专栏的主题)的新项目类型,它引入了许多既针对网站项目又针对 Web 应用程序项目的附加部署选项。 Web 部署项目弥补了既针对网站应用程序又针对 Web 应用程序项目的部署选项中的遗留漏洞,并且可以简单而又可扩展地实现几乎任何部署方案。 为确切了解这一新项目类型增加了哪些内容,我们先来回顾一下在 Web 部署项目推出之前的情况。

在 ASP.NET 2.0 中部署
使用网站模型生成应用程序时,您可以选择对部署站点进行预编译。通过 Visual Studio 2005 中的“生成”|“发布”菜单或直接通过命令行实用工具 aspnet_compiler.exe,您可以访问预编译实用工具。图 1 显示了 Visual Studio 所显示的此工具的界面。

图 1 网站发布实用工具 (单击该图像获得较大视图)
使用发布实用工具时必须作出的第一个决定是 .as*x 文件在部署后是否可更新(在 aspnet_compiler.exe 命令行实用工具中使用 -u 开关的“允许更新此预编译站点”选项)。 此决定取决于在部署后是否希望能够在不重复整个部署过程的情况下对网页进行较少更改。事实上,您可能希望明确禁止对已部署网页进行任何修改,并要求所有修改都要遵循标准的部署(也希望遵循标准的测试)过程,在这种情况下,应选择将站点发布为不可更新。
将站点发布为不可更新时,您可以完全删除所有 .as*x 文件,而只发布二进制程序集(以及配置文件和静态内容)。不过,如果没有物理文件,ASP.NET 将无法确定哪些类要用于哪些端点请求。例如,如果您的应用程序收到一个请求 Page1.aspx 的请求,而您已经使用了不可更新的二进制部署,则磁盘上很可能没有任何 Page1.aspx 文件,并且现有配置文件中没有任何内容来指示部署到 /bin 目录的程序集集合中哪个类应是该请求的实际处理程序。为弥补这一缺陷,编译过程还将生成一个 .compiled 文件集合,这些文件以简单的 XML 格式包含端点-类型映射和文件依赖关系信息,同时这些文件必须与所部署站点的 /bin 目录中的二进制程序集一起发布。例如,如果应用程序中原来有一个名为 Page1.aspx 的页,则 aspnet_compiler.exe 实用工具会生成一个名为 page1.aspx.cdcab7d2.compiled(哈希代码不定)的文件,其中包含以下 XML:

 
<?xml version="1.0" encoding="utf-8"?>
<preserve resultType="3"
virtualPath="/SampleWebSite/Page1.aspx"
hash="8a8da6c5a" filehash="42c4a74221152888"
flags="110000" assembly="App_Web_aq9bt8mj"
type="ASP.page1_aspx">
<filedeps>
<filedep name="/SampleWebSite/Page1.aspx" />
<filedep name="/SampleWebSite/Page1.aspx.cs" />
</filedeps>
</preserve>
使用此实用工具发布网站时必须作出的另一个重要决定是确定生成的程序集的打包粒度。通过选中“使用固定命名和单页程序集”(或在 aspnet_compiler.exe 命令行实用工具中使用 -fixednames),既可为站点中的每个目录创建单独的程序集,又可为站点中的每个可编译文件创建单独的程序集。作出该决定并不像您可能想像的那么容易,因为每个选项都有其潜在问题。如果决定不使用 -fixednames 选项,则每次发布应用程序时都会生成一组全新的程序集,并且它们的名称与之前发布的程序集不同。这意味着部署更加复杂,因为在部署新的程序集之前必须删除主运行服务器上所有以前发布的程序集,否则在处理下一个请求时将生成冗余的类定义错误。使用 -fixednames 选项可以解决此问题,因为每个文件都将与命名清晰的程序集对应,而这些程序集在一次编译和下次编译中不会发生变化。不过,如果站点规模较大,则为每个网页、控件和母版页分别生成单独的程序集,很明显意味着您要管理成百上千个程序集的发布。Web 部署项目非常圆满地解决了部署中程序集粒度这一问题,如下所示。
您还可以将程序集签名引入编译过程,以便创建具有强名称的不同版本的程序集,如果需要这也适用于全局程序集缓存 (GAC) 中的部署。通过使用 -aptca 选项,您可以使用程序集级别的属性 AllowPartiallyTrustedCallers 来标记生成的程序集,在将任何程序集部署到 GAC 并且以低等或中等信任级别运行 ASP.NET 的情况下,这是必要的。(请注意,此属性应仅应用于已证明不会暴露任何安全漏洞的程序集,因为如有漏洞,使用此属性可能招致引诱攻击。)
有关发布站点的另一个细节是如果决定使用 Web 应用程序项目而不使用网站模型,则“生成”|“发布”对话框的外观将大不相同,如图 2 所示。Web 应用程序项目假定您希望将应用程序发布为可更新的 .as*x 文件和预编译的源文件(开发中它所使用的同一模型),因此仅针对二进制的部署选项不可用。此实用工具实质上更接近于“复制网站”实用工具(随网站一起提供)而不是“发布网站”实用工具,因为它需要复制由标准生成过程生成的文件。

图 2 Web 应用程序项目的发布 Web 实用工具 (单击该图像获得较大视图)
从技术上讲,即使您使用 Web 应用程序项目,也不会限制您使用仅针对二进制(不可更新)的部署。其实,WAP 生成的输出是一个有效的网站,然后您可以传递 aspnet_compiler.exe 实用工具来生成创建二进制部署。幸运的是,您只是不能从 Web 部署项目调整过的 Visual Studio 2005 界面调用它而已。

Web 部署项目
那么迄今为止所有现有的编译和部署选项中缺少什么呢?主要缺少两种功能:控制程序集命名(特别是为了进行部署)的功能,以及将所有输出的程序集合并为一个程序集从而简化部署的功能。Web 部署项目可以解决这两个问题。但或许更重要的是,它们还与网站应用程序和 Web 应用程序项目的部署问题中的许多遗留问题有关。
它们的核心是,Web 部署项目(可从 msdn2.microsoft.com/aa336619.aspx 下载)代表的只是向您解决方案中添加的另一个项目类型。与所有 Visual Studio 项目文件一样,Web 部署项目也是可在 IDE 中直接编译或从命令行运行的 MSBuild 脚本。不过,Web 部署项目包含用于编译和打包网站(或 Web 应用程序项目)的生成命令,而不指定要编译的源代码文件集合。这意味着它们会调用 aspnet_compiler.exe 实用工具(以及其他实用工具)来创建特定 Web 应用程序的部署。Web 部署项目是作为 Visual Studio 插件包提供的,其中包含了一个用于注入新项目的易用菜单项和一个用于控制所有可用设置的完整属性页集。若要向现有应用程序中添加新项目,可右键单击现有网站(或 Web 应用程序项目),然后选择“添加 Web 部署项目”项,如图 3 所示。此操作将把一个包含 MSBuild 脚本的新 .wdproj 文件添加到您的解决方案中,并会生成您所创建的应用程序的部署。

图 3 添加 Web 部署项目 

图 3a   

图 3b   (单击该图像获得较大视图)

图 3c   
将 Web 部署项目添加到您的解决方案之后,您就可以通过访问

域名带来的流量

  去年cn域名推广时,我也凑热闹注册了几个域名。由于一时偷懒,懒到现在,除了本站的[url=http://www.biglee.cn/]biglee.cn[/url]和[url=http://lee.zj.cn/]lee.zj.cn[/url]外,好多域名都没真正用起来。
  昨天为了用cn域名测试Google的企业邮局套件,去给之前注册的[url=http://qqkav.com.cn]qqkav.com.cn[/url]做MX解析,顺便也做了URL转发到本站。刚才查看本站流量时发现此域名今天已经带来了7个IP的流量,其中一个是百度搜索[url=http://www.qqkav.com.cn]www.qqkav.com.cn[/url]来的,其它的都是手工输入的。
  看来此域名还是不错的,可以好好利用一下,不能浪费了。
  先想想有什么好项目做没。也欢迎各位朋友提建议。

为人处世的经验?仅供参考!

1. 人之所以痛苦,在于追求错误的东西。
2. 如果你不给自己烦恼,别人也永远不可能给你烦恼。因为你自己的内心,你放不下。
3. 你永远要感谢给你逆境的众生。
4. 你永远要宽恕众生,不论他有多坏,甚至他伤害过你,你一定要放下,才能得到真正的快乐。
5. 当你快乐时,你要想这快乐不是永恒的。当你痛苦时,你要想这痛苦也不是永恒的。
6. 今日的执著,会造成明日的后悔。
7. 你可以拥有爱,但不要执著,因为分离是必然的。
8. 不要浪费你的生命在你一定会后悔的地方上。
9. 你什么时候放下,什么时候就没有烦恼。
10. 每一种创伤,都是一种成熟。
11. 狂妄的人有救,自卑的人没有救,认识自己,降伏自己,改变自己,才能改变别人。
12. 你不要一直不满人家,你应该一直检讨自己才对。不满人家,是苦了你自己。
13. 一个人如果不能从内心去原谅别人,那他就永远不会心安理得。
14. 心中装满着自己的看法与想法的人,永远听不见别人的心声。
15. 毁灭人只要一句话,培植一个人却要千句话,请你多口下留情。
16. 根本不必回头去看咒骂你的人是谁?如果有一条疯狗咬你一口,难道你也要趴下去反咬他一口吗?
17. 永远不要浪费你的一分一秒,去想任何你不喜欢的人。
18. 请你用慈悲心和温和的态度,把你的不满与委屈说出来,别人就容易接受。
19. 同样的瓶子,你为什么要装毒药呢?同样的心里,你为什么要充满着烦恼呢?
20. 得不到的东西,我们会一直以为他是美好的,那是因为你对他了解太少,没有时间与他相处在一起。当有一天,你深入了解后,你会发现原不是你想像中的那么美好。
21. 活着一天,就是有福气,就该珍惜。当我哭泣我没有鞋子穿的时候,我发现有人却没有脚。
22. 多一分心力去注意别人,就少一分心力反省自己,你懂吗?
23. 憎恨别人对自己是一种很大的损失。
24. 每一个人都拥有生命,但并非每个人都懂得生命,乃至于珍惜生命。不了解生命的人,生命对他来说,是一种惩罚。
25. 情执是苦恼的原因,放下情执,你才能得到自在
26. 不要太肯定自己的看法,这样子比较少后悔。
27. 当你对自己诚实的时候,世界上没有人能够欺骗得了你。
28. 用伤害别人的手段来掩饰自己缺点的人,是可耻的。
29. 默默的关怀与祝福别人,那是一种无形的布施。
30. 不要刻意去猜测他人的想法,如果你没有智慧与经验的正确判断,通常都会有错误的。
31. 要了解一个人,只需要看他的出发点与目的地是否相同,就可以知道他是否真心的。
32. 人生的真理,只是藏在平淡无味之中。
33. 不洗澡的人,硬擦香水是不会香的。名声与尊贵,是来自于真才实学的。有德自然香。
34. 时间总会过去的,让时间流走你的烦恼吧!
35. 你硬要把单纯的事情看得很严重,那样子你会很痛苦。
36. 永远扭曲别人善意的人,无药可救。
37. 说一句谎话,要编造十句谎话来弥补,何苦呢?
38. 白白的过一天,无所事事,就像犯了窃盗罪一样
39. 广结众缘,就是不要去伤害任何一个人。
40. 沉默是毁谤最好的答覆。
41. 对人恭敬,就是在庄严你自己。
42. 拥有一颗无私的爱心,便拥有了一切。
43. 来是偶然的,走是必然的。所以你必须,随缘不变,不变随缘。
44. 慈悲是你最好的武器。
45. 只要面对现实,你才能超越现实。
46. 良心是每一个人最公正的审判官,你骗得了别人,却永远骗不了你自己的良心。
47. 不懂得自爱的人,是没有能力去爱别人的。
48. 有时候我们要冷静问问自已,我们在追求什么?我们活着为了什么?
49. 不要因为小小的争执,远离了你至亲的好友,也不要因为小小的怨恨,忘记了别人的大恩。
50. 感谢上苍我所拥有的,感谢上苍我所没有的。
51. 凡是能站在别人的角度为他人着想,这个就是慈悲。
52. 说话不要有攻击性,不要有杀伤力,不夸已能,不扬人恶,自然能化敌为友。
53. 诚实的面对你内心的矛盾和污点,不要欺骗你自己。
54. 因果不曾亏欠过我们什么,所以请不要抱怨。
55. 大多数的人一辈子只做了三件事;自欺、欺人、被人欺。
56. 心是最大的骗子,别人能骗你一时,而它却会骗你一辈子
57. 只要自觉心安,东西南北都好。如有一人未度,切莫自己逃了。
58. 当你手中抓住一件东西不放时,你只能拥有这件东西,如果你肯放手,你就有机会选择别的。人的心若死执自己的观念,不肯放下,那么他的智慧也只能达到某种程度而已
59. 如果你能够平平安安的渡过一天,那就是一种福气了。多少人在今天已经见不到明天的太阳,多少人在今天已经成了残废,多少人在今天已经失去了自由,多少人在今天已经家破人亡。
60. 你有你的生命观,我有我的生命观,我不干涉你。只要我能,我就感化你。如果不能,那我就认命。
61. 你希望掌握永恒,那你必须控制现在。
62. 恶口永远不要出自于我们的口中,不管他有多坏,有多恶。你愈骂他,你的心就被污染了,你要想,他就是你的善知识。
63. 别人可以违背因果,别人可以害我们,打我们,毁谤我们。可是我们不能因此而憎恨别人,为什么?我们一定要保有一颗完整的本性和一颗清净的心。
64. 如果一个人没有苦难的感受,就不容易对他人给予同情。你要学救苦救难的精神,就得先受苦受难。
65. 世界原本就不是属于你,因此你用不着抛弃,要抛弃的是一切的执著。万物皆为我所用,但非我所属。
66. 虽然我们不能改变周遭的世界,我们就只好改变自己,用慈悲心和智慧心来面对这一切。