同意你的观点,应该有问题:
SqlDataReader Result=myComm.ExecuteReader();

SqlDataReader Result=myComm.ExecuteReader(CommandBehavior.CloseConnection);

解决方案 »

  1.   

    我吃过这方面的亏了,那是错误的,在Access里面就直接报错误了!
    在sqlserver暂时是没问题!但连接池会满;to: CMIC(大象) 
    SqlDataReader Result=myComm.ExecuteReader(CommandBehavior.CloseConnection);
    这样能得到返回的结果吗?return Result;
    好象是得不到返回结果的,所以我认为写书的用法和前提就是错误的;
      

  2.   

    偶刚开始看这书,不过是VB版本,谁有C#的电子班,给我发一分,谢了
    [email protected]
      

  3.   

    他返回的是SqlDataReader 要是在这儿关连接,你在外面就不能读数据了,
    按照连接池的说法,当你关闭SqlDataReader 时,连接会怎么返回连接池.
      

  4.   

    SqlDataReader 是一种连线式的数据,其实只是个前向指针,用完后才能关闭数据库库连接。
    这点和DataSet不同的。但是用完后确实要关闭,否则导致连接池资源耗尽!
      

  5.   

    SqlDataReader Result=myComm.ExecuteReader(CommandBehavior.CloseConnection);
    这样能得到返回的结果吗?return Result;
    好象是得不到返回结果的,所以我认为写书的用法和前提就是错误的;
    ===========================================这样子可以得到数据集的,它执行完 ExecuteReader 就会自动关闭数据库连接你可以下载个IbuySpy 网上商店看看
      

  6.   

    Products.cs 那样写我认为没什么问题。
    但ProductList.aspx的写法有问题,用完之后没有
    Close.
      

  7.   

    command+reader肯定要显式关闭连接
    adapter+dataset就不用
    myComm.ExecuteReader(CommandBehavior.CloseConnection)这个方法应该是对的
      

  8.   


        我也遇到这样的问题,虽然myComm.ExecuteReader(CommandBehavior.CloseConnection)这个方法应该是对的,我也的确是这样写的,但是大概一次同时执行30个左右的SqlDataReader,连续2,3次Sql Server就死了,靠,我那个项目蛮重要的,很烦这件事,到现在我还没有时间去改过来,只好希望别人少执行点查询,查询时动作慢一点,呵呵。
        我的想法是用SqlDataAdapter,DataSet来解决这个问题,不过没有测试,不知道大家有什么意见!
      

  9.   

    高手一般是怎么做呢?按北狼的说法SqlDataReader 是一种连线式的数据,用完后必须关掉。那么SqlDataAdapter是什么样的数据呢,不需要显式的关掉吗,如果不关掉,会怎么样?
    如果用DataSet来传递数据,它是什么样的数据,会不会占用很到的内存?
      

  10.   

    SqlDataAdapter,运行时自动管理连接的打开和关闭!不用用户操心!
      

  11.   

    但是大概一次同时执行30个左右的SqlDataReader,连续2,3次Sql Server就死了--〉〉应该是你的sqlserver 用户授权数不够!即同时访问数据库的用户数!可以购买更多的授权!
      

  12.   

    SqlDataReader Result=myComm.ExecuteReader(CommandBehavior.CloseConnection);
    return Result;
    =======================================
    这个方法是完全可以的,只要在调用完后,在加一句  Result.Close();
    就可以了但问题是:Result 中的内容常常会少取一条数据纪录(Result.Read() 就自动跳到下一条记录处了)    至今未能解决,也不明其原因
      

  13.   

    我同意你的观点。在开发Web程序凡是涉及到数据库访问,我都尽量使用存储过程。在方法中调用SqlAdapter,在返回前手动关闭数据库连接。我给你一个例子参考,希望对你有所帮助。
    public void AddNewsLevelRecord(int newsid, string levelUserName)
    {
    SqlConnection myConection = new SqlConnection(strConn);
    SqlCommand newsLevelCommand = new SqlCommand("InsertNewsLevelRecord",myConection);
    newsLevelCommand.CommandType = CommandType.StoredProcedure; newsLevelCommand.Parameters.Add(new SqlParameter("@NewsID",SqlDbType.Int,4));
    newsLevelCommand.Parameters["@NewsID"].Value = newsid;

    newsLevelCommand.Parameters.Add(new SqlParameter("@LevelUserName",SqlDbType.VarChar,2000));
    newsLevelCommand.Parameters["@LevelUserName"].Value = levelUserName; try
    {
    myConection.Open() ;
    newsLevelCommand.ExecuteNonQuery() ;
     
    }
    catch(System.Data.SqlClient.SqlException er)
    {
    throw new  Exception(er.Message);
    }
    finally
    {
    newsLevelCommand.Dispose() ;
    myConection.Close() ;
    }
    }
      

  14.   

    PetShop中的一个方法
    public void RunProc(string procName, out SqlDataReader dataReader) 
    {
    SqlCommand cmd = CreateCommand(procName, null);
    dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
    }
      

  15.   

    谢谢 zhn0410(海鸥) 
     我也希望尽量用存储过程,但是数据库要移动的话,这不是很麻烦吗?
      

  16.   

    今天在查msdn的时候,看到以下说明,开始总觉得它说的不对,我个人认为至少Connection 应该不用的时候就关闭。后来细想想,其实也对,关闭不用的链接,和不要对连接、DataReader 或类的 Finalize 方法中的任何其他托管对象调用 Close 或 Dispose。并不矛盾。链接的Close方法其实是释放链接中用到的非托管对象。至于其中的托管对象,你可以不用管他。另外,连接的关闭方法可以多次调用,都不会引发异常。msdn英文版中的说明:CAUTION   Do not call Close or Dispose on a Connection, a DataReader, or any other managed object in the Finalize method of your class. In a finalizer, you should only release unmanaged resources that your class owns directly. If your class does not own any unmanaged resources, do not include a Finalize method in your class definition. For more information, see Programming for Garbage Collection.
      

  17.   

    public class CoType:IDisposable
    {
          private SqlDataAdapter dsCommand; private SqlCommand selectCommand;
    public void Dispose()
    {
    Dispose(true);
    GC.SuppressFinalize(true); 
    } protected virtual void Dispose(bool disposing)
    {
    if (! disposing)
    return;  if (dsCommand != null )
    {
    if (dsCommand.SelectCommand != null)
    {
    if( dsCommand.SelectCommand.Connection != null)
    dsCommand.SelectCommand.Connection.Dispose();
    dsCommand.SelectCommand.Dispose();
    }
    dsCommand.Dispose();
    dsCommand = null;
    }
    }
    }
      

  18.   

    关注
    推荐看看ASP.NET数据库入门经典《乐思》青华大学出版社
      

  19.   

    如果我只用DISPOSE()方法,而未用CLOSE(),这是否代表连接已关闭,并将资源释放了呢?
      

  20.   

    dataadapter+dataset采取的是一种谁打开连接谁释放的工作机制。
    用存储过程移植会有问题,但用SQL你就能保证只用标准的,兼容的SQL吗?当然尽可能的标准还是能做到的。数据库移植始终不是一件让人很爽的事。
      

  21.   

    会不会是在页面unload时自动地清除了products对象呢?C#不是有一个自动垃圾单元回收功能吗?
      

  22.   

    参看.net下分层架构系统的开发技术规范:http://www.csdn.net/develop/Read_Article.asp?Id=24179
    http://www.csdn.net/develop/Read_Article.asp?Id=25657
      

  23.   

    我也遇到这样的问题,虽然myComm.ExecuteReader(CommandBehavior.CloseConnection)这个方法应该是对的,我也的确是这样写的,但是大概一次同时执行30个左右的SqlDataReader,连续2,3次Sql Server就死了,靠,我那个项目蛮重要的,很烦这件事,到现在我还没有时间去改过来,只好希望别人少执行点查询,查询时动作慢一点,呵呵。
        我的想法是用SqlDataAdapter,DataSet来解决这个问题,不过没有测试,不知道大家有什么意见!
     
        今天晚上对程序做了完善,发现用DataSet来替代SqlDataReader就可以解决我说的问题了,