Pregunta

Estoy teniendo problemas con una de nuestras aplicaciones. Es .NET 3.5 proceso de 32 bits. Al iniciar, abrimos un archivo .mdb para leer algunos " metadatos " valores. Esto funciona en cientos de sistemas, pero tenemos un cliente con un TabletPC y problemas. El sistema operativo es Windows XP Tablet PC SP3, 32 bits, bla bla. Nada inusual. Tiene .NET 3.5 (de Windows Update) Todo actualizado. Nada fuera de lo común.

Dado que nuestra aplicación hace un " pocas cosas " durante el inicio, he creado la aplicación de consola más simple:

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

Resultados:

Si ejecutamos ese único .exe sin el archivo " metadata.mdb " en la misma ruta, obtenemos lo obvio: " archivo no encontrado bla bla bla " ;. Eso es correcto.

Si copiamos los metadatos ( más sobre metadatos más adelante ), obtenemos esto:

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: la excepción estaba en español y la traduje, pero el contenido sigue siendo el mismo, las únicas diferencias fueron la " una excepción de tipo " ;, pero los espacios de nombres están intactos

¿Qué hay en los metadatos? : Es un simple archivo MS ACCESS 2000 con una tabla y un par de registros (almacena diferentes cadenas de conexión MS-SQL en forma cifrada), por lo que al iniciar podemos leer las conexiones, descifrarlas y presentar una lista para que el usuario elija Diferentes conexiones. Ninguna de esas funciones está presente (o ejecutada) en el programa de prueba que he creado, ya que la excepción se produce (aparentemente) en la conexión. Abrir ()

Más información sobre esta computadora en particular La caja parece normal. Hemos reinstalado .NET desde diferentes fuentes (Windows Update) y el dotnetfx.exe (el gran archivo de 250 mb) e incluso ejecutamos una " reparación " de ese gran instalador .net. .NET parece funcionar, ya que esta pequeña aplicación de consola apunta a .NET 3.5.

¿Por qué esta prueba? La razón por la que la aplicación de la consola hace solo que es porque nuestra propia aplicación hace (entre otras cosas) que tan pronto como comienza a ejecutar Main (), es una de las primeras cosas que hacemos, así que aislé ese fragmento de código y descubrió que la excepción está siendo lanzada allí. Para asegurarme de que ninguno de nuestros códigos tuviera nada que hacer, creé la aplicación de prueba y encontré la excepción rara.

¿Qué pasa con Google? He estado buscando frenéticamente en google / SO / etc. en vano. OutOfMemory es un término de búsqueda muy engañoso, incluso cuando se combina con oledb y otros " posible " palabras clave (aunque pueda que me falte algo). Al tratar de buscar usando otras partes de los espacios de nombres, apunta a resultados extraños que no parecen estar relacionados con este problema en particular.

¿Cuál es la pregunta? Oh, eso es simple: ¿Alguna idea?

Captura Estoy tratando de evitar volver a instalar todo el Windows (lo que también podría solucionar el problema, dado que esta cosa simple funciona en cientos de otras computadoras). El cuadro no parece estar infectado con malware o similar, es un Tablet PC que se usa en Salud, por lo que el acceso a Internet está abierto aunque " abierto " rara vez se utiliza si se utiliza en absoluto. Esto no significa que el cuadro esté 100% limpio (nunca puede estar seguro con Windows). Si conoce o ha experimentado este problema (y encontró una solución), por favor, escúcheme.

Gracias de antemano!

¿Fue útil?

Solución

Esto ha muerto hace más de un año, y desde entonces he portado el código para usar un solo archivo XML pequeño. No hemos tenido ningún problema desde entonces.

Básicamente, la aplicación se inicia y si no detecta el XML, busca el MDB, si lo encuentra, intenta abrirlo (siempre detectando posibles errores), si puede abrirlo, lee el contenido y crea el XML, lo guarda y cierra el MDB para siempre :)

Hasta ahora ha funcionado con más de 1000 máquinas, sin embargo, la causa del error de memoria aún se desconoce.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top