2

参照テーブルに Access DB ファイルを使用するプロジェクトがあります。これは仕事で使用する予定ですが、自宅で開発しています。これまでは、VS2010 でデバッガーを実行し、関連するクラス ファイル、exe などを /bin フォルダーからフラッシュ ドライブにコピーしただけで、問題なく動作しました。しかし、DB を追加すると、起動時に突然クラッシュします。

DB ファイルのファイルの場所に問題があることはわかっています。もともと DB の Build Action は Content に送信されていました。私はそれを埋め込みリソースに変更しました。これは、私が理解している限り、それがexeファイルの一部になることを意味します。

私はこれで正しいですか?そうでない場合、DB を exe のコンパイル済み部分または他の dll の 1 つにするためにどのオプションを選択する必要がありますか?

4

1 に答える 1

2

db ファイルが埋め込まれている場合、アクセスして行を追加/削除することはできません。ビルド アクションを Embedded Resource に変更したのはなぜですか? コンテンツとして配置する方がよいため、db は exe とは別のファイルであり (ただし、同じディレクトリにあります)、db ファイルへのパスを作成します (つまり、Application.StartupPath を使用します)。

とにかく、組み込みとして設定する場合は、実行時にデータベースを抽出し、使用する前にどこかに保存する必要があります。

埋め込みリソースからファイルを抽出できるメソッドを次に示します (もちろん、ファイル名を変更するか、引数として渡す必要があります)。

private void ExtractFromAssembly()
{
    string strPath = Application.LocalUserAppDataPath + "\\MyFile.db";
    if (File.Exists(strPath)) return; // already exist, don't overwrite
    Assembly assembly = Assembly.GetExecutingAssembly();
    //In the next line you should provide NameSpace.FileName.Extension that you have embedded
    var input = assembly.GetManifestResourceStream("MyFile.db");
    var output = File.Open(strPath, FileMode.CreateNew);
    CopyStream(input, output);
    input.Dispose();
    output.Dispose();
    System.Diagnostics.Process.Start(strPath);
}

private void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[32768];
    while (true)
    {
        int read = input.Read(buffer, 0, buffer.Length);
        if (read <= 0)
            return;
        output.Write(buffer, 0, read);
    }
}

ファイルは、ユーザー ディレクトリのローカル アプリケーション パスにコピーされます。そうしないと、アプリケーションが起動するたびにdbファイルが上書きされるためです(exeのクリーンなdbパッケージで上書きされます)。

于 2012-05-22T06:20:14.143 に答える