2016-03-27 6 views
2

ローカルデータベースファイルを作成してからアプリケーションに接続する適切な方法は何ですか?私はあなたがプロジェクトフォルダの場所を変更しても動作するようにしたい。アプリケーションの終了時にデータベースのすべてのデータが削除されます

プロジェクト - >新しいアイテムを追加 - >サービスベースのデータベースを作成して作成した後、データ - >新しいデータソースを追加し、作成したデータベースを追加して接続を取得します文字列。

いいえ、私はそれを私が望むように接続することはできますが、アプリケーションを終了するとき(常にではありません)データベースからすべてのデータが消去されます。例えば

、このコード:

SqlConnection c = new SqlConnection(@"DataSource=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\DB.mdf;Integrated Security=True;User Instance=True");   
c.Open(); 
SqlCommand cmd; 
cmd = new SqlCommand("CREATE TABLE Persons (id int primary key, nume char(20), age int)"); 
cmd.ExecuteNonQuery(); 
cmd = new SqlCommand("INSERT INTO Persons VALUES (@id, @name, @age)", c); 
cmd.Parameters.AddWithValue("@id", 1); 
cmd.Parameters.AddWithValue("@name", "Catalin"); 
cmd.Parameters.AddWithValue("@age", 20); 
cmd.ExecuteNonQuery(); 

私はそれをテーブルを作成し、アイテムを追加し、その後、私はそれを実行する場合、SqlCommandオブジェクトことなく、第2のタイムテーブルを作成するために最初に実行PersonsはPersonsオブジェクトがないと言っていますが、同じコードで2回目のプロジェクトを実行すると、Personsオブジェクトが既に存在することがわかります。

私はVisual C#Express Editionを使用しています2010.

+0

"デバッグを開始する"をクリックしてプログラムを実行していますか?また、.mdfはBinフォルダにありますか?はいの場合は、プログラムをビルド/実行するたびに.mdfが上書きされる可能性があります。 –

+0

[marc_s answer](http://stackoverflow.com/a/36245969/447156)はかなり正しいです。また、['using'ステートメント](https://msdn.microsoft.com/en-us/library/yh598w02.aspx)を使用して接続とコマンドを自動的に破棄することをお勧めします。' Add'メソッドを使用する方がよいでしょうパラメータの型を指定して、[AddWithValue'ではなく、サイズを指定します。[予期しない結果が生成されることがあります](http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using- addwithvalue-already /)。 –

答えて

7

全体ユーザーインスタンスとAttachDbFileName =アプローチには欠陥があります - 最高です! Visual Studioでアプリケーションを実行すると、App_Dataディレクトリから出力ディレクトリ(通常はアプリを実行する.\bin\debug - )にコピーされます。INSERTは正常ですが、ただの間違った.mdfファイルを最後に見てください!

myConnection.Close()コールにブレークポイントを設定してから、.mdfファイルをSQL Server Mgmt Studio Expressで検査してみてください。データはほとんど確実です。私の意見では

真の解決策は、SQL Server Expressをインストールし

  1. になり

  2. SQL Server Management StudioのExpressをインストール

  3. (そして、あなたはすでにやったとにかくその)
  4. データベースをに作成するSSMS Express、論理名を付けてください(例:MyDatabase

  5. 論理名データベース名(サーバー上に作成するときに指定します)を使用して接続し、物理データベースファイルとユーザーインスタンスを混乱させないでください。その場合は、接続文字列のようなものになります:

    Data Source=.\\SQLEXPRESS;Database=MyDatabase;Integrated Security=True 
    

    と他のすべてが前とまったく同じです...

はまた、より多くのためにアーロン・ベルトランの優れたブログ記事Bad habits to kick: using AttachDbFileNameを見ます背景情報出力ディレクトリに

+0

私はあなたが私に与えた解決策が気に入っていますが、残念ながら私はVisual Studio以外のものを使用できません(私はコンテストの準備をしていますが、Visual Studio以外はインストールできません)。 mdfファイルを作成してプロジェクトフォルダのどこかに配置し、プロジェクトフォルダ内の場所を知って接続する方法はありますか?それは完璧です –

+0

@CatalinHoha:もしあなたが '.mdf'ファイルを使用しているなら、あなたは** SQLサーバもインストールしていなければなりません - Visual Studioだけでは' .mdf'ファイルでは動作できません。 –

1

変更コピーデータベース・ファイルのプロパティページで新しい場合コピーから常ににコピーを設定します。アプリケーションを実行するたびに、新しいデータベースファイルがプロジェクトからbinフォルダにコピーされるので、前の実行のすべてのデータが削除されます。

より:https://msdn.microsoft.com/en-us/library/ms246989.aspx

0

私はかなり簡単な答えを考え出したが、おそらくそれは、このようにそれを行うための最善の使用ではありません。私はこれを必要に応じて(あなたが複数のPC間でプロジェクトを移動した場合、接続はまだ動作しますが、

string path = Path.GetDirectoryName(Path.GetDirectoryName(Directory.GetCurrentDirectory))); 
SqlConnection c = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=""" + path + @"Database1.mdf"";Integrated Security=True;User Instance=True"); 

この方法: はとにかく、私はこのプロジェクトにデータベースを追加し、私はそうすることによってそれに直接接続します最も)。 これは.SDFファイルでも機能し、簡単です。

関連する問題