CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  ASP.NET

为什么数据库连接关闭后,其返回的sqldatareader也无法读取了呢?

楼主deny_xiao()2006-03-01 08:47:23 在 .NET技术 / ASP.NET 提问

代码如下:  
        Public   Function   get_site(ByVal   power   As   Integer,   ByVal   dic   As   String)   As   SqlDataReader  
                  '得到权限值小于参数POWER,目录名为dic,并且state值为1的页面  
                  Dim   conn   As   SqlConnection  
                  Dim   comm   As   SqlCommand  
                  Dim   dr   As   SqlDataReader  
                  conn   =   New   SqlConnection(SqlHelper.DBconnectionstring)  
                  comm   =   New   SqlCommand("Pr_getsite",   conn)  
                  comm.CommandType   =   CommandType.StoredProcedure  
                  comm.Parameters.Add(New   SqlParameter("@power",   SqlDbType.Int))  
                  comm.Parameters("@power").Value   =   power  
                  comm.Parameters.Add(New   SqlParameter("@dic",   SqlDbType.NVarChar,   50))  
                  comm.Parameters("@dic").Value   =   dic  
                  Try  
                          conn.Open()  
                          dr   =   comm.ExecuteReader  
                          Return   dr  
                  Finally  
                          If   conn.State   =   ConnectionState.Open   Then  
                                  conn.Close()  
                                  conn.Dispose()  
                          End   If  
                  End   Try  
          End   Function  
  如果我不加try.........finally.......end   try   ,其返回的dr就可以正常使用,但是这样无法保证关闭数据库连接,经常使整个程序出现链接池慢的现象,因为获得页面是一个要执行得很多得动作;  
  但是如果加了try.........finally.......end   try   ,返回的dr总是提示阅读器关闭时,read的尝试无效  
  这里该怎么解决呢? 问题点数:100、回复次数:9Top

1 楼napsoft(乡下人)回复于 2006-03-01 08:50:35 得分 10

用SqlDataReader有是对数据库操作并不是很好,见意用SqlAdapter.  
  Top

2 楼wxl_pilot(空军飞行员)回复于 2006-03-01 08:54:00 得分 10

DataReader       和CONN是紧密相关的,当数据库连接关闭后dr自然也关闭了  
  建议你填充DataSet后返回DataTable  
  Top

3 楼napsoft(乡下人)回复于 2006-03-01 08:54:16 得分 10

Public   Function   get_site(ByVal   power   As   Integer,   ByVal   dic   As   String)   As   SqlDataReader  
                  '得到权限值小于参数POWER,目录名为dic,并且state值为1的页面  
                  Dim   conn   As   SqlConnection  
                  Dim   comm   As   SqlCommand  
                  Dim   ds   as   DataSet  
                  Dim   SqlAd   as   new   Sqladapter  
                  conn   =   New   SqlConnection(SqlHelper.DBconnectionstring)  
                  comm   =   New   SqlCommand("Pr_getsite",   conn)  
                  comm.CommandType   =   CommandType.StoredProcedure  
                  comm.Parameters.Add(New   SqlParameter("@power",   SqlDbType.Int))  
                  comm.Parameters("@power").Value   =   power  
                  comm.Parameters.Add(New   SqlParameter("@dic",   SqlDbType.NVarChar,   50))  
                  comm.Parameters("@dic").Value   =   dic  
                  SqlAd.selectcommand   =   comm  
                  Try  
                          conn.Open()  
                          SqlAd.fill(ds)  
                          Return   ds  
                  Finally  
                          If   conn.State   =   ConnectionState.Open   Then  
                                  conn.Close()  
                                  conn.Dispose()  
                          End   If  
                  End   Try  
          End   Function  
  Top

4 楼lidong6(立冬)回复于 2006-03-01 08:56:44 得分 30

comm.ExecuteReader改为:  
  comm.ExecuteReader(CommandBehavior.CloseConnection)Top

5 楼lidong6(立冬)回复于 2006-03-01 08:57:31 得分 30

CommandBehavior.CloseConnection在执行该命令时,如果关闭关联的   DataReader   对象,则关联的   Connection   对象也将关闭。Top

6 楼wxl_pilot(空军飞行员)回复于 2006-03-01 09:03:16 得分 5

