相关知识:
- 在很多情况下,可能把数据库的访问封装到一个函数中,通过该函数返回一个DataReader对象给调用者。例如定义函数:SqlDataReader returnDR(),然后再Main函数中调用它。
- 但这里导致了一个问题:在哪里关闭数据库连接?
- 在returnDR()函数中关闭Connection,那么在Main函数中将无法获取每行数据;
- 在Main函数中关闭Connection,但是Main函数无法访问returnDR()函数内部定义的SqlConnection对象;(除非把SqlConnection对象声明为类的成员变量,但这样做又会使类变得复杂)
- 其实,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 }