7

vs 2008 0nXPsp3で構築されたwinformアプリケーションを展開しています。

プロジェクトのルートフォルダと選択したプロパティにドロップした空のスキーマを使用してデータベースを作成しましたBuild ActionEmbedded ResourcesCopy to Output directoryCopyalways。これで、app.config connectionStringセクションにconnectionstringを含める代わりに、appSettingkey="database";にエントリを配置します。value= "mydb.db; Version=3"。

だからconnectionString私の使用を作成するために:

 SQLiteConnection con = new SQLiteConnection("Data Source=" + Path.Combine(Application.StartupPath, ConfigurationManager.AppSettings["database"]));

すべてが正常に機能し、セットアッププロジェクトでアプリをパッケージ化しました。アプリをインストールした後、データベースが見つからず、データベースをApplication Folderセットアッププロジェクトのにコピーして機能させる必要がありました。

私が思ったのは、dbはapp dllにあるはずですが、copy alwaysアクセスできません。では、正確に何を間違えたのでしょうか。

ルートデータベースに接続する必要があったのではないかと思います。Application.StartupPath

しかし、私はここでベストプラクティスを求めています。これは、私が行ったことは機能しているものの、それでも回避策のように見えるため、誰かが彼の経験を私と共有できますか?読んでくれてありがとう

4

1 に答える 1

5

Embedded Resourceデータベースがdllに組み込まれることを意味します。このCopy to output directory場合、設定は適用されず、 に使用されBuild Action: Contentます。

データベースが埋め込まれている場合は、基本的に最初の使用時に埋め込みを解除する必要があります。これを行うには、アセンブリから読み取り、ファイルに保存します。

class EmbeddedResourceTest
{
    public static void Test()
    {
        string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Test.db");

        using(var resourceStream = typeof(EmbeddedResourceTest).Assembly.GetManifestResourceStream("Test.db"))
        {
            using(var fileStream = File.OpenWrite(path))
            {
                CopyStream(resourceStream, fileStream);
            }
        }

        // now access database using 'path'
    }

    public static void CopyStream(Stream inputStream, Stream outputStream)
    {
        CopyStream(inputStream, outputStream, 4096);
    }

    public static void CopyStream(Stream inputStream, Stream outputStream, int bufferLength)
    {
        var buffer = new byte[bufferLength];
        int bytesRead;
        while ((bytesRead = inputStream.Read(buffer, 0, bufferLength)) > 0)
        {
            outputStream.Write(buffer, 0, bytesRead);
        }
    }
}
于 2010-04-23T03:35:01.120 に答える