Доступ к файлу базы данных не закрывается при его программном открытии в C#

Я новичок в этом. На самом деле, это первый раз, когда я задаю вопрос по stackru. Я сделал много поисков, но пока не смог найти ответ на этот вопрос. Вот суть того, что я пытаюсь сделать.

  1. Откройте файл базы данных доступа с помощью ADOX.
  2. Для всех не скрытых и несистемных таблиц в базе данных добавьте запись в свойство "текст проверки".
  3. Закройте файл базы данных доступа.

Вот что происходит с файлом.

  1. Файл блокировки *.ldb присутствует в папке, и это вызывает ошибку, что база данных открыта другим процессом.

Вот что я попробовал напрасно.

  1. Закройте таблицу, открытую на каждой итерации цикла foreach.
  2. Закройте класс каталога и объект сразу после цикла foreach.
  3. Удалите весь код внутри цикла foreach.

Вот что я планирую сделать.

  1. Используйте Try Catch, чтобы поймать ошибку.

        cn = new ADODB.Connection();
        cat = new ADOX.CatalogClass();
        cn.Open(tmpStr);
        cat.ActiveConnection = cn;
    
        //Loop through all tables to add the validation text
        foreach (Table t in cat.Tables)
        {
    
    
            tname = t.Name;
            ttype = t.Type == null ? string.Empty : t.Type;
            tprop = t.Properties["Jet OLEDB:Table Hidden In Access"].Value.ToString();
            if (ttype.ToUpper() == "TABLE" && tprop.ToUpper() == "FALSE") // 
            {
                t.Properties["Jet OLEDB:Table Validation Text"].Value = "this is table " + tname + "                                                                                                student1";
            }
    
            //System.Runtime.InteropServices.Marshal.FinalReleaseComObject(t);
    
        }
        //Close all open objects
    
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(cat.Tables);
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(cat.ActiveConnection);
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(cat);
        GC.Collect();
    

Как вы думаете, что-то не так с тем, как я пытаюсь выполнить то, что я хотел бы сделать? Спасибо и хорошего дня.

1 ответ

Я долгое время не работал с ADODB, но в соответствии с тем, что я помню: вы должны закрыть соединение, GC.Collect() будет "в конечном итоге" собирать потерянные объекты, но я считаю, что вы должны использовать метод Close объекта Connection. https://msdn.microsoft.com/en-us/library/ms807027.aspx

Другие вопросы по тегам