一个asp。net 连接数据库受到连接数的问题
我再用asp。net(C#) 做报表时遇到这样的错误
下面时错误提示:
“未将对象引用设置到对象的实例。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。”不是SQl错误!
当连续查询达到100次以上就出现这种错误!Sql server 为盗版的时数据库的限制还是,IIs的限制
还是asp。net的缺陷连接类:
SqlDataReader myDataReader = null;
SqlConnection conn = new  SqlConnection(ConfigurationSettings.AppSettings["Connstr"].ToString());
if (sqlstr.Trim()!=null)
{
SqlCommand  cmd = new SqlCommand(sqlstr.Trim(),conn);
try 
{
if (cmd.Connection.State.ToString()=="Closed")
cmd.Connection.Open();
try
{
myDataReader = cmd.ExecuteReader();

}
catch(Exception e)
{
myDataReader = null;
}
}
catch(Exception e)
{
myDataReader = null;
}

cmd.Connection.Close();
}

return myDataReader;

}

解决方案 »

  1.   

    作web页面不要使用DataReader,因为他每次读取一行数据,且connection断开后他就没法读取了,而且web页面是无法保存状态的,他向浏览器提交界面后下次在处理时是无法确认上一次的状态的
      

  2.   


    代码有问题:catch(Exception e)
    {
    myDataReader = null;
    }cmd.Connection.Close();  //数据库连接关闭了myDataReader如何读数据?
    }return myDataReader;}
      

  3.   

    是不是你建立連接的次數等於連接池的數據了。
    因为数据库连接池默认最大就是100个连接,你用DataReader就是需要时时连接。
      

  4.   

    to:dutguoyi 那么怎么扩大数据库连接池,如过连接池最大为100 为甚么C/S(delphi)可同时连接 200用户?
      虽然无奈之下改写了SQl,用程序大量的计算代替了反复查询,问题解决了。
      但原因我还是想搞个明白!请高手赐教!
      

  5.   

    MS 的答案
    ET 连接池救生员
    发布日期: 4/1/2004 | 更新日期: 4/1/2004NET 连接池救生员防止可淹没应用程序的池溢出William Vaughn大多数 ADO.NET 数据提供程序使用连接池,以提高围绕 Microsoft 断开连接的 .NET 结构构建的应用程序的性能。应用程序首先打开一个连接(或从连接池获得一个连接句柄),接着运行一个或多个查询,然后处理行集,最后将连接释放回连接池。如果没有连接池,这些应用程序将花费许多额外时间来打开和关闭连接。当您使用 ADO.NET 连接池来管理基于 Web 的应用程序和客户端/服务器 Web 服务应用程序的连接时,您的客户通常会获得更快的连接和更好的总体性能。但是,当您的应用程序或 Web 站点上突然涌入了同时希望进行连接的大量客户时,会发生什么事情呢?您的应用程序会“沉没”,还是会“游泳”?就像救生员一样,您需要仔细监视连接池,以维护它的良好性能,并防止连接池发生溢出。我们首先探讨连接池可能溢出的原因,然后讨论如何编写代码或使用 Windows 性能监视器来监视连接池。正如我于 2003 年 5 月发表的 "Swimming in the .NET Connection Pool" (InstantDoc ID 38356) 一文中讨论的那样,当您使用连接池时,您需要知道许多有关可伸缩性和性能的详细信息。请记住,您需要监视和管理两个基本因素:每个池管理的连接数和连接池的数量。在一个有效的生产系统中,池的数量通常很少(1 到 10),而且,使用中的连接的总数也很少(少于 12 )有效的查询只用不到一秒钟的时间就可以完成,并断开连接。因此,即使有数百个客户同时访问您的 Web 站点,相对较少的几个连接常常足以处理整个负载。为了使您的应用程序有效地运行,您必须使连接资源处于自己的控制之下,并要监视池的状态,这样,在监视池发生溢出以及您的客户开始抱怨(或离开您的网站)之前您会收到某种警告。 为什么会发生连接池溢出?参加电子邮件讨论组的人常常抱怨应用程序是如何在测试中是“龙”而在形成为产品时就变成了“虫”的。有时,他们会报告说,当连接了大约 100 个客户端时,应用程序会停止或挂起。请记住,一个池中的默认连接数是 100。如果您尝试从池中打开 100 个以上的连接,ADO.NET 会使应用程序的连接请求排队等候,直到有空闲的连接。应用程序(及其用户)将这种情况视为进入 Web 页的延迟或视为应用程序死锁。让我们首先讨论一下这个问题是如何产生的。在 ADO.NET 中,SqlClient .NET 数据提供程序为您提供了两种打开和管理连接的方法。首先,当您需要手工管理连接时,可以使用 DataReader 对象。利用这种方法,您的代码将构造一个 SqlConnection 对象,设置 ConnectionString 属性,然后使用 Open 方法来打开连接。当代码完成 DataReader 后,您要在 SqlConnection 对象停止作用之前关闭 SqlConnection。要处理行集,您可以将 DataReader 传递到应用程序中的另一个例程,但仍然需要确保 DataReader 及其连接处于关闭状态。如果您不关闭 SqlConnection,代码会“泄漏”每个操作的连接,于是连接池对连接进行累积,最后便发生溢出。与 ADO 和 Visual Basic (VB) 6.0 中的情况不同,.NET 垃圾回收器不会为您关闭 SqlConnection 并进行清理。我稍后要讨论的 清单 1 显示了如何打开连接和生成 DataReader 以从一个简单的查询返回行集,来向连接池施加压力的。您也可能在使用 DataAdapter 对象时遇到问题。DataAdapter Fill 和 Update 方法可自动打开 DataAdapter 对象的连接,并在数据 I/O 操作完成后关闭该连接。不过,如果该连接在执行 Fill 或 Update 方法时已经处于打开状态,那么,ADO.NET 在方法执行完以后不会关闭 SqlConnection。这是另一个发生连接“泄漏”的机会。此外,您还可以使用基于 COM 的 ADO 从 .NET 应用程序创建连接。ADO 利用与 ADO.NET 相同的方式将这些连接组合成池,但不能像您使用 SqlClient ADO.NET 数据提供程序时那样,提供从应用程序监视连接池的方式。