内存泄漏OracleConnection与VB.Net中的Oracle数据访问(ODP),而不是C#

内存泄漏OracleConnection与VB.Net中的Oracle数据访问(ODP),而不是C#,c#,vb.net,memory-leaks,odp.net,idatareader,C#,Vb.net,Memory Leaks,Odp.net,Idatareader,为什么下面的代码在执行时会导致内存泄漏?只有在vb.net语言中使用Microsoft Visual Studio 2005或2008时,才会发生此错误。如果我使用C#is,就没有问题了 Dim strCon As String = "data source=SRV-10G;user id=Test;password=1234" dim factory as DbProviderFactory = DbProviderFactories.GetFactory("Oracle.DataAcces

为什么下面的代码在执行时会导致内存泄漏?只有在vb.net语言中使用Microsoft Visual Studio 2005或2008时,才会发生此错误。如果我使用C#is,就没有问题了

Dim strCon As String = "data source=SRV-10G;user id=Test;password=1234"

dim factory as DbProviderFactory = DbProviderFactories.GetFactory("Oracle.DataAccess.Client");

Dim conexao As IDbConnection = factory.CreateConnection

conexao.ConnectionString = strCon

conexao.Open()


For cont As Integer = 1 To 100000

  Dim comando As IDbCommand = conexao.CreateCommand()

  comando.CommandText = "Select * from tabela where campo = " & cont

  Dim leitor As IDataReader = comando.ExecuteReader

  While leitor.Read

    Dim v As String = leitor.GetValue(1).ToString

  End While

  leitor.Close()
  leitor.Dispose()

  comando.Dispose()
Next

conexao.Close()
conexao.Dispose()

你怎么知道内存泄漏了?一种语言被垃圾收集,怎么会出现内存泄漏?如果您收到一条错误消息,明确告诉您内存泄漏,那么数据库驱动程序本身可能有问题,可能是用任何语言编写的。不过,根据您所使用的.NET语言,针对该驱动程序编写任何类型的.NET代码都不会导致任何问题。

您发布的代码看起来不错。尽管VB.NET中有一条语句可能会有所帮助(ad至少会使您的代码更易于阅读!)。在给出更多建议之前,您需要发布更多信息


您可能想检查一下这个老答案:虽然特定于c#,但是所有的.NET内存分析器也应该适用于VB.NET。

请您也发布工作的c#代码,以便我们可以比较两者。你能解释一下你认为内存泄漏的原因吗(进程内存不断增加,数据库连接没有关闭,等等)。当你运行上面的代码并进入“任务管理器”时,内存量会上升到一个进程。此示例在使用C#运行时不会给出相同的错误。记忆保持不变。使用此示例并亲自查看。“使用垃圾收集的语言怎么会出现内存泄漏?”如果您认为.NET中不会出现内存泄漏(或者准确地说是内存保留),那么您需要阅读更多关于垃圾收集器工作原理的内容。一个例子是忘记取消订阅事件处理程序。