Во-первых: я видел многочисленные обсуждения стека (и на других форумах) по этой теме. Это не дубликат. Я пробовал многочисленные рекомендации безрезультатно.
У меня есть приложение winforms С#, которое большое и сложное. Он устанавливает соединения OleDB с базой данных Access в разное время по разным причинам. В определенной функции нам нужно ПЕРЕМЕСТИТЬ (копировать + удалить) файл mdb, но это невозможно сделать, потому что он заблокирован. Я пробовал много разных вещей, чтобы разблокировать/выпустить файл mdb, и иногда это работает. Но в определенном 100% воспроизводимом сценарии его нельзя разблокировать. У нас есть 2 глобальные переменные соединения oledb, которые мы повторно используем везде, для эффективности и чтобы избежать однократных соединений везде. И эти две переменные соединения полезны, когда мы хотим ЗАКРЫТЬ соединения, чтобы мы могли удалить файл mdb.
Вот моя функция (которая обычно работает, но не в этом 1 случае), чтобы принудительно закрыть/освободить 2 соединения oledb из нашего приложения winforms:
public static void CloseOleDBConnections(bool forceReleaseAll = false) {
if ( DCGlobals.Connection1 != null )
DCGlobals.Connection1.Close();
if ( DCGlobals.Connection2 != null )
DCGlobals.Connection2.Close();
if ( forceReleaseAll ) {
DCGlobals.Connection1.Dispose();
DCGlobals.Connection2.Dispose();
OleDbConnection.ReleaseObjectPool();
GC.Collect(GC.MaxGeneration);
GC.WaitForPendingFinalizers();
}
}
Я передаю true в вышеуказанную функцию.
Небольшая просьба: пожалуйста, не тратьте время на слова о том, что Access — это плохо, не масштабируется и т. д. Я знаю, что это плохо и не масштабируемо, но это устаревшее требование, и пока мы придерживаемся его. БЛАГОДАРЮ.
Еще одна мысль: конечно, мое приложение winforms знает обо всех открытых oledbconnections. Нет ли способа сказать С#, чтобы найти и перебрать все открытые соединения? Когда я закрываю/выхожу из своего приложения - poof - открытое соединение с mdb освобождается, и я могу удалить файл. Итак, что-то в .net знает о соединении и знает, как его разблокировать — так как же я могу использовать ту же логику, не выходя из приложения?
Есть идеи?
OleDbConnection
) для некоторого запроса и сразу же удалять его после завершения работы с ним. - person Fabio   schedule 16.11.2016