Pergunta

Estou tendo problemas com um de nossos aplicativos. NET 3,5 32 processo de seus bits. Na inicialização abrimos um mdb para ler alguns valores "metadados". Isso funciona em centenas de sistemas, mas nós temos um cliente com um TabletPC e problemas. O sistema operacional é o Windows XP Tablet PC SP3, 32 bits, bla bla. Nada incomum. Tem .NET 3.5 (a partir do Windows Update) Todos até à data. Nada fora do comum.

Desde a nossa aplicação faz um "algumas coisas" durante a inicialização, criei a mais simples aplicação de consola de sempre:

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();
            }
        }
    }
}

Resultado:

Se nós executarmos esse único .exe sem o arquivo "metadata.mdb" no mesmo caminho, temos o óbvio: "arquivo não encontrado bla bla bla". Isso está correto.

Se copiar os metadados ( mais em metadados depois ), obtemos a seguinte:

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

NOTA: A exceção foi em espanhol e eu traduzi-lo, mas o conteúdo permanece o mesmo, as únicas diferenças foram a "uma exceção do tipo", mas os Namespaces estão intocados

O que está no metadados ?: É um simples arquivo de MS Access 2000 com uma mesa e um par de registros (ele armazena diferentes seqüências de conexão MS-SQL em uma forma criptografada), então na inicialização podemos ler as conexões, os decifrar e apresentar uma lista para o usuário escolher diferentes ligações. Nenhum dos que a funcionalidade está presente (ou executada) no programa de teste que criei, desde que a exceção é lançada (aparentemente) na connection.Open ()

Mais sobre este computador em particular A caixa parece normal. Nós reinstalado .NET a partir de diferentes fontes (Windows Update) eo dotnetfx.exe (o arquivo de 250mb grande) e até executados a "reparação" a partir desse instalador .net grande. .NET parece funcionar, já que esta alvos pequeno aplicativo de console NET 3.5.

Por que este teste? A razão pela qual a aplicação da consola faz só isso é porque o nosso próprio aplicativo faz (entre algumas outras coisas) que, assim que ele começa a executar Main (), é uma das primeiras coisas que fazemos, então eu isolado aquele pedaço de código e descobriu que a exceção está sendo jogado lá. A fim de se certificar de que nenhum de nosso código tinha nada a ver, eu criei o aplicativo de teste e encontrou a exceção estranho.

O que sobre o Google? I foram buscando freneticamente google / SO / etc. para nenhum proveito. OutOfMemory é um termo de pesquisa muito enganosa, mesmo quando combinada com oledb e outros "possíveis" palavras-chave ( 'tho eu poderia estar faltando alguma coisa). Tentando pesquisar usando outras partes dos namespaces, aponta para resultados estranhos que não parecem estar relacionados a este assunto particular.

O que é a pergunta? Oh, isso é simples: Alguma idéia

?

Captura Estou tentando evitar a reinstalação inteira do Windows (que poderia muito bem resolver o problema, dado que esta coisa simples funciona em centenas de outros computadores). A caixa não parece ser infectado com malware ou similar, é um Tablet PC utilizado em cuidados de saúde, de modo que o acesso à Internet, embora "aberto" é raramente usada, se usado em tudo. Isso não significa que a caixa é 100% limpo (você nunca pode ter certeza com Windows). Se você conhece ou já passou por esta questão (e encontrou uma correção), por favor, me ilumine.

Agradecemos antecipadamente!

Foi útil?

Solução

Este está morto há mais de um ano agora, e eu tenho desde portado o código para usar um único arquivo XML pequena. Nós não tivemos quaisquer problemas desde então.

Basicamente, o aplicativo começa e se ele não detectar o XML, ele procura o MDB, se encontra, ele tenta abri-lo (sempre captura por possíveis erros), se ele pode abri-lo, ele lê o conteúdo e cria o XML, o salva e fecha o MDB sempre:)

Ele tem trabalhado com mais de 1000 máquinas até agora, no entanto, a causa do erro de memória ainda é desconhecida.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top