0

私は大学向けの小さなアプリケーション、ビデオレンタルアプリケーションを書いています。データベースからの読み取りに問題はありませんが、テーブルのデータを更新できません。

特に、誰かが映画をレンタルした後、在庫のある映画の数量を表示するセルを更新しようとしています。

これまで私はこれを試してきました:

string updateDVDs = "UPDATE Products SET dvd_quantity = " + product.Quantity + " WHERE title = '"+ product.Name +"';";
cmdUpdateDVDs = new SqlCeCommand(updateDVDs, dBConnection);
dBConnection.Open();
cmdUpdateDVDs.ExecuteNonQuery();
dBConnection.Close();

エラーは発生しませんが、テーブルのセルが更新されません。ご不明な点がございましたら、お気軽にお問い合わせください。

更新:わかりました。 興味深い開発がいくつかあります。コードを次のように更新しました。

string updateDVDs = "UPDATE Products SET dvd_quantity = " + product.Quantity + " WHERE title = '" + product.Name + "'";
dBConnection = new SqlCeConnection(connectionString);
cmdUpdateDVDs = new SqlCeCommand(updateDVDs, dBConnection);
cmdUpdateDVDs.Connection.Open();
int rows = cmdUpdateDVDs.ExecuteNonQuery();
dBConnection.Close();

MSDNを見ると、どちらの方法も有効であることがわかりますが、この2番目の方法は機能しているようです。今、奇妙なことに、私は映画「ダイ・ハード」を借りています、それはすべて泳ぎに行きます、私はこれらの結果を得ます:

データベースが更新されました

よし、この時点から戻る方法はないので、アプリケーションを終了してやり直します。もう一度「ダイ・ハード」を借りて確認し、成功!! DVDの数量の新しい読み取り値は、予想どおり0です。 DVDの数量が正常に更新されました!

しかし、Visual StudioでProductテーブルを開くと、元の値はまだそこにあります。 Visual Studioでは、テーブルは更新されていません

それだけでなく、Visual Studioでテーブルを開いた後でアプリケーションを再度実行すると、DVDの数量が元の値にリセットされ、更新された値が失われます。

ここで簡単なものが欠けていますか?テーブルを更新してみましたが、違いはありません。Visual Studioでテーブルを開かない限り、アプリケーションは、何度実行しても、テーブル自体を開くまで、期待どおりに更新されます。

4

2 に答える 2

2

「binフォルダ内のデータベースを指すように接続を更新しました」など、使用している接続文字列を正確に指定する必要があります。次のような接続文字列を使用していますc:\Users\Me\Visual Studio 2010\Projects\MyProject\bin\debug\HKRMoviesDB.sdfか?これは正しくありません。これは、マシンのVS2010デバッグテストフォルダーにハードコードされており、他のユーザーには機能せず、デバッガーから実行した場合にのみ機能し、アプリの展開時には機能しません。

ADO.NETは、接続文字列内の垂直バーを検索し、AppDomainプロパティを使用して囲まれた文字列を展開します。たとえばData Source=|DataDirectory|\HKRMoviesDB.sdf、VSデバッガーから使用する場合DataDirectoryは、プロジェクトのbinフォルダーに展開され、VSがデバッグDLLをコピーします。MSIインストーラーを使用してアプリを展開する場合はDataDirectory、ユーザーが選択したアプリのインストールフォルダーに展開されます。さらなる説明はこの答えにあります。

DataDirectoryユーザーが書き込み可能なディレクトリではない可能性があることに注意してください。これは読み取り専用データに適したディレクトリですが、ユーザーにファイルへの書き込みを許可する場合は、この回答Environment.SpecialFolder.ApplicationDataで説明されているように、ファイルをアプリのどこかにコピーする必要があります。

覚えておくべきことがもう1つあります。デバッグしているときは、通常、元のソースデータをデバッグフォルダーにコピーしてテストしてから、テストデータを破棄します。これは、通常、テストデータを最終的な展開に含めたくないためです。これは、プロジェクトの「出力ディレクトリにコピー」プロパティが行うことです。「新しい場合はコピー」に設定されている場合(おそらくそうあるはずです)、テストデータに加えた変更は一時的なものです。次回プロジェクトで元のソースデータを更新すると、テストデータは破棄されます。DataDirectoryアプリケーションのデプロイメントディレクトリは通常、ユーザーが書き込みできないため、とにかくユーザーデータを書き込むべきではないことを忘れないでください。

于 2012-11-09T17:34:19.957 に答える
0

仲間の学生が私にこれを指摘しました:

「私が理解していることから、データベースへのパスをハードコーディングしない限り、コードが更新するデータベースは/ bin / debug /フォルダー内のファイルです。Visualstudioで表示するファイルは、プロジェクトルート内のファイルです。」

binフォルダー内のデータベースを指すように接続を更新しました。

于 2012-11-09T09:42:31.323 に答える