2012-07-11 8 views
5

To jest aplikacja .NET 2.0 napisana przy użyciu VS 2005. Działa dobrze na systemach z uruchomionym .NET 2.0, ale twardych awarii w systemach z systemem .NET 4.0. Tutaj jest krytyczna część kodu:Dlaczego moja aplikacja .NET 2.0 ulega awarii w środowisku .NET 4.0, gdy używam obiektu OleDbDataAdapter bez obiektu 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"); 
      } 
     } 

Ponownie, to działa w ramach .NET 2.0, wywala pod .NET 4.0

connectionStrings 1 & 2 referencyjnych różnych plików .xls.

Odkryłem, że sposobem obejścia tego problemu jest zadeklarowanie i zainicjowanie zmiennej pola typu OleDbConnection, ustawienie właściwości ConnectionString i Open() przed instrukcją using OleDbDataAdapter. Jak tak:

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"); 
      } 
     } 

Trudno uwierzyć, że to jest powód, dlaczego moja aplikacja została ciężko upaść (żadnych komunikatów o błędach) pod .NET 4.0, ale po usunięciu wierszy kodu jednej na raz i rekompilacji kółko Stwierdziłem, że to jest przyczyną problemu.

Cieszę się, że rozwiązałem problem, ale nie jestem zadowolony z faktu, że pierwszy kod nie będzie działać z .NET 4.0.

Czy ktoś może wyjaśnić, dlaczego .NET 4.0 nie lubi pracować z kodem podobnym do powyższego?

+1

Według MSDN, konstruktor OleDbDataAdapter, którego używasz, nie otwiera niejawnie utworzonego połączenia. http://msdn.microsoft.com/en-us/library/2f8y4737%28v=vs.100%29 Jednakże, jeśli spojrzysz na wersję 2.0 tej dokumentacji, otrzymasz to samo ostrzeżenie. –

+0

to interesujące. wciąż nie odpowiada na pytanie, dlaczego działa pod .net 2.0, ale nie .net 4.0 –

+2

Czy sprawdziłeś dzienniki zdarzeń systemu Windows, aby sprawdzić, czy istnieją jakieś wskazówki dotyczące awarii (ponieważ stwierdziłeś, że nie ma wyraźnego komunikatu o błędzie? po prostu robisz chwyt ... co się stanie, jeśli zrobisz 'catch (Exception ex) {MessageBox.Show (ex.Message);}'? –

Odpowiedz

3

Problem polegał na "weryfikatorze aplikacji". Odinstalowanie rozwiązało problem.

2

W oryginalnym kodzie (bez połączenia.open), czy zainicjalizowano tabele przed wywołaniem 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

Tak, tabele są inicjowane. –

Powiązane problemy