我在使用其中一个应用程序时遇到了麻烦。这是.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)。 如果您知道或遇到过这个问题(并找到了解决办法),请赐教。
提前致谢!
答案 0 :(得分:0)
这已经过去了一年多了,我已经将代码移植到一个小的XML文件中。从那以后我们没有遇到任何问题。
基本上应用程序启动,如果它没有检测到XML,它会查找MDB,如果找到它,它会尝试打开它(总是捕获可能的错误),如果它可以打开它,它会读取内容并创建XML,保存并永久关闭MDB:)
到目前为止,它已经使用了1000多台机器,但是内存错误的原因仍然未知。