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?
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. –
to interesujące. wciąż nie odpowiada na pytanie, dlaczego działa pod .net 2.0, ale nie .net 4.0 –
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);}'? –