ADO.NET笔记——将DataReader作为函数返回值

相关知识:

  1. 在很多情况下,可能把数据库的访问封装到一个函数中,通过该函数返回一个DataReader对象给调用者。例如定义函数:SqlDataReader returnDR(),然后再Main函数中调用它。
  2. 但这里导致了一个问题:在哪里关闭数据库连接?
    • 在returnDR()函数中关闭Connection,那么在Main函数中将无法获取每行数据;
    • 在Main函数中关闭Connection,但是Main函数无法访问returnDR()函数内部定义的SqlConnection对象;(除非把SqlConnection对象声明为类的成员变量,但这样做又会使类变得复杂)
  3. 其实,ExecuteReader函数提供了一种重载方式,允许通过参数指定DataReader与Connection对象的关联行为CommandBehavior.CloseConnection:一旦关闭DataReader对象,则与该对象关联的Connection对象也会自动关闭。

 

示例代码:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Data;
 7 using System.Data.SqlClient;
 8 
 9 namespace ConsoleApplication2
10 {
11     class Program
12     {
13         //返回DataReader的函数
14         static SqlDataReader returnDR()
15         {
16             string strConn = @"server=Joe-PC;database=AdventureWorks_WroxSSRS2012;uid=sa;pwd=root";
17             SqlConnection conn = new SqlConnection(strConn);
18 
19             string strCmd = "SELECT ProductCategoryID,Name FROM Production.ProductCategory";
20             SqlCommand cmd = new SqlCommand(strCmd, conn);
21 
22             conn.Open();
23 
24             SqlDataReader dr = cmd.ExecuteReader();
25 
26             return dr;
27         }
28 
29         //Main中进行调用
30         static void Main(string[] args)
31         {
32             SqlDataReader dr = returnDR();
33             while (dr.Read())
34             {
35                 Console.WriteLine("{0}:{1}", dr["ProductCategoryID"], dr["Name"]);
36             }
37             dr.Close();
38             //ExecuteReader函数提供了一种重载形式
39             //允许通过参数指定DataReader与Connection对象的关联行为CommandBehavior.CloseConnection:
40             //一旦关闭DataReader对象,则与该对象关联的Connection对象也自动关闭
41         }
42     }
43 }

posted @ 2015-03-15 16:50  .Joe.Chen  阅读(1707)  评论(1编辑  收藏  举报