Открытие простого соединения OleDB вызывает исключение OutOfMemory? - PullRequest
1 голос
/ 11 сентября 2009

У меня проблемы с одним из наших приложений. Это .NET 3.5 32-битный процесс. При запуске мы открываем .mdb, чтобы прочитать несколько значений «метаданных». Это работает на сотнях систем, но у нас есть клиент с TabletPC и проблемами. Операционная система Windows XP Tablet PC SP3, 32 бита, бла-бла. Ничего необычного Он имеет .NET 3.5 (из Центра обновления Windows) Все в актуальном состоянии. Ничего необычного.

Поскольку наше приложение "запускает несколько вещей" во время запуска, я создал самое простое консольное приложение:

namespace TestAccessConnection
{
    class Program
    {
        static void Main( string[] args )
        {
            OleDbConnection connection;
           try
            {
                connection =
                    new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=metadata.mdb;Persist Security Info=False");
                connection.Open();
                connection.Close();
                Console.Read();
            }
            catch ( Exception e )
            {
                Console.WriteLine(e.ToString());
                Console.Read();
            }
        }
    }
}

Результаты:

Если мы выполним этот единственный .exe-файл без файла «metadata.mdb» по тому же пути, мы получим очевидное: «файл не найден, бла-бла-бла». Это правильно.

Если мы скопируем метаданные (, позже мы добавим метаданные ), мы получим это:

System.OutOfMemoryException: An exception of type 'System.OutOfMemoryException' has occurred.
  at System.Data.Common.ADP.IsSysTxEqualSysEsTransaction()
  at System.Data.Common.ADP.NeedManualEnlistment()
  at System.Data.OleDb.OleDbConnection.Open()
  at TestAccessConnection.Program.Main(String[] args

примечание: исключение было на испанском языке, и я перевел его, но содержание остается тем же самым, единственными отличиями было «исключение типа», но пространства имен нетронуты

Что в метаданных? : Это простой файл MS ACCESS 2000 с одной таблицей и несколькими записями (он хранит разные строки подключения MS-SQL в зашифрованном виде), поэтому при запуске мы можем прочитать соединения, расшифровать их и представить список на выбор пользователя. разные связи. Ни одна из этих функциональных возможностей не присутствует (или не выполнена) в созданной мной тестовой программе, поскольку исключение выдается (очевидно) в соединении .Open ()

Подробнее об этом компьютере, в частности Коробка кажется нормальной. Мы переустановили .NET из разных источников (Центр обновления Windows) и dotnetfx.exe (большой файл 250 МБ) и даже выполнили «восстановление» из этого большого установщика .net. .NET, кажется, работает, так как это небольшое консольное приложение предназначено для .NET 3.5.

Почему этот тест? Причина, по которой консольное приложение делает только то, что наше собственное приложение делает (среди прочего), что, как только оно начинает выполнять Main (), это одна из первых вещей, которую мы делаем, поэтому я изолировал этот кусок кода и обнаружил, что исключение там бросают. Чтобы убедиться, что ни один из нашего кода не имеет ничего общего, я создал тестовое приложение и обнаружил странное исключение.

А как насчет Google? Я искал в Google / SO / и т.д. но безрезультатно. OutOfMemory - очень вводящий в заблуждение поисковый термин, даже в сочетании с oledb и другими «возможными» ключевыми словами (хотя я мог что-то упустить). Попытка поиска с использованием других частей пространств имен указывает на странные результаты, которые, по-видимому, не связаны с этой конкретной проблемой.

Что за вопрос? О, это просто: есть идеи?

Поймайте Я стараюсь не переустанавливать всю Windows (что также может решить проблему, учитывая, что эта простая вещь работает на сотнях других компьютеров). Коробка, по-видимому, не заражена вредоносными программами или чем-то подобным, это планшетный компьютер, используемый в системе здравоохранения, поэтому доступ в Интернет, хотя и «открытый», редко используется, если используется вообще. Это не означает, что коробка чиста на 100% (с Windows вы не можете быть уверены). Если вы знаете или столкнулись с этой проблемой (и нашли решение), пожалуйста, сообщите мне.

Заранее спасибо!

1 Ответ

0 голосов
/ 04 апреля 2011

Это уже более года, и я с тех пор портировал код для использования одного небольшого XML-файла. У нас не было никаких проблем с тех пор.

По сути, приложение запускается и, если оно не обнаруживает XML, оно ищет MDB, если оно находит его, оно пытается открыть его (всегда обнаруживая возможные ошибки), если оно может открыть его, оно читает содержимое и создает XML, сохраняет его и закрывает MDB навсегда:)

До сих пор он работал с более чем 1000 машин, однако причина ошибки памяти до сих пор неизвестна.

...