문제

우리 애플리케이션 중 하나에 문제가 있습니다..NET 3.5 32비트 프로세스입니다.시작 시 몇 가지 "메타데이터" 값을 읽기 위해 .mdb를 엽니다.이는 수백 대의 시스템에서 작동하지만 TabletPC를 사용하는 고객과 문제가 있습니다.운영 체제는 Windows XP Tablet PC SP3, 32비트, bla bla입니다.특이한 것은 없습니다..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();
            }
        }
    }
}

결과:

동일한 경로에 "metadata.mdb" 파일 없이 해당 단일 .exe를 실행하면 다음과 같은 분명한 결과를 얻을 수 있습니다."파일을 찾을 수 없습니다 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-SQL 연결 문자열을 저장함)가 포함된 간단한 MS ACCESS 2000 파일이므로 시작 시 연결을 읽고 해독하며 ​​사용자가 선택할 수 있는 목록을 제공할 수 있습니다. 다른 연결.Connection.Open()에서 예외가 (분명히) 발생하므로 내가 만든 테스트 프로그램에는 해당 기능이 존재하거나 실행되지 않습니다.

특히 이 컴퓨터에 대해 자세히 알아보기박스는 평범해 보입니다.우리는 다양한 소스(Windows 업데이트)와 dotnetfx.exe(큰 250mb 파일)에서 .NET을 다시 설치했으며 심지어 해당 큰 .net 설치 프로그램에서 "복구"를 실행했습니다.이 작은 콘솔 응용 프로그램은 .NET 3.5를 대상으로 하기 때문에 .NET이 작동하는 것 같습니다.

이 테스트를 수행하는 이유는 무엇입니까?콘솔 응용 프로그램이 수행하는 이유는 우리 응용 프로그램이 Main() 실행을 시작하자마자 가장 먼저 수행하는 작업 중 하나이기 때문입니다. 그래서 해당 코드 조각을 분리하고 거기에서 예외가 발생하고 있음을 발견했습니다.우리 코드 중 어떤 것도 관련되지 않았는지 확인하기 위해 테스트 애플리케이션을 만들었고 이상한 예외를 발견했습니다.

Google은 어떻습니까?나는 google/SO/etc를 미친 듯이 검색해 왔습니다.아무 소용이 없습니다.OutOfMemory는 oledb 및 기타 "가능한" 키워드와 결합된 경우에도 매우 오해의 소지가 있는 검색어입니다('뭔가 빠졌을 수도 있습니다).네임스페이스의 다른 부분을 사용하여 검색을 시도하면 이 특정 문제와 관련이 없는 것으로 보이는 이상한 결과가 나타납니다.

질문은 무엇입니까?아, 그건 간단해요:어떤 아이디어가 있나요?

잡다나는 전체 Windows를 다시 설치하지 않으려고 노력하고 있습니다(이 간단한 방법이 수백 대의 다른 컴퓨터에서 작동한다는 점을 고려하면 문제를 해결할 수도 있습니다).박스는 악성코드 등에 감염되지 않은 것으로 보이며, 헬스케어에서 사용하는 태블릿PC이기 때문에 '오픈' 상태임에도 불구하고 인터넷 접속은 전혀 사용하지 않습니다.이는 상자가 100% 깨끗하다는 의미는 아닙니다(Windows에서는 확신할 수 없습니다).이 문제를 알고 있거나 경험한 적이 있다면(그리고 해결 방법을 찾았다면) 알려주시기 바랍니다.

미리 감사드립니다!

도움이 되었습니까?

해결책

이것은 이제 1년 넘게 중단되었으며 그 이후로 하나의 작은 XML 파일을 사용하도록 코드를 이식했습니다.그 이후로 우리는 아무런 문제가 없었습니다.

기본적으로 앱이 시작되고 XML을 감지하지 못하면 MDB를 찾고, 찾으면 열려고 시도하며(항상 가능한 오류를 포착), 열 수 있으면 내용을 읽고 생성합니다. XML을 저장하고 MDB를 영원히 닫습니다. :)

지금까지 1000개 이상의 시스템에서 작동했지만 메모리 오류의 원인은 아직 알려지지 않았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top