相关知识:
- 在很多情况下,可能把数据库的访问封装到一个函数中,通过该函数返回一个DataReader对象给调用者。例如定义函数:SqlDataReader returnDR(),然后再Main函数中调用它。
- 但这里导致了一个问题:在哪里关闭数据库连接?
- 在returnDR()函数中关闭Connection,那么在Main函数中将无法获取每行数据;
- 在Main函数中关闭Connection,但是Main函数无法访问returnDR()函数内部定义的SqlConnection对象;(除非把SqlConnection对象声明为类的成员变量,但这样做又会使类变得复杂)
- 其实,ExecuteReader函数提供了一种重载方式,允许通过参数指定DataReader与Connection对象的关联行为CommandBehavior.CloseConnection:一旦关闭DataReader对象,则与该对象关联的Connection对象也会自动关闭。
示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient; namespace ConsoleApplication2
{
class Program
{
//返回DataReader的函数
static SqlDataReader returnDR()
{
string strConn = @"server=Joe-PC;database=AdventureWorks_WroxSSRS2012;uid=sa;pwd=root";
SqlConnection conn = new SqlConnection(strConn); string strCmd = "SELECT ProductCategoryID,Name FROM Production.ProductCategory";
SqlCommand cmd = new SqlCommand(strCmd, conn); conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); return dr;
} //Main中进行调用
static void Main(string[] args)
{
SqlDataReader dr = returnDR();
while (dr.Read())
{
Console.WriteLine("{0}:{1}", dr["ProductCategoryID"], dr["Name"]);
}
dr.Close();
//ExecuteReader函数提供了一种重载形式
//允许通过参数指定DataReader与Connection对象的关联行为CommandBehavior.CloseConnection:
//一旦关闭DataReader对象,则与该对象关联的Connection对象也自动关闭
}
}
}