1

3つのプロジェクトを含むVisualStudio2010ソリューションがあります。

  • SQLiteデータベースからデータを読み取ってアクションを実行するWindowsサービス
  • (SQLiteデータベースを更新することによって)サービスの動作を構成する方法を提供するWinformsアプリ
  • サービスと構成アプリからすべてのデータベースアクセスを抽象化するクラスライブラリプロジェクト(他の2つのプロジェクトでクエリを探すことなく、データベースに関係するすべてのものを将来簡単に更新できるようにします)

これらのプロジェクトはすべて同じソリューションに含まれており、Winformsアプリとサービスからの参照をクラスライブラリに追加しました。どちらのプロジェクトでも、クラスライブラリからクラスを確認して操作することはできますが、問題が発生しています。クラスライブラリプロジェクトの/Resources/ディレクトリにデータベースを作成しました(私にとっては、「共通」プロジェクトが共通データベースを格納するための唯一の適切な場所であるため)。ただし、Winformsアプリでデータベースにアクセスしようとすると、そこにあることがわかっているデータは返されません。System.Data.SQLiteには、ファイルが見つからない場合に空のデータベースファイルを作成するデフォルトの動作があるため(私の意見では奇妙な選択です)、データベースが存在するかどうかを確認することすらできません。

これにより、あるプロジェクトのファイルが別のプロジェクトでどのように参照されているかを正しく理解していないのではないかと思います。私のプロジェクトは次のようになります。

VSのソリューションマネージャーのスクリーンショット

WorkModeCommonクラスSQLiteDatabaseおよびScheduleManagerが含まれます。ScheduleManagerにはSQLiteDatabase()があり、SQLiteDatabaseはResources/WorkModeSchedules.s3dbと対話します。

WorkModeConfigAppとWorkModeServiceの両方にWorkModeCommon.ScheduleManager()があり、理論的にはすべてのデータベースの相互作用を処理する必要があります。

私のデザインに大きな欠陥がありますか、それとも私が抱えている問題を解決するのに役立つリソースを誰かに教えてもらえますか?

4

4 に答える 4

1

コンパイルされたクラスは、可視性がパブリックである限り(一部の例外を除いて)、それらを参照する外部アセンブリに表示されます。コンパイルされていないファイルは別の話です。ビルドアクションを「埋め込みリソース」として指定できます。これにより、読み取り専用の方法ではありますが、参照アセンブリからファイルにアクセスできます。他のオプション、そしておそらくあなたが望むものは、「出力ディレクトリにコピーする」を「常にコピーする」または「新しい場合はコピーする」のいずれかとして指定することです。これにより、ビルド時にファイルが出力ディレクトリにコピーされます。

于 2012-05-24T20:13:21.957 に答える
1

これが起こっていることだと思います。
共通クラスライブラリを参照する場合、それが唯一の出力であるため、参照として.dll出力を使用しているだけです。
ただし、.s3dbファイルを右クリックしてそのプロパティに移動すると、Copy to Output Directory設定をCopy if newerに設定できます。これにより、データベースファイル自体が出力ディレクトリに配置され、.dllファイルで表示できるようになります。
これで、フォームまたはサービスが共通クラスライブラリプロジェクトの出力ディレクトリから.dllファイルにアクセスすると、.s3dbファイルも参照されるため、すべて同じデータが表示されます。

これが良いデザインであるかどうかはあなたのニーズに依存します。
フォームとサービスの両方が同時に同じデータを参照している場合は、.s3dbファイルの独自のコピーではなく、少なくとも同じファイルを参照していることを確認する必要があります。
データベースにアクセスするのがフォームまたはサービスだけの場合は問題ありませんが、複数のプロセス(フォームとサービス)がアクセスしているため、共通のデータベースサーバーを選択することをお勧めします。

于 2012-05-24T20:09:34.170 に答える
1

WorkModeConfigAppのデバッグを開始すると、アプリはbin \ debugディレクトリから実行され、クラスライブラリのリソースディレクトリに到達する方法がありません。クラスライブラリを単に参照することは、VSがConfigアプリのbin/debug内にクラスライブラリのリソースディレクトリをコピーすることを意味するわけではありません。クラスライブラリにCopyLocal= trueを設定すると、VSはコンパイルされたDLLをWorkModeConfigAppのbin \ debug内にコピーしますが、リソースディレクトリのコンテンツはコピーしません。

逆に、.s3dbファイルのプロパティcopy to the output directoryを設定することもできます。この方法で、ファイルとそのディレクトリがWorkModeConfigAppのbin\debugにコピーされます。ただし、これは他の問題の原因になります。デバッグ中に、テストデータベースがクラスライブラリからのものから上書きされるリスクがあるためです。

最善のオプションは、サービスと構成アプリの構成ファイル内にこのファイルを配置する場所を保存し、前述のプロパティを台無しにしないことだと思います。

データベースについて話しているので、おそらくアプリとサービスの構成ファイルに接続文字列を追加する必要があります。必要なノードをApp.configに追加できます。以下の例を参照してください。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="WindowsFormsApplication1.Properties.Settings.MyDatabaseConnection"
            connectionString="Data Source=C:\ProgramData\MyAppName\/WorkModeSchedules.s3db;Version=3;Pooling=True;Max Pool Size=100;"/>
    </connectionStrings>
</configuration> 

次に、次のいずれかの方法を使用してこの値にアクセスできます。

string cnnString1 = ConfigurationManager.ConnectionStrings["MyDatabaseConnection"];
string cnnString2 = Properties.Settings.Default.MyDatabaseConnection;

(ConfigurationManagerメソッドには、System.Configurationアセンブリへの参照が必要です)

于 2012-05-24T20:17:44.763 に答える
0

皆さん、私は自分の問題を解決しました。私が行ったのは、各プロジェクトにDBファイルのコピーを含め、それらのインスタンスの1つ(「共通」プロジェクト)を除くすべてのインスタンスの「コピー先出力ディレクトリ」プロパティを「コピーしない」に設定することです。その後、3つのプロジェクトすべての出力ディレクトリを同じディレクトリに変更しました(より具体的には、一元化されたDebugディレクトリとReleaseディレクトリを作成し、適切なビルド構成を適切なディレクトリにポイントしました)。これで、単一のDBファイルと一元化されたクラスライブラリを使用して正常にテストできるようになりました。

于 2012-07-24T18:59:51.103 に答える