2009-09-11 5 views
1

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

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

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 "в том же пути, мы получаем очевидное:« файл не найден bla bla bla ». Это верно.

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

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 в зашифрованном виде), поэтому при запуске мы можем читать соединения, расшифровывать их и представлять список для пользователю выбрать разные соединения. Ни один из этой функциональности не присутствует (или выполняется) в тестовой программе я создал, так как исключение (по-видимому) в connection.Open()

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

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

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

В чем вопрос? О, это просто: любые идеи?

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

Заранее благодарен!

+0

Хотя я все для людей, использующих Jet/ACE в качестве хранилища данных в ряде программных сред, разве это не слишком сложно для пользователя, которого вы создаете? Почему вместо этого вместо XML-файла? Для такого небольшого объема данных это было бы намного проще? –

+0

Да, хотя вы должны учитывать тот факт, что это было создано почти шесть лет назад. Небольшой .mdb был простым и практичным способом хранения простой таблицы. Возможно, пришло время его заменить (особенно теперь, когда мы знаем, что бит JET64 не будет). ;) –

+0

Вы пробовали подключение к другим источникам данных oledb? другой файл msaccess? тот же файл с другим именем? Я знаю, что мой вопрос может казаться глупым, но ваша проблема довольно удивительна. Если ничего не появится, я последую за советом DWF и отправлю XML-файл в качестве другого способа хранения данных. –

ответ

0

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

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

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

Смежные вопросы