2009-09-11 79 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()

更多关于这计算机特别 盒似乎很正常。我们已经从不同的来源(Windows Update)和dotnetfx.exe(250MB大文件)重新安装了.NET,甚至还从那个大的.NET安装程序中执行了“修复”。因为这个小控制台应用程序的目标是.NET 3.5,因此.NET似乎可以工作。

为什么这个测试? 控制台应用程序的原因只是它是因为我们自己的应用程序所做的(其他一些事情),一旦它开始执行Main(),这是我们做的第一件事情之一,所以我隔离了那块代码,并发现异常正在抛出那里。为了确保我们的代码没有任何事情需要做,我创建了测试应用程序并发现了奇怪的异常。

Google呢? 我一直在疯狂搜索谷歌/ SO /等。无济于事。 OutOfMemory是一个非常具有误导性的搜索词,即使与oledb和其他“可能的”关键字结合使用('我可能会错过某些东西)。尝试使用名称空间的其他部分进行搜索,指向看起来与此特定问题无关的奇怪结果。

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

赶上 我试图避免重新安装整个的Windows(这还不如解决这个问题,因为这个简单的事情的作品数以百计的其他计算机)。这个盒子似乎没有感染恶意软件或类似软件,这是一款用于医疗保健的平板电脑,所以如果使用互联网,即使“开放”也很少使用。 这并不意味着盒子是100%干净的(你永远无法确定Windows)。 如果您知道或遇到过这个问题(并找到了解决方法),请赐教。

在此先感谢!

+0

虽然我都是在大量编程环境中将Jet/ACE用作数据存储的人,但对于您所制作的用户来说,这不是矫枉过正吗?为什么不用XML文件呢?对于这样的少量数据不会更容易? – 2009-09-12 01:55:00

+0

是的,尽管你必须考虑到这个事实是在六年前创建的。一个小的.mdb是存储简单表格的一种简单实用的方法。也许是时候更换它(特别是现在我们知道不会有JET64位)。 ;) – 2009-09-13 04:28:03

+0

您是否尝试过与其他oledb数据源的连接?另一个msaccess文件?与另一个名字相同的文件?我知道我的问题听起来很愚蠢,但你的问题很令人惊讶。如果什么都没有出现,我会遵循DWF的建议,并转而使用XML文件作为存储数据的另一种方式。 – 2009-09-13 16:20:06

回答

0

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

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

到目前为止,它与超过1000台机器一起工作,但是内存错误的原因仍然未知。