MS.Tech - IT人

.NET & 微软企业服务器 & 前沿技术和产品
随笔 - 107, 评论 - 1267, 引用 - 87

导航

关于

所有内容和观点仅代表个人观点,如有问题和建议请发Email给我。

标签

每月存档

最新留言

  • GPFGKa
    GPFGKa
    by GPFGKa(匿名) on 2010/3/3 15:52:30
  • ysuVFl http://dycmkz.com/ <a href="http://sorekh.com/ ">wAkoaf</a> [url=http://inswex.com/]wAkoaf[/url]
    ysuVFl http://dycmkz.com/ &lt;a href=&quot;http://sorekh.com/ &quot;&gt;wAkoaf&l...
    by ysuVFl http://dycmkz.com/ <a href="http://sorekh.com/ &q(匿名) on 2010/2/23 1:07:17
  • sauder ebony
    sauder ebony ash computer armoire &lt;a href=&quot; http://squ1.org/user/5775 &quot;&...
    by sauder ebony(匿名) on 2010/2/21 0:30:07
  • dirtybass
    dirty bass &lt;a href=&quot; http://squ1.org/user/5761 &quot;&gt;brittany murphy nak...
    by dirtybass(匿名) on 2010/2/20 10:00:12
  • clazzz
    doorssasa &lt;a href=&quot; http://squ1.org/user/5759 &quot;&gt;directory of all fre...
    by clazzz(匿名) on 2010/2/20 4:06:58
  • ramasd
    ramasd &lt;a href=&quot; http://squ1.org/user/5757 &quot;&gt;first lesbian sex&l...
    by ramasd(匿名) on 2010/2/19 23:04:01
  • dirtyclok
    dirty clok &lt;a href=&quot; http://squ1.org/user/5755 &quot;&gt;free sex hardcore m...
    by dirtyclok(匿名) on 2010/2/19 18:12:44
  • litesbig
    lites big &lt;a href=&quot; http://squ1.org/user/5743 &quot;&gt;fuck me daddy&lt...
    by litesbig(匿名) on 2010/2/19 13:32:39
  • drotiki
    drotiki &lt;a href=&quot; http://squ1.org/user/5667 &quot;&gt;EROTIK&lt;/a&g...
    by drotiki(匿名) on 2010/2/18 19:19:56
  • manshealths
    mans healths &lt;a href=&quot; http://squ1.org/user/5665 &quot;&gt;FROGSEX&lt;/a...
    by manshealths(匿名) on 2010/2/18 14:08:20

广告

【第1页/共2页,11条】
首页
前页
1

感觉VSTS

经过两天的VSTS培训,一个感觉就是VSTS提供的一系列方案结合在整个项目开发流程中(除了需求分析)确实是比较完美的。先前一直苦于没有足够的内存安装TFS,所以直到这两天才体会到在VS2005之上再配合TFS使用的感觉。

  1. 对个人:Work Item工作项无处不在。从Task到Bug都算是一个Work Item,也就是说开发人员可以把他具体的函数代码、某个测试用例和BUG等都结合到Work Item中,经理、架构师或测试人员也通过Work Item结合到这个流程中,一起完成一个简单的开发流程。当然,这里说的是按微软默认的MSF Agile方案来说这个开发流程的,如果你喜欢RUP、CMM等其他方案,也可以进行自定义。对于MSF Agile,Work Item是其理念的关键。正是通过Work Item,MSF中定义的开发人员、测试员、项目经理和架构师才有了明确的职责定义、顺畅有效的沟通管道、互动且可控的开发流程。
  2. 对团队:项目每个阶段的实时追踪。经理或架构师,甚至开发人员和测试人员本身都可以通过各种列表报表数据(BUG报表、任务工作项报表、各阶段文档报告、代码分析和测试报告等)得到自己所需要的当前项目信息。这点对于把握控制项目进度、适时进行变更和监管、日后的维护等都起到非常好的作用。其中,各种列表报表数据除了可以以Web报表显示外,还可以以Office常用文档格式输出,同时可结合WSS进行文档管理。
  3. 其他:几个细节
    • Source Control(源代码通过它保存在SQLServer2005中)的Check In/Out 策略。通过制定各种策略保证代码库中代码的可编译和质量。
    • 可以通过提供的MSF Agile模版自定义其他开发过程模版。使用Process Template Manager进行导出后,修改相应的文档模版或XML定义数据,然后再导入即可。
    • 工作项列表可导出到Excel文件或Project文档中进行修改。
    • 充分利用Web Test和Load Test对WebApplication模拟各种网络、硬件和软件环境进行测试。

