我在使用我们的一个应用程序时遇到了问题。它是 .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 ACCESS 2000 文件,有一个表和几条记录(它以加密形式存储不同的 MS-SQL 连接字符串),所以在启动时我们可以读取连接,解密它们并为用户提供一个列表选择不同的连接。我创建的测试程序中不存在(或执行)该功能,因为在 connection.Open() 中(显然)引发了异常
尤其是关于这台电脑的更多信息 这个 盒子看起来很正常。我们已经从不同的来源(Windows 更新)和 dotnetfx.exe(250mb 的大文件)重新安装了 .NET,甚至从那个大的 .net 安装程序执行了“修复”。.NET 似乎可以工作,因为这个小控制台应用程序以 .NET 3.5 为目标。
为什么要做这个测试? 控制台应用程序这样做的原因只是因为我们自己的应用程序(除其他几件事之外)一旦开始执行 Main(),这是我们首先要做的事情之一,所以我隔离了那段代码并发现异常正在那里抛出。为了确保我们的代码没有任何事情要做,我创建了测试应用程序并发现了奇怪的异常。
谷歌呢? 我一直在疯狂地搜索 google/SO/etc。无济于事。OutOfMemory 是一个非常具有误导性的搜索词,即使与 oledb 和其他“可能的”关键字结合使用('虽然我可能会遗漏一些东西)。尝试使用命名空间的其他部分进行搜索时,会指向似乎与此特定问题无关的奇怪结果。
问题是什么? 哦,这很简单:有什么想法吗?
抓住 我试图避免重新安装整个 Windows(这也可以解决问题,因为这个简单的东西适用于数百台其他计算机)。这个盒子似乎没有感染恶意软件或类似的东西,它是用于医疗保健的平板电脑,因此即使使用“开放”的互联网访问也很少使用。这并不意味着盒子是 100% 干净的(对于 Windows,您永远无法确定)。如果您知道或遇到过此问题(并找到了解决方法),请赐教。
提前致谢!