2012-02-08 22 views
5

私は非常に小さなSQL Serverデータベースを使用する非常に小さなC#プログラムを作成しました。純粋にいくつかの学習のために&のテスト目的のためです。データベースは、この1つの新しいプロジェクトで使用され、他の場所では使用されません。しかし、データベースが「別のプロセスによって使用されている」ため、プログラムが実行されないデバッグを実行している間に問題が発生しています。データベースは別のプロセスで使用されています...どのようなプロセスですか?

私のマシンを再起動すると、再び動作し、いくつかのテストを実行した後、同じ問題が再び発生します。

私は多くの、多くの同様の問題がインターネット上で報告されていることを発見しましたが、この問題を解決する方法に関して決定的な答えは見つかりません。まず、私の.mff & .ldfファイルを「他のプロセス」がどのように使用しているかを知るにはどうすればよいですか?次に、これらのファイルをリリースするにはどうすれば&は、時間の経過後にこの起こった時間を停止するために開催されていないのですか?

私はVS2010、SQL Server & C#を初めて使用しています。あなたは私に何か答えを説明してください!

これは私のコードです。ご覧のとおり、もっと基本的なものを手に入れることはできませんでした。

namespace MySqlTest 
{ 
    public partial class Form1 : Form 
    { 
     SqlConnection myDB = new SqlConnection(@"Data Source=MEDESKTOP;AttachDbFilename=|DataDirectory|\SqlTestDB.mdf;Initial Catalog=MySqlDB;Integrated Security=True"); 
     SqlDataAdapter myDA = new SqlDataAdapter(); 
     SqlCommand mySqlCmd = new SqlCommand(); 

     string mySQLcmd; 
     int myCount; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      MessageBox.Show("myDB state = " + myDB.State.ToString()); 
      //Open SQL File 
      myDB.Open(); 
      MessageBox.Show("myDB state = " + myDB.State.ToString()); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      myCount++; 
      MessageBox.Show("myCount = " + myCount.ToString()); 
      //Insert Record Into SQL File 
      mySqlCmd.Connection = myDB; 
      mySqlCmd.CommandText = "INSERT INTO Parent(ParentName) Values(myCount)"; 
      myDA = new SqlDataAdapter(mySqlCmd); 
      mySqlCmd.ExecuteNonQuery(); 
     } 

     private void button3_Click(object sender, EventArgs e) 
     { 
      //Read Record From SQL File 
     } 

     private void button4_Click(object sender, EventArgs e) 
     { 
      //Read All Records From SQL File 
     } 

     private void button5_Click(object sender, EventArgs e) 
     { 
      //Delete Record From DQL File 
     } 

     private void button6_Click(object sender, EventArgs e) 
     { 
      MessageBox.Show("myDB state = " + myDB.State.ToString()); 
      //Close SQL File 
      myDB.Close(); 
      MessageBox.Show("myDB state = " + myDB.State.ToString()); 
     } 

     private void button7_Click(object sender, EventArgs e) 
     { 
      //Quit 
      this.Close(); 
     } 
    } 
} 
+0

初めてアプリケーションを実行するときに同じエラーメッセージが表示されましたか?このエラーが2回目に発生した場合、アプリケーションがDB接続を正しく終了しなかったと思います。 –

+1

私は最初にプログラムを実行すると、うまく動作し、動作し続けますが、私は時々論理的にプログラムをデバッグして停止します。これが起き始める規則的なポイントはありませんが、DBを閉じることなくデバッグを停止することに接続している可能性があります。 VS2010はそれを処理しないだろうか? –

答えて

6

最も可能性の高いオプション:

  1. は前