总之,新增的东西太多,每一个环节都足够让人体会上几天。还好有人来提点下,这样对TFS也有了一个总体的概念,不然自己摸索还真难办。第一次碰到安装微软的产品是这样心里没底的,呵呵。

BTW:神舟六号发射成功,庆祝下。

posted on 2005-10-12 23:20:00 by liuhuimiao  评论(10) 阅读(6468)

VS2005中的Project Templates

在前面发表的一篇〈GridView中显示数据库里的图片〉里提到ASP.NET 2.0里提供的几个Starter Kits fot VS2005,于是有人MSN问,几个Starter Kits应用程序均以“.VSI”扩展名的文件提供,这是个什么样的扩展名?为什么我们可以直接安装,并可以把Starter Kits应用程序项目直接嵌入VS2005中的新建项目模版里?

确实是个有趣的问题。VSI,如果我没理解错的话,应该是Visual Studio Installer的缩写。那么,.VSI文件到底如何实现在VS2005里嵌入项目模版的呢?这个要从VS2005提供的“Export Template”说起了。Export Template项在File菜单里。我们动手从一个例子看起吧。

1、新建一个ASP.NET Web Site。并编写你打算作为日后模版项目里固有功能的代码,也可以放置任何文件夹和文件,比如图片等。这个Web Site在后面将成为VS2005里的一个项目模版,类似Starter Kits里的那几个示例。下面是演示项目的一张图片,供一会与利用该模版新建的项目对比,看是否完全一致。

2、保存项目。然后在File菜单中选择“Export Template”,弹出如下对话框。我们选择第一项“Project template”。最下面的模版类型选择“Visual C#”,表示创建的是C#的ASP.NET Web Site模版。当然你可以依照你喜好选择VB.NET。

3、选择下一步Next。进一步设置模版图标、模版名称、说明等。这些基本属性信息将作在VS2005里显示给用户看。

4、按“Finish”结束导出过程。同时如果你选择“自动嵌入Vs2005”,按Finish后,你在新建WebSite项目的窗口里,就可以看到你刚才所创建的项目模版,如下图。如果你选择最下面的“Display an explorer......”还会自动帮你打开输出目录。在选择利用这个WebSite1项目模版创建的项目,将自动包含第一张图里所列的所有文件夹和文件和所有代码等,即完全是第一张图项目的克隆版本。

至此,完成了Starter Kits里最终一样的效果。但是.VSI的疑问还是没有解开。别急,其实我们已经快解开这个VSI疑团了。现在,进一步再看刚才我们导出的项目模版文件WebSite1.zip,默认在C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\My Exported Templates目录下。我们发现刚才导出的文件居然是个.ZIP的压缩文件,于是很自然想到解压缩看下里面有些什么东西。解压缩后发现除了原本项目里所有的文件夹和文件外,还多了一个模版图标__TemplateIcon.ico和一个名为MyTemplate.vstemplate的文件。利用记事本打开MyTemplate.vstemplate,里面内容为一份描述这个项目模版信息的XML数据文档。(文档内容略)。

正是这份XML文档让我有了一个想法,即利用UltraEdit打开StarterKits里的TimeTracker.VSI文件察看内部结构,发现果然是个ZIP压缩包文件。于是将StarterKits里的TimeTracker.vsi改名为TimeTracker.ZIP,顺利对TimeTracker.ZIP进行解压缩。TimerTracker压缩包里除了一个跟我们上面制作过程一样格式的ZIP文件外,还包含了一个TimeTracker.vscontent的文件。再用记事本打开这个vscontent文件,真相大白:

