1

アプリケーションの1つで問題が発生しています。.NET3.532ビットプロセスです。起動時に.mdbを開いて、いくつかの「メタデータ」値を読み取ります。これは何百ものシステムで機能しますが、TabletPCと問題を抱えているお客様がいます。オペレーティングシステムは、Windows XP Tablet PC SP3、32ビット、blablaです。異常なことは何もありません。.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を実行すると、「ファイルが見つかりませんblablabla」という明らかな結果が得られます。それは正しいです。

メタデータをコピーすると(メタデータについては後で詳しく説明します)、次のようになります。

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

注:例外はスペイン語で翻訳しましたが、内容は同じです。唯一の違いは「タイプの例外」でしたが、名前空間は変更されていません。

メタデータには何が含まれていますか?:これは、1つのテーブルと2つのレコードを持つ単純なMS ACCESS 2000ファイルです(暗号化された形式でさまざまなMS-SQL接続文字列を格納します)。したがって、起動時に接続を読み取り、復号化して、ユーザーにリストを表示できます。別の接続を選択してください。例外が(明らかに)connection.Open()でスローされるため、私が作成したテストプログラムには、その機能は存在しません(または実行されません)。

特にこのコンピュータの詳細 ボックスは正常のようです。さまざまなソース(Windows Update)およびdotnetfx.exe(大きな250mbファイル)から.NETを再インストールし、その大きな.netインストーラーから「修復」を実行しました。この小さなコンソールアプリケーションは.NET3.5を対象としているため、.NETは機能しているようです。

なぜこのテスト? コンソールアプリケーションがそれを実行する理由は、私たち自身のアプリケーションが(他のいくつかのことの中でも)Main()の実行を開始するとすぐに、それが最初に実行することの1つであるためです。そこで、そのコードを分離し、例外がそこにスローされていることがわかりました。コードに関係がないことを確認するために、テストアプリケーションを作成し、奇妙な例外を見つけました。

Googleはどうですか? 私は必死にグーグル/SO/などを検索してきました。無駄に。OutOfMemoryは、oledbやその他の「可能性のある」キーワードと組み合わせた場合でも、非常に誤解を招く検索用語です(「何かが足りない可能性があります)。名前空間の他の部分を使用して検索しようとすると、この特定の問題に関連していないように見える奇妙な結果が示されます。

質問は何ですか? ああ、それは簡単です:何かアイデアはありますか?

キャッチ 私はWindows全体を再インストールすることを避けようとしています(この単純なものが他の何百ものコンピューターで動作することを考えると、問題を修正することもできます)。ボックスはマルウェアなどに感染していないようで、ヘルスケアで使用されているタブレットPCであるため、「オープン」であるにもかかわらずインターネットアクセスが使用されることはほとんどありません。これは、ボックスが100%クリーンであることを意味するわけではありません(Windowsでは確信が持てません)。この問題を知っている、または経験した(そして修正を見つけた)場合は、私に教えてください。

前もって感謝します!

4

1 に答える 1

0

これは 1 年以上前に機能しなくなりました。それ以来、単一の小さな XML ファイルを使用するようにコードを移植しました。それ以来、何の問題もありませんでした。

基本的にアプリが起動し、XML が検出されない場合は MDB を探し、見つかった場合は開こうとし (常にエラーの可能性をキャッチします)、開くことができる場合はコンテンツを読み取って作成しますXML、それを保存し、MDB を永久に閉じます:)

これまでに1000台以上のマシンで動作しましたが、メモリエラーの原因はまだ不明です.

于 2011-04-04T14:16:25.860 に答える