................
        Private objconn As SqlConnection
        Private objcmd As SqlCommand
        Private strconn As String = System.Configuration.ConfigurationSettings.AppSettings("sqlconn")
..............
      'Select users by department id
        Public Function spUserbydep(ByVal id As Integer) As SqlDataReader
            Try
                objconn = New SqlConnection(strconn)
                objcmd = New SqlCommand("spUserbydep", objconn)
                objcmd.CommandType = CommandType.StoredProcedure
                objcmd.Parameters.Add(New SqlParameter("@depid", SqlDbType.Int))
                objcmd.Parameters("@depid").Value = id
                objconn.Open()
                Return objcmd.ExecuteReader()
                objconn.Close()
                objconn.Dispose()
            Catch ex As SqlException
                Return Nothing
            End Try
        End Function
 ......................
     所有的过程我都是如上释放了连接,为什么还是会连接池满呢。解决就结分。谢谢
下面是我的WEBCONFIG,设置的
<appSetting>
   <add key="sqlconn" value="server=(local);Pooling=true;Max Pool Size=300;Min Pool Size=0;uid=sa;pwd=;database=hr"></add>
    </appSettings>........................

解决方案 »

  1.   

    流程本来就有问题objconn.Open()
                    Return objcmd.ExecuteReader()
                    objconn.Close()
                    objconn.Dispose()
    你已经调用 Return了,函数就已经返回了,所以后面关闭链接的语句得不到执行啊个人不推荐返回 DataReader,因为你返回DataReader的话,在这个函数里就不能关闭链接,否则你返回了也用不了。 最好返回 DataTable 或 其它集合对象 ,DataReader必须关联一个打开的链接。
      

  2.   

    那这样是不是就可以了
    objconn.open()
    dim r as sqldatareader
    r=objcmd.executereader()
    objconn.close()
    return r
    这样就OK了,我本也怀疑这个问题,怪不得说sqldataAdapter是不是可以自动管理连接数!
    谢谢,OK后就结
      

  3.   

    不能在这个函数里关闭链接, 比如再你用完 sqldatareader以后由调用的函数去关闭链接,否则你就用不了返回的sqldatareader对象了
      

  4.   

    objconn = New SqlConnection(strconn)
             Try
                    
                    objcmd = New SqlCommand("spUserbydep", objconn)
                    objcmd.CommandType = CommandType.StoredProcedure
                    objcmd.Parameters.Add(New SqlParameter("@depid", SqlDbType.Int))
                    objcmd.Parameters("@depid").Value = id
                    objconn.Open()
                    Return objcmd.ExecuteReader()
                Catch ex As SqlException
                    Return Nothing
                Finally
                    objconn.Close()
                    objconn.Dispose()
                End Try
    善用Fianlly
      

  5.   

    个人不建议返回DataReader对象,因为DataReader的使用必须是占用数据库连接的,返回DataTable或者DataSet无连接的数据对象更灵活,如果非要使用DataReader对象的话可以在ExecuteReader的方法中加入CommandBehavior.CloseConnection参数,指明要在关闭DataReader对象的同时关闭相对应的数据库连接,切记DataReader对象使用以后一定要Close!!!另外你的objconn.Close()
                    objconn.Dispose() 根本就没有执行。
      

  6.   

    哦,对了,由于你需要返回DataReader,所以还不能在方法内部关闭连结,否则返回的DataReader就没用了~
      

  7.   

    可以定义一个连接类用DataAdapter,那样的话就会自动关闭数据库
      

  8.   

    为什么不返回DataSet?
    用dataadapter
      

  9.   

    不够严谨
    objconn.open()
    dim r as sqldatareader
    r=objcmd.executereader()
    objconn.close()
    return r
    这样结果好像可以了,但实际上如果r=objcmd.executereader()发生错误,你的objconn.close()还是得不到执行!所以你连接池的问题同样会存在。所以还是要在错误捕捉里面去关闭数据库连接。
      

  10.   

    skytear(将进酒) 说到我的痛楚了。我的性格就是不够严谨。
    用DATAREADER只是看说明说性能会高一点。所以....
    没办法我只好在每个页面中调用 **.closeConn
    在.vb中写了个函数
    public function closeconn()
         objconn.dispose()
         objconn.close()
    end function
    再次感谢。结贴