することができます(表デザイナーオープンまたは類似した何かを)あなたのプログラム

  • のVisual Studioのインスタンスを(クラッシュしました) 1)TaskManagerと2)サーバーエクスプローラで確認してください。あなたのデータベースには、「閉じた」という小さな赤い十字が表示されます。

    そして、できるだけ早く接続を閉じるコードを書き直す必要があります。 try/finallyまたはusing(){ }ブロックを使用してください。

  • +0

    私のコードを書き直すことに関しては、それがこの小さなプログラムの理由です。そのため、私の実際のプログラムで使用するためにSQL Serverの処理をコード化する最良の方法を確かめることができます! Seerver Explorerでは、私のDBに赤い十字が表示されますが、まだエラーメッセージが表示されています。 –

    0

    sp_who2を実行してプロセスのリストを表示してみます。

    FYI:あなたは、あなたのマシンを再起動する必要があり、最悪の場合、SQL Serverサービス

    +0

    私はこれをちょっと試してみましょう、今すぐ学校から子供を集めなければなりません...もしあなたが正しいのであれば、私に多くの時間を節約できます! –

    +0

    OK、私たちに知らせてください:) – Diego

    +0

    OK、VS2010は私に新しいクエリを開かせませんでした、 "物理ファイルを開くことができませんでした.....オペレーティングシステムエラー32:"(これのテキストを取得できませんでしたエラー:理由:15105)。ファイル.....の自動名前付きデータベースをアタッチしようとしましたが失敗しました。SQL Server Management Studioでsp_who2を実行した結果、31個の結果が得られましたが、そのうちの下位2個のみがこのデータベースに関連しているように見えますつまり、それらはDBName列にMySqlDBを持っています。 –

    0

    はIIRC AttachDbFilenameを使用すると、ユーザーの下で実行されているSqlServr.exeプロセスは、SqlServerのインスタンスとは別の、あなたのプロセスが使用しているアカウントスピンアップ再起動しません。 MsSqlServerサービスを停止してもこの問題は解決されません。汚れた出口の場合、このプロセスは時々クリーンアップされません。私は、このプロセスを終了するとdbファイルを解放すると思う。

    +0

    以下の私の返答によると、プロセスを殺すことは、これまで役に立たなかった... –

    +0

    私はサービスに入ってMSSQLSERVERを見つけなければならなかったので、 Manual、それから物理的に停止してください。bin \ debugフォルダ内のファイルを削除することができましたか?私はStartオプションをAutomaticに変更してサービスを開始しましたが、ついには再び動作しています!!!今、私はそれが起こっている理由を見つけて、それが再び起きないようにする必要があります... –

    0

    Microsoftのテクニカルフェロー、Mark Russinovichによって書かれたProcess Explorerを試してみてください。これは、Windows Admins/Developersのポケットにある標準的なスイス軍ツールです。システム内のリソース上のハンドルを保持しているプロセスを表示できます。あなたがプロセスエクスプローラがインストールされましたら

    は、次のことを試してください。

    1. がフェイル状態にあなたのシステムを取得します(あなたのプログラムを実行すると、動作しないように)。
    2. Process Explorerを起動します(その機能をフルに活用するには、管理者である必要があります)。
    3. 上部のメニューバーで[検索]をクリックし、.mdfまたは.ldfファイルの名前を入力します。

    検索結果には、間違って終了するプロセスによって保持されているリソースの1つにハンドルを持つプロセス/サービスが表示されます。

    +0

    それはLDFファイルを見つけますが、Diego(上記)への私の返信によると、プロセスを強制終了することはできません:-(!!! –

    +0

    私はサービスに入り、MSSQLSERVERを見つけて、スタートオプションを手動に変更してから物理的に停止しなければなりませんでした。それだけでbin \ debugフォルダ内のファイルを削除できました!!!オプションを自動に戻してサービスを開始しましたが、ついには再び動作しています!!!今、なぜそれが起こっているのかを見つけ出し、それが再び起こらないようにする必要があります。 –

    1

    これは、 "を使用して"ステートメントを使用して書き直されたコードです。プログラムを実行してInsert Record into SQL Fileをクリックすると、myCount = 1のプロセスが完了します(ただし、実際に物理的な書き込みを行っているとは100%確信していませんが、実際には更新をコミットしますか?!?)、フォームを再表示します。

    次のように私は再びSQLファイルにレコードの挿入をクリックして、私はエラーを取得する場合:

    SqlException was unhandled

    Cannot open user default database. Login failed. Login failed for user 'MEDESKTOP\Gary'.

    これはプログラム(私はこのPC上のユーザーだけだと、完全な管理者権限を持っている、ですそれが期待されていたなかったように、コードを最初に通過するように見えるので、この時点でのデータベースの「状態」私は突然だ理由

    using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Data; 
    using System.Drawing; 
    using System.Linq; 
    using System.Text; 
    using System.Windows.Forms; 
    using System.Data.SqlClient; 
    
    namespace MySqlTest 
    { 
    public partial class Form1 : Form 
    { 
        int myCount; 
        string myDBlocation = @"Data Source=MEDESKTOP;AttachDbFilename=|DataDirectory|\mySQLtest.mdf;Integrated Security=True;User Instance=False"; 
    
        public Form1() 
        { 
         InitializeComponent(); 
    
        } 
    
        private void button2_Click(object sender, EventArgs e) 
        { 
         myCount++; 
         MessageBox.Show("myCount = " + myCount.ToString()); 
         //Insert Record Into SQL File 
         myDB_Insert(); 
        } 
    
        private void button3_Click(object sender, EventArgs e) 
        { 
         //Read Record From SQL File 
    
        } 
    
        private void button4_Click(object sender, EventArgs e) 
        { 
         //Read All Records From SQL File 
    
        } 
    
        private void button5_Click(object sender, EventArgs e) 
        { 
         //Delete Record From SQL File 
        } 
    
        private void button7_Click(object sender, EventArgs e) 
        { 
         //Quit 
         myDB_Close(); 
         this.Close(); 
        } 
    
        private void Form1_Load(object sender, EventArgs e) 
        { 
    
        } 
    
        private void Form1_Close(object sender, EventArgs e) 
        { 
    
        } 
    
        void myDB_Insert() 
        { 
         using (SqlConnection myDB = new SqlConnection(myDBlocation)) 
         using (SqlCommand mySqlCmd = myDB.CreateCommand()) 
         { 
          myDB.Open(); **<<< Program fails here, 2nd time through** 
          mySqlCmd.CommandText = "INSERT INTO Parent (ParentName) VALUES(@ParentNameValue)"; 
          mySqlCmd.Parameters.AddWithValue("@ParentNameValue", myCount); 
          mySqlCmd.ExecuteNonQuery(); 
          myDB.Close(); 
         } 
         return; 
        } 
    
        void myDB_Close() 
        { 
         using (SqlConnection myDB = new SqlConnection(myDBlocation)) 
         using (SqlCommand mySqlCmd = new SqlCommand()) 
         { 
          myDB.Close(); 
         } 
         return; 
        } 
    
    } 
    } 
    

    私は理解していない...、プロパティ、クローズによれば、すでに使用している自分のファイルにアクセスできなくなったのですか?!

    0

    SQL Serverを使用したVS 2010およびEntity Frameworkの操作これまで数回以上実行しました。私の場合は、プログラムを実行しようとしたときにサーバーエクスプローラでクエリを開いたときに発生しました。失敗したら、すべての接続を解除して、再び動作させる必要がありました。

    VS2010は、サーバーエクスプローラーで作業するソースデータベース(.MDFおよび.LDFファイル)をプロジェクトのデバッグフォルダーにコピーします。これは実行時に作業しているコピーです。このファイルをコピーすると、MDFプロパティCopy to Output Directoryによって制御され、デフォルトではCopy alwaysに設定されます。つまり、新しいビルドや実行でファイルをコピーしようとしますが、他の場所で開いていれば失敗し、ハングアップします。

    接続を確認する方法は、SQL Server管理コンソールを開くことです。既定では、VS2010は接続文字列で指定されているSQL Serverのユーザーインスタンスを使用しています。 Entity Frameworkの場合、App.Config XMLにあります。

    ユーザーインスタンスは、ログインしたユーザーに割り当てられているすべてのユーザー権利を持つSQL Serverのメモリコピーとは別のものです。それに到達するには、適切な接続を見つける必要があります。

    SQLのメインインスタンスからこのクエリを実行すると、すべてのユーザーインスタンス接続が表示されます。

    SELECT owning_principal_name, instance_pipe_name, heart_beat FROM sys.dm_os_child_instances 
    

    これは、このようなものが返されます:あなたは、インスタンス名をコピーして、新しい接続でサーバー名としてそれを使用する場合は、意志、それに関連付けられたユーザーとして実行されている、

    |owning_principle_name | instance_pipe_name      | heart_beat 
    -------------------------------------------------------------------------------- 
    1 | MyServer\Admin  | \\.\pipe\91B3063E-CD0F-4B\tsql\query\ | dead 
    -------------------------------------------------------------------------------- 
    2 | MyServer\Rich  | \\.\pipe\B04A1D3B-6268-49\tsql\query\ | alive 
    

    をデバッグフォルダからデータを参照してください。あなたが正しいデータベースをクリックするとTasks >Detach...を選択した場合

    今、あなたは、ダイアログDetach Databaseは次のデータベースのファイル名にDrop ConnectionsチェックボックスをチェックしてOKをクリックし開きます。

    データベースがリストから削除され、アプリケーションをビルドして実行できるはずです。

    0

    私はでこの解決策を見つけた:http://oreilly.com/catalog/errata.csp?isbn=0636920022220

    VSのデータベースエクスプローラでデータベースを右クリックし、[デバッグセッションの間には密接な接続をクリックして、それが私のために働きました。

    0

    最も簡単なのはサーバーエクスプローラです。問題のデータベースを選択します。右クリックし、[接続を閉じる]を選択します。

    既に閉じている場合は、接続して切断してください。

    0

    既にSqlTestDB.mdfが添付されていると思います。 私は以前この問題に直面していました.Sqlサーバーに移動してデータベースを切り離し、Visual Studioのサーバーエクスプローラーで接続を再構築します。

    0

    開始時にdbaseを開いていて、終了時に解放されているという確信はありません。本当にあなたはメモリマネージャーがそれを並べ替えるのを待っています。それは、ファイルが解放されるときのシステムのビジーさに依存します。

    これを「必要なときに開く」に変更する必要があると思います。

    私は、例えば、コードが自分のクラスのどのデータベースにもアクセスできるようにします。アクションが完了すると、それをリリースします。

    開閉は、オーバーヘッドを持っていますが、私は、私は次の操作を行って、それと一緒に暮らすことができます発見した、

    は、あなたのクラスに複数のエントリポイントを有する、単一のトランザクションのための1つ、および複数のトランザクションのために別の。例

    S_UpdateSingleRecord(...) 
    M_UpdateManyRecords(...) 
    

    のために私は自分自身で、彼らはデータを格納しないので、彼らは唯一にし、データベースからそれを通過、ほとんどのアプリケーションでは、これらは静的であることを見つけます。私のアプリケーションのために何かをキャッシュしたいのであれば、それは静的ステータスを失うだけです。

    私はS_SingleTransaction()で 'using'を使用します。なぜなら、それは私のためにそれをきれいにするからです。しかし、私は複数のエントリポイントを開いたままにして、私の呼び出し関数が終了すると閉じます。私は単一のmdfと1つのアプリケーションでこのロックの問題を経験したことはありません。これは、1つのmdfと複数のアプリケーションで動作するようになります。これらの場合、サービスデータベースとしてMSSQLを使用する必要があります。Visual Studioで簡単に設定できます。既にツールバーのリストにそのデータベースがあります。

    関連する問題