HOW TO:在 Visual C# .NET 中使用 DataReader 时避免装箱损失 (From MSDN)

本文的发布号曾为 CHS312855
有关本文的 Microsoft Visual Basic .NET 版本,请参见 310348

本文引用下面的 Microsoft .NET 框架类库名称空间:
  • System.Data.OleDb
  • System.Data.SqlClient

本任务的内容

概要

本文介绍在使用 DataReader 对象时,如何使用 Get xxx 方法(如 GetCharGetDouble GetInt32)来避免装箱损失。

返回页首

技术说明

在使用 Item 属性从 DataReader 读取列时,值被装箱然后被取消装箱。如果值被反复装箱和取消装箱,堆会迅速装满并增加垃圾回收的频率。这也会稍微影响性能,因为 Microsoft Visual Studio .NET 会过多地转换和复制数据。

备注:装箱意味着数据以 System.Object 形式复制到堆上。在转换为特定数据类型时,值被取消装箱并复制到堆栈上的变量上或者复制到另一个对象中。

若要避免装箱损失,请使用 Get xxx 方法(如 GetCharGetDoubleGetInt32 等),这些方法将数据以简单数据类型形式而非 System.Object 形式返回。

备注Item 属性是 Visual C# .NET 中 SqlDataReader 类的索引器

返回页首

要求

下面的列表列出了推荐使用的硬件、软件、网络结构以及所需的 Service Pack:
  • Microsoft Windows 2000 Professional、Windows 2000 Server、Windows 2000 Advanced Server 或 Windows NT 4.0 Server
  • Microsoft Visual Studio .NET
本文假定您熟悉下列主题:
  • Visual Studio .NET
  • ADO.NET 基础和语法
返回页首

创建项目和添加代码

  1. 启动 Visual Studio .NET。
  2. 在 Visual C# .NET 中新建一个 Windows 应用程序项目。默认情况下会将 Form1 添加到项目中。
  3. 确保您的项目包含一个对 System.Data 名称空间的引用,如果未包含,请添加一个对此名称空间的引用。
  4. 将一个命令按钮放到 Form1 上。将按钮的 Name 属性更改为 btnTest,将 Text 属性更改为 Test
  5. 针对 SystemSystem.Data System.Data.SqlClient 名称空间使用 using 语句,这样以后就不需要在代码中限定这些名称空间中的声明了。将以下代码添加到 Form1 的"General Declarations"部分中:
    using System;
    using System.Data.OleDb;
    using System.Data.SqlClient;
  6. 将以下代码添加到 btnTest_Click 事件中:
    String myConnString =
    "User ID=myUid;password=myPwd;Initial Catalog=Northwind;Data Source=myServer";
    String mySelectQuery =
    "Select * From Customers";
    SqlConnection con = new SqlConnection(myConnString);
    SqlCommand myCommand = new SqlCommand(mySelectQuery, con);
            
    con.Open();
    SqlDataReader myReader = myCommand.ExecuteReader();
    String str1 = "";
    
    while (myReader.Read())
        {
    //This code uses the GetString method.
    //str1 = str1 + myReader.GetString(0) + ", ";
    //This code uses the Indexer for myReader.
    str1 = str1 + myReader[0] + ", ";
        }
        
    MessageBox.Show(str1);
    
    myReader.Close();
    con.Close();
  7. 根据您的环境相应地修改连接字符串 (myConnString)。
  8. 保存项目。在调试菜单上,单击开始以运行您的项目。
  9. 单击测试。请注意,查询将使用其中的某个方法(GetString Item)来返回数据,消息框将显示此数据。
  10. 若要比较性能方面的区别或者测定代码的运行用时,请使用 QueryPerformanceCounter 函数测定应用程序代码的运行用时。有关 QueryPerformanceCounter 的更多信息,请参阅参考一节。
返回页首

疑难解答

使用 Get xxx 方法的缺点在于访问字段之前必须首先检查是否为 NULL。若要检查是否为 NULL,请使用 IsDBNull 方法。

返回页首

参考

有关 ADO.NET 对象和语法的更多信息,请参阅 Microsoft .NET 框架软件开发工具包 (SDK) 文档或 MSDN Online 中的下列主题:

使用 ADO.NET 访问数据
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconaccessingdatawithadonet.asp

有关在 Visual Basic .NET 中如何使用 QueryPerformanceCounter 来测定代码的运行用时方面的其他信息,请单击下面的文章编号以查看 Microsoft 知识库中的文章:

306979 HOW TO:在 Visual C# .NET 中使用 QueryPerformanceCounter 测定代码的运行用时

返回页首

这篇文章中的信息适用于:

  • Microsoft ADO.NET(随 .NET 框架一起提供)
  • Microsoft Visual C# .NET (2002)
最近更新:2002-8-6 (1.0)
关键字kbDSupport kbGrpDSMDAC kbGrpDSVBDB kbhowto kbHOWTOmaster kbOLEDB kbSqlClient kbSystemData KB312855
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值