<?xml version="1.0" encoding="utf-8" ?> <VSContent xmlns="http://schemas.microsoft.com/developer/vscontent/2005"> <Content> <FileName>TimeTrackerCS.zip</FileName> <DisplayName>Time Tracker Starter Kit (C#)</DisplayName> <Description>Starter Kit for Web project (General category)</Description> <FileContentType>VSTemplate</FileContentType> <ContentVersion>1.0</ContentVersion> <Attributes> <Attribute name="TemplateType" value="Project"></Attribute> <Attribute name="ProjectType" value="Visual Web Developer"></Attribute> <Attribute name="ProjectSubType" value="CSharp"></Attribute> </Attributes> </Content> </VSContent>

原来.VSI文件内部只有两个文件:一份用于描述文件信息的XML文件和一个利用Export Template导出的ZIP压缩包。

了解了VSI内部结构后,我把TimeTracker.vscontent里的这份XML文件信息更改为描述WebSite1的信息,主要把FileName改为WebSite1.zip,然后顺便把TimeTracker.vscontent也更名为WebSite1.vscontent,然后压缩WebSite1.vscontent和WebSite1.zip文件为一个新的WebSite1.zip(注意只有ZIP压缩文件才被接受),最后把新生成的WebSite1.zip更名为WebSite1.vsi。然后双击WebSite1.vsi,其安装过程和结果完全与StarterKits里的示例一致。至此,VSI疑团告破。

认真想一下这个模版输出功能,确实大有用处。程序员之间可以利用VSI文件进行真正便捷、可配置的代码交流;也可以利用项目模版创建一系列公用的应用程序模版。相信,不久的将来,大部分.NET社区或网站提供的.NET代码示例都会采用类似Starter Kits的做法,也相信大家的代码程序交流将会更加倾向于这种VSI文件之间的交换。

再补充一下:呵呵,发表了以后,再去google查了相关资料。才发现.vsi扩展名文件的安装,其实质是调用C:\Program Files\Common Files\Microsoft Shared\MSEnv目录下的VSContentInstaller.exe进行安装的。所以如果你出现不能直接双击安装.vsi的错误时,可以利用这个命令行文件进行安装。但是我还没有找到可以用来打包生成vsi的工具程序。但根据查阅的资料显示,利用Microsoft.VisualStudio.VSContentInstaller.dll(与VSContentInstaller.exe同目录)里提供的接口似乎可以自己编写程序创建一个vsi打包工具,但尚未经过实际验证,有空再试试。

posted on 2005-08-17 21:00:00 by liuhuimiao  评论(4) 阅读(6456)

101 Samples for Visual Studio 2005

101 Samples里提供的DataAccess示例,也反映了ADO.NET2.0对于数据访问这块的一些变化。DataAccess共包含14个示例,每个示例名称都直截了当说明了该示例的主题。

  • Asynchronous Queries:异步数据库查询。
  • Attaching a database with your application
  • Creating and using User Defined Types with SQL Server 2005
  • DataReader vs. DataSet comparision
  • DataSet and DataTable Enhancements
  • Performing Batch Updates and Data Paging:批量更新和数据分页的性能分析
  • Performing Bulk Updates:批量复制数据的性能分析
  • Reading and Writing Images from a Database:
  • Using Factory Classes:介绍利用System.Data.Common命名空间里的DbProviderFactories类来动态创建数据库连接对象。
  • Using Managed Stored Procedures and User Defined Functions with SQL Server 2005
  • Using Multiple Active Result Sets with SQL Server 2005
  • Using Notifications with SQL Server 2005
  • Using the XML data type with SQL Server 2005
  • XPath and XSLT Transformations Enhancements

首先,对于Asynchronous Queries,在该示例中提供了Polling、CallBack和Wait三种方式来演示异步数据查询功能。但根本的都是得益于ADO.NET 2.0中SqlCommand的BeginExecute...EndExecute...异步功能。比如Polling方式,其数据库连接串为:

Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Databases\Data.mdf;Integrated Security=True;User Instance=True;Asynchronous Processing=true

实现的具体C#代码:

// We use the BeginExecuteReader which returns a IAsyncResult // which can be polled to see if it's complete IAsyncResult myResult = myCommand.BeginExecuteReader(); while (!myResult.IsCompleted) { // do something } // After the result finishes, we can end the reader SqlDataReader myReader = myCommand.EndExecuteReader(myResult);

这个数据库异步查询功能还是比较实用的。接下来的批量更新和批量复制更是日后我们在ADO.NET2.0编程常用的特性了。SqlBulkCopy,即数据批量复制可以让我们很方便地把数据从一个数据源迁移到另外一个数据源去;BatchUpdate则允许我们一次性更新多条数据,从而提高系统性能。下面先看Batch Update代码:

// Batch Update for (int i = 0; i < myNumberofRows; i++) { // For each record inserted, we have to create a new row DataRow newRow = myDataTable.NewRow(); // Give it some value newRow["ID"] = i; newRow["value1"] = i * 10; // Add the new row to the DataSet myDataSet.Tables[0].Rows.Add(newRow); } // After all the new rows have been added to the DataSet, we can update the database. // Since we are inserting, all the rows that have been added, will be updated. myDataAdapter.Update(myDataSet,"SampleData"); // We want to explicitly show that the changes have been accepted to update the database myDataSet.AcceptChanges();

在BatchUpdate后,如需要在批量更新操作结束时进行一些其他操作,比如提示使用者批量更新已经完成,可以写RowUpdatedHandler事件:

myDataAdapter.RowUpdated += new SqlRowUpdatedEventHandler(RowUpdatedHandler);

这个示例比较有趣的还是性能分析这块。对于1000条数据,如果我们每次插入1条的话,平均大约要花1200ms左右;而如果我们每次插入的数据提升到50条的话,平均大约耗时1000ms左右。对于5000条数据,如果我们每次插入1条记录的话,平均耗时大约5500ms左右;而如果换成每次插入50条,则大约4500ms左右,相对每次插入1条的情况提高了近1秒;而如果换成每次插入500条,则耗时约3600ms左右,较前者又提升了一点。可见利用好BatchUpdate是可以提高一定的系统性能的。

而对于SqlBulkCopy批量复制,主要是利用System.Data.SqlClient.SqlBulkCopy类进行相应的处理,如想深入了解可以看示例。

最后,对于需要动态选择后台数据库,动态创建数据库连接对象的人来说,ADO.NET 2.0里提供的Factory Classes是个很好的消息。该功能主要是利用System.Data.Common命名空间里的DbProviderFactories类来动态创建数据库连接对象的。代码示例为:

// Get the connection settings from the configuration file based on the name selected // in the ComboBox ConnectionStringSettings myConnectionSettings = ConfigurationManager.ConnectionStrings[myName]; // Create an instance of the DbProviderFactory by using the Provider name in the config file DbProviderFactory myProvider = DbProviderFactories.GetFactory(myConnectionSettings.ProviderName); // Create the connection from the DbProvider factory, this code does not need to change for // for different providers DbConnection myConnection = myProvider.CreateConnection(); // Get the connection string from the connectionsettings // This gets us the specific provider by which we will connect myConnection.ConnectionString = myConnectionSettings.ConnectionString; // Open the connection myConnection.Open(); // now we can create the DataAdapter and then create a command DbDataAdapter myAdapter = myProvider.CreateDataAdapter(); DbCommand myCommand = myProvider.CreateCommand();

为什么要专门再从101 Samples里搬出这些来说。因为我觉得这样可能会节省大家一点时间,而且有部分人还没有或没接触VS2005。在这里抛砖一下,也让大家一目了然101 Samples里到底有哪些新鲜。相信花自己一点时间,节省大家多点时间,对比起来还是挺划算的。就像纽约时报的一篇文章《Spending Time to Save Time〉,其说的就是如果你要节约时间,那么你必须先花点时间去研究如何节约未来的时间。今天花一个小时,节约未来每天的哪怕一分钟,都是值得的。同理,花自己的一个小时,节约大家几秒钟时间,也是值得的。

posted on 2005-08-16 01:41:00 by liuhuimiao  评论(5) 阅读(6388)

101 Samples for Visual Studio 2005

101 Samples for Visual Studio 2005对于想要快速了解Visual Studio 2005新功能的开发人员来说,是个非常棒的选择!其提供的例子分布于Base Class Library、Data Access、Web Development and Windows Forms四个方面,每个方面内的每个例子都对新增的功能有很好的代表性和表现性。先看看Base Class Library。Base Class Library里一共10个例子,分别为:

  • ACLChange:访问控制的变化
  • Compression:新增的System.IO.Compression命名空间,主要介绍利用GZipStream类进行压缩和解压缩。
  • Console:2.0里的Console新增功能。比如现在可以在Console里设置命令窗口的Title标题、Size大小、Color背景色和字体颜色、Cursor光标等。
  • DriveInfo:驱动器信息。
  • FTP:现在System.Net命名空间里新增了FtpWebRequest类,用来进行FTP的相关操作。
  • GenericsSample:.NET2.0范型的示例。这个例子不错。主要演示了利用范型和普通集合类在类型安全操作和迭代时所花的时间的比较。
  • Network:网络相关。主要是新增命名空间System.Net.NetworkInformation的一些类的用法。
  • RegularExpressions:正则表达式,更强大了。
  • Stopwatch:这个演示的功能实用。主要介绍了System.Diagnostics里的Stopwatch类,该类主要用来计算某个代码段执行所花费的时间。省去了我们自己去设置开始执行时间和结束时间,然后相减得出最终代码执行所花费时间的过程。这点对程序员来说是比较实用的。
  • Transactions:主要是新增的命名空间System.Transactions的介绍。

对于GenericsSample这个示例,它事先声明了两个变量:

private ArrayList _unsafeList; private List<Order> _safeList;

然后从一个CheckListBox源中读出 object 类型项值,填入上面两个集合中。这时候,对于 ArrayList 类型的 _unsafeList 来说,自然不需要其他额外操作,直接插入CheckListBox读出的项值即可。而对于 List<Order> 类型的 _safeList 来说,自然必须指定为类参数为 Order 方可插入,于是就发生了casting操作,把 object 类型 cast 为 Order 类型,但是这却保证了类型安全。也就是第一个演示的目的。

对于测试二者性能的第二个演示,实质就是让二者各自迭代十万次,然后利用Stopwatch去计算出二者各自花费的时间,从而做出比较。这段代码是这样的:

private void IterateSafeList(List<Order> list) { // No casting needed foreach (Order _order in list) { long _amount = _order.Amount; DateTime _orderDate = _order.Date; int orderID = _order.ID; } } private void IterateUnsafeList(ArrayList list) { // have to cast from object to order foreach (Object _object in list) { Order _order = _object as Order; if (_order != null) { long _amount = _order.Amount; DateTime _orderDate = _order.Date; int orderID = _order.ID; } } }

 然后进行十万次迭代和计算花费时间:

            List<Order> newSafeList = new List<Order>(); ArrayList newUnsafeList = new ArrayList(); Stopwatch stopWatch = new Stopwatch(); long loadSafeListMs; long loadUnsafeMs; long iterateSafeListMs; long iterateUnsafeListMs; stopWatch.Start(); for (int i = 1; i < 100000; i++) { Order newOrder = new Order(i, DateTime.Now, i + 100); newSafeList.Add(newOrder); } stopWatch.Stop(); loadSafeListMs = stopWatch.ElapsedMilliseconds; stopWatch.Reset(); stopWatch.Start(); for (int i = 1; i < 100000; i++) { Order newOrder = new Order(i, DateTime.Now, i + 100); newUnsafeList.Add(newOrder); } stopWatch.Stop(); loadUnsafeMs = stopWatch.ElapsedMilliseconds; stopWatch.Reset(); stopWatch.Start(); IterateSafeList(newSafeList); stopWatch.Stop(); iterateSafeListMs = stopWatch.ElapsedMilliseconds; stopWatch.Reset(); stopWatch.Start(); IterateUnsafeList(newUnsafeList); stopWatch.Stop(); iterateUnsafeListMs = stopWatch.ElapsedMilliseconds; stopWatch.Reset();

经过运行得出,LoadSafeList比LoadUnsafeList花费时间多。而对于IterateSafeList和IterateUnsafeList,二者几乎差不多,一般前者比后者快那么点,但并不太明显。为什么会这样?留着大伙自己去理解了。

总体来说,101Samples赞,赶紧去down个下来看看。

posted on 2005-08-15 01:00:00 by liuhuimiao  评论(1) 阅读(5342)

GridView中显示数据库里的图片

很多人开始有这个疑问,GridView控件中的ImageField没有DataField属性,那么如何才能绑定到SQL Server中的Image Field?自从DynamicImage控件从beta2中消失后,这就成了个问题。但是,ASP.NET2.0随之也给我们带来了另外一种解决方案,那就是方便地利用HttpHandler(.ashx)动态显示数据库中的图片,这点在VS2005中提供了PersonalWebSite等模版中已经给出方案:通过ashx动态获取数据库中的某条图片数据,然后在GridView等控件的自定义模版中安置一个Image控件,并设置Image控件的ImageUrl属性为类似 XXX.ashx?photoId=1 即可显示图片。

下面为Handler.ashx的代码:

<%@ WebHandler Language="C#" Class="Handler" %> using System; using System.Data; using System.Data.SqlClient; using System.IO; using System.Web; using System.Configuration; public class Handler : IHttpHandler { public bool IsReusable { get { return true; } } public void ProcessRequest(HttpContext context) { // Set up the response settings context.Response.ContentType = "image/jpeg"; context.Response.Cache.SetCacheability(HttpCacheability.Public); context.Response.BufferOutput = false; int photoId = -1; Stream stream = null; if (context.Request.QueryString["PhotoID"] != null && context.Request.QueryString["PhotoID"] != "") { photoId = Convert.ToInt32(context.Request.QueryString["PhotoID"]); stream = GetPhoto(photoId); } const int buffersize = 1024 * 16; byte[] buffer = new byte[buffersize]; int count = stream.Read(buffer, 0, buffersize); while (count > 0) { context.Response.OutputStream.Write(buffer, 0, count); count = stream.Read(buffer, 0, buffersize); } } public Stream GetPhoto(int photoId) { SqlConnection myConnection = new SqlConnection( ConfigurationManager.ConnectionStrings["Personal"].ConnectionString); SqlCommand myCommand = new SqlCommand ("SELECT [BytesOriginal] FROM [Photos] WHERE [PhotoID]=@PhotoID", myConnection); myCommand.CommandType = CommandType.Text; myCommand.Parameters.Add(new SqlParameter("@PhotoID", photoId)); myConnection.Open(); object result = myCommand.ExecuteScalar(); try { return new MemoryStream((byte[])result); } catch (ArgumentNullException e) { return null; } finally { myConnection.Close(); } } }

然后在GridView中自定义模版列:

<asp:TemplateField> <ItemTemplate> <asp:Image ID="Image1" runat="server" ImageUrl='<%# "Handler.ashx?PhotoID=" + Eval("PhotoID") %>' /> </ItemTemplate> </asp:TemplateField>

这样即可在GridView中动态显示数据库中image类型图片数据了。其实VS2005自带的Stater Kit很有用的,另外,还有其他几个Club Web Site Starter Kit等,都可以在asp.net上载过来看看。

posted on 2005-06-03 20:01:00 by liuhuimiao  评论(27) 阅读(17882)

aspnet2.0新控件、MCE

      比较长时间没有更新了,主要最近换了个工作,来到了上海。现在已经在上海安定下来了。所以以后争取经常更新,要是上海有什么聚会也通知通知我下。时值Visual Studio2005 beta2发布,同时相对于ASP.NET 1.x来说,2.0确实也有不小的变化。所以打算先把所有新增加的控件写写(先写了两个),属于入门级的文章,同时也给自己温故一下ASP.NET。毕竟之前在福州做项目偏重管理,有段时间疏忽了编程技术了,现在来上海再次重回技术路线,是该好好温习温习

      前阵子有机会接触了MCE2005,利用其SDK做了一个符合TV客户端浏览规格的Web应用,部署后在实际TV里浏览,用遥控器操作界面,感觉还不错。其中发生了“愚蠢”的小插曲让我郁闷了一个下午,就是在部署浏览时,我将Application Url 写成了 ".\Default.aspx",由于是用ASP.NET做的,导致浏览失败,后来才发现要写成 http://192.168.1.1/Default.aspx 方可。

      不知道日后随着网络电视的推广,微软会不会做一个类似Mobile Web服务器控件的TV Web服务器控件呢?先期盼着。

posted on 2005-05-15 20:18:00 by liuhuimiao  评论(17) 阅读(7775)

ADO.NET 2.0中的SqlCommand.ExecutePageReader

        在.NET 2.0 PDC或Beta1中,可以看到SqlCommand对象新增了个ExecutePageReader方法,该方法实现了分页读取数据的功能。对于分页读取数据,在ADO.NET1.1中(当然2.0也适合)一般常用动态构造SQL语句实现:

    SqlDataReader GetPage(int pageNumber, int pageSize)
    {
       
//pageNumber: 从 0 开始计数的页码
       
//pageSize: 每页的记录数
        String command = String.Format("SELECT * FROM (SELECT TOP {0} * FROM " +
          
"Products ORDER BY ProductID) AS t1 WHERE ProductID NOT IN " +
          
"(SELECT TOP {1} ProductID FROM Products ORDER BY ProductID) ",
           pageSize
* (pageNumber + 1), pageSize * pageNumber);

        SqlConnection conn
= new SqlConnection("server=.;database=Northwind;Trusted_Connection=yes");
        SqlCommand cmd
= new SqlCommand(command, conn);
        conn.Open();
        SqlDataReader dr
= cmd.ExecuteReader(CommandBehavior.CloseConnection);
       
return dr;
    }

        有时为更好实现分页性能效果,也可以采用存储过程建立临时表的方式进行数据分页,但原理基本都差不多。在ADO.NET 2.0 PDC/Beta1中,用SqlCommand.ExecutePageReader进行数据分页:

    SqlDataReader GetPageReader(int pageNumber, int pageSize)
    {
       
int startIndex = (pageNumber - 1) * pageSize;
        String command
= "SELECT * FROM Products";
        SqlConnection conn
= new SqlConnection("server=.;database=Northwind;Trusted_Connection=yes");
        SqlCommand cmd
= new SqlCommand(command, conn);
        conn.Open();
        SqlDataReader dr
= cmd.ExecutePageReader(CommandBehavior.CloseConnection, startIndex, pageSize);

       
return dr;
    }

        最后绑定第2页的5行数据(ProductID从6到10)到GridView1上:

        GridView1.DataSource = GetPage(1, 5);
        GridView1.DataBind();

        从上可以看到,用了ExecutePageReader确实简单了很多。但是,很“不幸”告诉大家,ExecutePageReader在未来版本中将不会出现,也就是说被cut掉了。至于cut的真正原因,还真不知道。不过,我试图用Reflector去看其内部,发现这样一个调用顺序:ExecutePageReader()—》SqlResultSet.CompleteOpenForPageReader()—》SqlResultSet.FetchInternal()—》执行存储过程sp_cursorfetch,也就是实际ExecutePageReader使用了SQLServer的服务器游标进行数据分页读取,但这跟它被cut是否有关?这么好用的一个功能被cut是不是有其他考虑?或许ADO.NET开发小组在鱼和熊掌取舍之间已经做了抉择,只是我还是觉得ExecutePageReader(据说SqlResultSet也被cut,然后连同ExecutePageReader被cut)被cut很可惜。:'(

posted on 2004-09-11 16:45:00 by liuhuimiao  评论(12) 阅读(5578)

ASP.NET 2.0 Beta2 中特殊文件夹名称的改变

       微软的Web平台开发组最近发布了一个新消息,据称在Visual Studio 2005 Beta2中,ASP.NET2.0中的一些特殊文件夹的名称将有所改变。

       ASP.NET 2.0 (Beta2)中最新的特殊文件夹的名称改变如下:

  • /Bin 改变为 /Application_Assemblies
  • /Code 改变为 /Application_Code
  • /Resources 改变为 /Application_Resources
  • /WebReferences 改变为 /Application_WebReferences
  • /Data 改变为 /Application_Data
  • /Browsers 改变为 /Application_Browsers
  • /Resources 改变为 /Application_GlobalResources
  • /LocalResources 改变为 /Application_LocalResources
  • /Themes 改变为 /Application_Themes

       上面这些改变还没加入目前最新版本的Beta1 Refresh中,只有在未来的Beta 2中才被实现。

    [来源:http://weblogs.asp.net/ksharkey/archive/2004/09/01/224333.aspx]

posted on 2004-09-10 02:50:00 by liuhuimiao  评论(17) 阅读(5072)

2.0中获取数据库连接统计数据

        .NET 2.0中的SqlConnection多了一个StatisticsEnabled属性和ResetStatistics()、RetrieveStatistics()两个方法,用于获取SQLServer的连接统计数据。当然,这样做是以性能损耗为代价的,但作为监控数据库状态的一种快捷实用手段未尝不可。

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ page language="C#" %>
<script runat="server">
   
void Page_Load(object sender, EventArgs e)
    {
        string connString
= "Northwind的连接串";
        SqlConnection conn
= new SqlConnection(connString);
        conn.StatisticsEnabled
= true;
        conn.ResetStatistics();
        conn.Open();
        SqlCommand cmd
= new SqlCommand("SELECT * FROM Orders", conn);
        SqlDataReader reader
= cmd.ExecuteReader();
        reader.Close();
        conn.Close();

        Hashtable ht
= (Hashtable)conn.RetrieveStatistics();
        foreach (string key
in ht.Keys)
        {
            Label1.Text
+= "Key: " + key + " = " + ht[key] + "<BR />";
        }
    }
</script>
<html>
<head id="Head1" runat="server">
   
<title>Untitled Page</title>
</head>
<body>
   
<form id="Form1" runat="server" autocomplete="on">
       
<asp:Label ID="Label1" Runat="server" Text=""></asp:Label>
   
</form>
</body>
</html>

<%@ Import Namespace="System.Data" %>

运行后的结果就是SQLServer连接统计数据结果:

Key: NetworkServerTime = 0
Key: BytesReceived = 156913
Key: UnpreparedExecs = 1
Key: SumResultSets = 1
Key: SelectCount = 1
Key: PreparedExecs = 0
Key: ConnectionTime = 30
Key: ExecutionTime = 30
Key: Prepares = 0
Key: BuffersSent = 1
Key: SelectRows = 830
Key: ServerRoundtrips = 1
Key: CursorOpens = 0
Key: Transactions = 0
Key: BytesSent = 48
Key: BuffersReceived = 20
Key: IduRows = 0
Key: IduCount = 0

posted on 2004-09-10 02:28:00 by liuhuimiao  评论(7) 阅读(3047)

ASP.NET 2.0页面框架的几处变化

  1. 新增的页面事件
    在ASP.NET 2.0中,一个ASP.NET页面的生命周期主要为(红色字体表示ASP.NET 2.0新增加的阶段页面事件):客户端请求页面—》预初始化(OnPreInit)—》初始化(OnInit)—》完成初始化(OnInitComplete)—》载入ViewState(LoadViewState)—》处理回送数据(IPostBackDataHandler)—》Page_OnPreLoad—》Page_OnLoad—》回发更改通知(RaisePostDataChangedEvent)—》处理回发事件(RaisePostBackEvent)—》Page_OnLoadComplete—》预呈现(OnPreRender)—》完成预呈现(OnPreRenderComplete)—》保存ControlState(SaveControlState)—》保存ViewState(SaveViewState)—》呈现(Render)—》Page_UnLoad。
    • OnPreInit:在初始化页面OnInit事件前触发。在这个阶段里,可以进行定义站点主题(Theme)或加载站点个性化所需要的数据信息等操作。
    • OnInitComplete:完成初始化页面OnInit事件后触发。
    • OnPreLoad:在加载页面OnLoad事件前触发。
    • OnLoadComplete:完成页面加载OnLoad事件后触发。
    • OnPreRenderComplete:在完成预呈现OnPreRender事件后触发。这是完成页面呈现的最后一道关卡,在此之后,页面将无法再进行任何呈现上的改动。
    • SaveControlState:保存控件状态ControlState。ControlState是ASP.NET2.0控件新增的一个属性,类似ViewState作用,但它们区别在于ControlState用于保存更加重要的控件状态信息,以保证在禁用ViewState的情况下还可以对控件状态进行读写操作。
  2. 增加对页面Header的控制:
    System.Web.UI.Page类新增加了Header属性,用于对HTML页面头区域里数据的操作。通过对Header属性的跟踪,可以发现,Header属性保存着一个实现IPageHeader接口的对象(该对象有LinkedStyleSheets、Metadata、StyleSheet和Title四个属性),实际上正是通过这个对象实现对HTML页面头区域里数据的操作的。例如:
    <script runat="server">
    void Page_Load(object sender, System.EventArgs e)
    {
       
    this.Header.Metadata.Add("author", "brooks");
    }
    </script>
    其运行结果为:
    <html>
    <head> <title>Untitled Page</title>
       
    <meta name="author" content="brooks" />
    </head>
  3. 定义表单中的默认按钮:
    在ASP.NET1.0中,我就为了设置表单中的默认按钮而一筹莫展。幸好ASP.NET2.0把这个功能补上了,现在可以非常方便的设置表单中的默认按钮了。
    <%@ page language="C#" %>
    <script runat="server">
    void Button1_Click(object sender, System.EventArgs e)
    {
       
    this.LB_Message.Text = "You clicked button1";
    }
    </script>
    <html>
    <head runat="server">
       
    <title>Untitled Page</title>
    </head>
    <body>
       
    <form runat="server" defaultbutton="Button1">
           
    <asp:textbox id="Textbox1" runat="server"></asp:textbox>
           
    <asp:button id="Button1" runat="server" text="Button" onclick="Button1_Click" />
           
    <asp:label id="LB_Message" runat="server"></asp:label>
       
    </form>
    </body>
    </html>
  4. 设置焦点
    现在假设为TextBox1控件设置焦点,在ASP.NET 2.0中可以这样实现:
    this.Textbox1.Focus();  this.SetFocus(this.Textbox1); 即可为TextBox1控件设置焦点。
    如果打算也为表单设置个默认焦点控件,让光标默认停留在TextBox1上:
    <form runat="server" defaultfocus="TextBox1">
  5. 跨页面数据发送
    如果你需要多个页面发送数据到同一个表单程序进行处理,或者数据在多个页面之间传输处理的话,你就可以使用ASP.NET 2.0这个新特性。例如,我打算把Default.aspx页里TextBox1里的文本数据发送到Default2.aspx页面进行处理:
    Default.aspx页:
    <%@ Page Language="C#" %>
    <script runat="server">
       
    void Button2_Click(object sender, EventArgs e)
        {
            Label1.Text
    = "Hi," + TextBox1.Text + ". This is Default.aspx";
        }
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
       
    <title>Untitled Page</title>
    </head>
    <body>
       
    <form id="form1" runat="server">
           
    <asp:TextBox ID="TextBox1" Runat="server"></asp:TextBox>
           
    <asp:Button ID="Button1" Runat="server" Text="PostToAnotherPage" PostBackUrl="~/Default2.aspx" />
           
    <asp:Button ID="Button2" Runat="server" Text="PostToSelf" OnClick="Button2_Click" />
           
    <br />
           
    <asp:Label ID="Label1" Runat="server" Text="Label"></asp:Label>
       
    </form>
    </body>
    </html>
    Default2.aspx页:
    <%@ Page Language="C#" %>
    <script runat="server">
       
    void Page_Load(object sender, System.EventArgs e)
        {
            TextBox textBox1
    = (TextBox)PreviousPage.FindControl("TextBox1");
           
    this.Label1.Text = "Hi," + textBox1.Text + ". This is Default2.aspx!";
        }
    </script>
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
       
    <title>Untitled Page</title>
    </head>
    <body>
       
    <form id="form1" runat="server">
       
    <asp:label id="Label1" runat="server"></asp:label>
       
    </form>
    </body>
    </html>

posted on 2004-09-09 02:53:00 by liuhuimiao  评论(29) 阅读(10050)

【第1页/共2页,11条】
首页
前页
1

Powered by: Joycode.MVC引擎 0.5.2.0