2012-07-11 13 views
5

Esta es una aplicación .NET 2.0 escrita con VS 2005. Funciona bien en sistemas que ejecutan .NET 2.0, pero se bloquea en sistemas que ejecutan .NET 4.0. Aquí está la sección crítica del código:¿por qué mi aplicación .NET 2.0 se bloquea bajo .NET 4.0 cuando uso un objeto OleDbDataAdapter sin un objeto OleDBConnection?

 string selectCommand1 = .... 
     string connectionString1 = .... 
     using (OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand1, connectionString1)) 
     { 
      try 
      { 
       adapter.Fill(table1); 
      } 
      catch 
      { 
       MessageBox.Show("error"); 
      } 
     } 

     string selectCommand2 = .... 
     string connectionString2 = .... 
     using (OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand2, connectionString2)) 
     { 
      try 
      { 
       adapter.Fill(table2); 
      } 
      catch 
      { 
       MessageBox.Show("error"); 
      } 
     } 

Una vez más, funciona bajo .NET 2.0, se bloquea bajo .NET 4.0

connectionStrings 1 2 & de referencia diferentes archivos .xls.

Descubrí que la forma de solucionar este problema es declarar e inicializar una variable de campo de tipo OleDbConnection, establecer la propiedad ConnectionString y Abrirla() antes de la instrucción using de OleDbDataAdapter. Como así:

OleDbConnection connection = new OleDbConnection(); 

    ....... 

     connection.ConnectionString = connectionString1; 
     connection.Open(); 
     using (OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand1, connection)) 
     { 
      try 
      { 
       adapter.Fill(table1); 
      } 
      catch 
      { 
       MessageBox.Show("error"); 
      } 
     } 

     connection.Close(); 
     connection.ConnectionString = connectionString2; 
     connection.Open(); 
     using (OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand2, connection)) 
     { 
      try 
      { 
       adapter.Fill(table2); 
      } 
      catch 
      { 
       MessageBox.Show("error"); 
      } 
     } 

Es difícil creer que esta es la razón por la que mi aplicación se estrellaba duro (no hay mensajes de error) bajo .NET 4.0, pero después de la eliminación de líneas de código uno a la vez y volver a compilar una y otra Descubrí que esa es la causa del problema.

Me alegro de haber resuelto el problema, pero no estoy satisfecho con el hecho de que el primer código no funcionará con .NET 4.0.

¿Puede alguien explicar por qué a .NET 4.0 no le gusta trabajar con código como el anterior?

+1

Según MSDN, el constructor OleDbDataAdapter que está utilizando no abre la conexión creada implícitamente. http://msdn.microsoft.com/en-us/library/2f8y4737%28v=vs.100%29 Sin embargo, si observa la versión 2.0 de esa documentación, le da la misma advertencia. –

+0

eso es interesante. todavía no responde la pregunta de por qué funciona en .net 2.0 pero no en .net 4.0 –

+2

¿Ha comprobado los registros de eventos de Windows para ver si hay alguna pista para el bloqueo (ya que indicó que no hay un mensaje de error explícito? usted solo está haciendo una trampa ... ¿qué pasa si no lo hace 'catch (Exception ex) {MessageBox.Show (ex.Message);}'? –

Respuesta

3

El problema fue "Verificador de aplicación". Desinstalarlo resolvió el problema.

2

En su código original (sin connection.open), ¿ha inicializado las tablas antes de llamar al adapter.Fill(table1)?

using (OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand1, connectionString1)) 
    { 
     using (System.Data.DataTable table1 = new System.Data.DataTable()) { 

      try 
      { 
       adapter.Fill(table1); 
      } 
      catch 
      { 
       MessageBox.Show("error"); 
      } 
     } 
    } 
+0

sí, las tablas están inicializadas. –

Cuestiones relacionadas