打开一个简单的OleDB连接会抛出OutOfMemory异常?

时间:2009-09-11 10:51:02

标签: .net windows ms-access oledb out-of-memory

我在使用其中一个应用程序时遇到了麻烦。这是.NET 3.5 32位进程。启动时,我们打开一个.mdb来读取一些“元数据”值。这适用于数百个系统,但我们有一个客户使用TabletPC和问题。操作系统是Windows XP Tablet PC SP3,32位,bla bla。没什么不寻常的。它有.NET 3.5(来自Windows Update)所有最新版本。没什么不寻常的。

由于我们的应用程序在启动期间执行了“少量操作”,因此我创建了最简单的控制台应用程序:

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 ACCESS 2000文件,带有一个表和几个记录(它以加密形式存储不同的MS-SQL连接字符串),因此在启动时我们可以读取连接,解密它们并提供一个列表供用户选择不同的联系。 在我创建的测试程序中,没有任何功能存在(或执行),因为异常在连接中抛出(显然)。开放()

有关此计算机的更多信息 这个盒子似乎正常。我们从不同的源(Windows Update)和dotnetfx.exe(大250mb文件)重新安装了.NET,甚至从那个大的.net安装程序执行了“修复”。 .NET似乎有效,因为这个小型控制台应用程序的目标是.NET 3.5。

为什么要进行此测试? 控制台应用程序之所以这样做是因为我们自己的应用程序确实(在其他一些事情中),一旦它开始执行Main(),它就是我们做的第一件事,所以我分离了那段代码和发现异常被扔到那里。为了确保我们的代码都没有任何操作,我创建了测试应用程序并发现了奇怪的异常。

Google怎么样? 我一直疯狂地搜索谷歌/ SO /等。无济于事。 OutOfMemory是一个非常误导性的搜索术语,即使与oledb和其他“可能”关键词相结合('我可能会遗漏某些东西)。尝试使用命名空间的其他部分进行搜索,指向看似与此特定问题无关的奇怪结果。

有什么问题? 哦,这很简单:任何想法?

捕捉 我试图避免重新安装整个Windows(这可能也解决了问题,因为这个简单的东西适用于数百台其他计算机)。该框似乎没有被恶意软件或类似软件感染,它是医疗保健中使用的平板电脑,因此即使“开放”也很少使用互联网访问。 这并不意味着盒子是100%干净的(你永远无法确定Windows)。 如果您知道或遇到过这个问题(并找到了解决办法),请赐教。

提前致谢!

1 个答案:

答案 0 :(得分:0)

这已经过去了一年多了,我已经将代码移植到一个小的XML文件中。从那以后我们没有遇到任何问题。

基本上应用程序启动,如果它没有检测到XML,它会查找MDB,如果找到它,它会尝试打开它(总是捕获可能的错误),如果它可以打开它,它会读取内容并创建XML,保存并永久关闭MDB:)

到目前为止,它已经使用了1000多台机器,但是内存错误的原因仍然未知。