关于这里的数据库连接是否应该关闭的问题?

_-_-_-_- 2006-01-20 01:20:03
public class User
{
public SqlDataReader GetSingleUser(int nUserID){
SqlConnection myConnection = new SqlConnection(SQLHelper.DBCONNECTIONSTRING);
SqlCommand myCommand = new SqlCommand("Pr_GetSingleUser",myConnection);
//省略部分的存储过程.....
SqlDataReader dr = null;
myConnection.Open();
dr = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
}
}

写了一个大概是上面这样的类...GetSingleUser的方法是没有错了的..的确可以得到dr...而且dr也没有任何读取上的错误...
我的问题在于...当我读取完数据了之后....
那个myConnection 是否还需要理会???还需要再关闭这个连接吗???

例如
User myUser=new User();
SqlDataReader mySqlDataReader=myUser.GetSingleUser(1);
//做相应的处理...
mySqlDataReader.close();

这样之后..上面User类的 那个myConnection是否已经关闭了???是因为声名周期的问题????当使用完GetSingleUser这个方法之后myConnection也自动消亡了吧???

以上纯属个人理解..不知道是否正确...请指教.
...全文
217 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
_-_-_-_- 2006-01-20
  • 打赏
  • 举报
回复
好的.谢谢咯.
Eddie005 2006-01-20
  • 打赏
  • 举报
回复
public MyUser GetSingleUser(int nUserID){
SqlConnection myConnection = new SqlConnection(SQLHelper.DBCONNECTIONSTRING);
SqlCommand myCommand = new SqlCommand("Pr_GetSingleUser",myConnection);
//省略部分的存储过程.....
SqlDataReader dr = null;
MyUser tmp = new MyUser();//实体类初始
myConnection.Open();
dr = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
if(dr.Read())
{
tmp.ID = dr[0].ToString();
tmp.Name = dr[1].ToString();
//......... 填充实体类
}
dr.Close();//上面忘了这句了
return tmp;
}
Eddie005 2006-01-20
  • 打赏
  • 举报
回复
public SqlDataReader GetSingleUser(int nUserID){
....
return dr;
}

这个方法的设计个人认为很不好,我从来都不会把DataReader作为返回值,虽然在外部SqlDataReader mySqlDataReader=myUser.GetSingleUser(1);
mySqlDataReader.close();执行这句之后连接会自动关闭和释放,但是能保证你或者别人编码的时候一定不会忘了这句代码吗?
所以,较为合适的做法是定义一个MyUser实体类;
public MyUser GetSingleUser(int nUserID){
SqlConnection myConnection = new SqlConnection(SQLHelper.DBCONNECTIONSTRING);
SqlCommand myCommand = new SqlCommand("Pr_GetSingleUser",myConnection);
//省略部分的存储过程.....
SqlDataReader dr = null;
MyUser tmp = new MyUser();//实体类初始
myConnection.Open();
dr = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
if(dr.Read())
{
tmp.ID = dr[0].ToString();
tmp.Name = dr[1].ToString();
//......... 填充实体类
}
return tmp;
}
jxf_yx 2006-01-20
  • 打赏
  • 举报
回复
个人认为,为了数据库效率,

User myUser=new User();
SqlDataReader mySqlDataReader=myUser.GetSingleUser(1);
//做相应的处理...
mySqlDataReader.close(); //可以不要这句。
wangehuai 2006-01-20
  • 打赏
  • 举报
回复
高手开讲,低手学习!
_-_-_-_- 2006-01-20
  • 打赏
  • 举报
回复
datareader就是如此设计的
Sunmast这样说的话..那么不就是别人说了算?呵呵

找个软件来测试一下先啦..

最后发个疑问 我上面那个类..写了这样的方法....这样的代码很奇怪吗??
_-_-_-_- 2006-01-20
  • 打赏
  • 举报
回复
"思歸的意思是說DataReader.Close已經隱性的調用了Conn.Close(),但是我記得那是DataSet才是 我相信是思歸記錯了"

朋友给的一个回复.我们几个人正在一起讨论这个问题.呵呵
速马 2006-01-20
  • 打赏
  • 举报
回复
>>> 如果要弄明白这个问题.我应该从哪里入手
你可以用ildsam或者reflector.net反编译datareader类,里面有关闭连接的代码
速马 2006-01-20
  • 打赏
  • 举报
回复
>>> 因为我只是使用了mySqlDataReader.close();怎么myConnection却又关闭了??
因为你用了CommandBehavior.CloseConnection参数

datareader就是如此设计的
_-_-_-_- 2006-01-20
  • 打赏
  • 举报
回复
不好意思..刚才没有刷新页面就自己写了回复..
先谢谢思归.

思归的解释里面第二个我可以理解.
但是第一个我却不明白了.因为我只是使用了mySqlDataReader.close();
怎么myConnection却又关闭了??
如果要弄明白这个问题.我应该从哪里入手.

应该说凭什么证明myConnection关闭了??我不想只是知其言而不知其所以然哦.
请思归继续指教.谢谢.
_-_-_-_- 2006-01-20
  • 打赏
  • 举报
回复
虽然我自己觉得这样写是对的...但是好像又说不过去...如果myConnection是自动消亡了..那么返回的SqlDataReader还可以用吗??
一般都是先关了SqlDataReader再关数据库的连接的....这样不就是反过来了吗??
saucer 2006-01-20
  • 打赏
  • 举报
回复
>>那个myConnection是否已经关闭了???

yes, becuase you used CommandBehavior.CloseConnection in ExecuteReader

>>当使用完GetSingleUser这个方法之后myConnection也自动消亡了吧???

no, the connection is returned to the pool only after you call mySqlDataReader.close()

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