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 }

转载于:https://www.cnblogs.com/chenguangqiao/p/4340021.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值