方法如下:  
   
    Public   Function   get_site(ByVal   power   As   Integer,   ByVal   dic   As   String)   As   SqlDataReader  
                  '得到权限值小于参数POWER,目录名为dic,并且state值为1的页面  
                  Dim   conn   As   SqlConnection  
                  Dim   comm   As   SqlCommand  
                  Dim   da   As   SqlDataAdapter  
                  Dim   ds   As   DataSet  
   
   
                  conn   =   New   SqlConnection(SqlHelper.DBconnectionstring)  
                  comm   =   New   SqlCommand("Pr_getsite",   conn)  
                  comm.CommandType   =   CommandType.StoredProcedure  
                  comm.Parameters.Add(New   SqlParameter("@power",   SqlDbType.Int))  
                  comm.Parameters("@power").Value   =   power  
                  comm.Parameters.Add(New   SqlParameter("@dic",   SqlDbType.NVarChar,   50))  
                  comm.Parameters("@dic").Value   =   dic  
                  Try  
                          conn.Open()  
                          da.SelectCommand   =   comm  
                          da.FillDataSet(ds,"myTable")  
                          Return   ds.Table["myTable"]     //返回DataTable  
                  Finally  
                          If   conn.State   =   ConnectionState.Open   Then  
                                  conn.Close()  
                                  conn.Dispose()  
                          End   If  
                  End   Try  
          End   Function  
   
   
  Top

7 楼luck0235(风平浪静时人人都能掌舵)回复于 2006-03-01 09:13:43 得分 5

//关闭关联的   DataReader   对象,则关联的   Connection   对象也将关闭  
    Try  
          conn.Open()  
          Return   comm.ExecuteReader(CommandBehavior.CloseConnection);  
      ......Top

8 楼Ivony(授人以鱼不如授人以渔,上海谋生)回复于 2006-03-01 09:18:04 得分 0

像你这种情况,应该控制DataReader的生存期。  
   
  其实很好理解,如果数据库连接关了,当然是不能到数据库中去读取数据了。  
   
  利用SqlCommand.ExecuteReader(   CommandBehavior.CloseConnection   )创建的SqlDataReader在关闭时会将数据库连接一起关闭。  
   
  然后,你可以using这个SqlDataReader或者try...finallyTop

9 楼nosuchtracter(极品拖拉机)回复于 2006-03-01 09:24:56 得分 0

public   string   ProExecNonQuery(string   ProcedureName,ref   string[]   InputArray)  
  {  
  string   strconn=ConfigurationSettings.AppSettings["localhost"];  
  SqlConnection   sqlconn=new   SqlConnection(strconn);  
  SqlCommand   sqlcmd=new   SqlCommand(ProcedureName,sqlconn);  
  sqlcmd.CommandType=CommandType.StoredProcedure;  
  sqlcmd.Connection.Open();  
  SqlCommandBuilder.DeriveParameters(sqlcmd);  
   
  int   Len=0;  
  int   I=0;  
  Len=InputArray.Length;  
   
  for(I=0;I<Len;I++)  
  {  
  try  
  {  
  sqlcmd.Parameters[I].Value=InputArray[I];  
  }  
  catch(Exception   e)  
  {  
   
  }  
  }  
  sqlda=sqlcmd.ExecuteReader();  
  sqlcmd.Connection.Close();  
  return   sqlcmd.Parameters["@strMessage"].Value.ToString();;  
  }Top

相关问题

  • 既然关闭了数据库的连接,为什么SqlDataReader还能读取数据
  • 数据库读取
  • SqlDataReader读取数据库时为什么内存一直在增加?
  • 关于SqlDataReader读取记录,总比数据库中少了一条.
  • 数据库读取问题
  • 数据库读取问题
  • 数据库读取问题
  • 读取数据库中断
  • 读取数据库问题
  • 数据库中的varBinary对应C#中的什么类型?怎样使用SqlDataReader读取它?

关键词

  • 数据库
  • 连接
  • 页面
  • comm
  • dic
  • sqldatareader
  • conn
  • power
  • 关闭
  • 目录名

得分解答快速导航

  • 帖主:deny_xiao
  • napsoft
  • wxl_pilot
  • napsoft
  • lidong6
  • lidong6
  • wxl_pilot
  • luck0235

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo