【发布时间】:2009-09-11 10:51:01
【问题描述】:
我在使用我们的一个应用程序时遇到了问题。它是 .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,您永远无法确定)。 如果您知道或遇到过此问题(并找到了解决方法),请赐教。
提前致谢!
【问题讨论】:
-
虽然我完全支持在许多编程环境中使用 Jet/ACE 作为数据存储的人,但对于您正在创建的用户来说,这不是矫枉过正吗?为什么不用 XML 文件呢?对于这么少量的数据,这不是很容易吗?
-
是的,尽管您必须考虑到它是在大约六年前创建的。一个小的 .mdb 是一种简单实用的存储简单表的方法。也许是时候更换它了(特别是现在我们知道不会有 JET64 位)。 ;)
-
你试过连接其他oledb数据源了吗?另一个 msaccess 文件?同一个文件有另一个名字?我知道我的问题听起来很愚蠢,但你的问题很令人惊讶。如果什么都没有出现,我会按照 DWF 的建议使用 XML 文件作为另一种存储数据的方式。
-
我没有尝试连接到其他数据源,msaccess 文件已更改(即从其他工作系统复制)。我还没有重命名它,考虑到它已经在这个名字下工作了五年多,我从来没有想过这个。显然,“计算机技术人员”将重新安装该盒子,因为当他尝试修复 .NET 3.5 时遇到了一些错误。我目前无法实际访问该盒子。无论如何,我会考虑将 XML 作为未来可行的选择。谢谢。
标签: .net windows ms-access oledb out-of-memory