2012-12-28 28 views
9

を通じて私はC#の削除SQL ServerデータベースC#

Int32 result = 0; 

try 
{ 
     String Connectionstring = CCMMUtility.CreateConnectionString(false, txt_DbDataSource.Text, "master", "sa", "happytimes", 1000); 

     SqlConnection con = new SqlConnection(); 
     con.ConnectionString = Connectionstring; 

     String sqlCommandText = "DROP DATABASE [" + DbName + "]"; 
     if (con.State == ConnectionState.Closed) 
     { 
      con.Open(); 
      SqlConnection.ClearPool(con); 
      con.ChangeDatabase("master"); 
      SqlCommand sqlCommand = new SqlCommand(sqlCommandText, con); 
      sqlCommand.ExecuteNonQuery(); 
     } 
     else 
     { 
      con.ChangeDatabase("master"); 
      SqlCommand sqlCommand = new SqlCommand(sqlCommandText, con); 
      sqlCommand.ExecuteNonQuery(); 
     } 



     con.Close(); 
     con.Dispose(); 
     result = 1; 
    } 
    catch (Exception ex) 
    { 
     result = 0; 
    } 
    return result; 

を介してデータベースを削除するには、このコードを使用しています。しかし、私は、現在使用されている

エラー

データベースを取得誰も助けることができますか?

+4

http://knownexception.blogspot.com/2010/05/mssql-cannot-drop-database-because-it.html –

+0

? –

+0

可能な複製http://stackoverflow.com/questions/5170429/deleting-database-from-c-sharp –

答えて

16

これを試してみてください:

String sqlCommandText = @" 
ALTER DATABASE " + DbName + @" SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
DROP DATABASE [" + DbName + "]"; 

はまた に必ず接続文字列のデフォルトはあなたを作ります210データベース、または削除しているデータベース以外のデータベースを使用してください。

脇に、あなたは本当にあなたの質問の周りにすべてのものを必要としません。 ConnectionStateは常にClosedから開始されるので、それをチェックする必要はありません。同様に、usingブロックで接続をラップすると、接続を明示的に閉じるか廃棄する必要がなくなります。

String Connectionstring = CCMMUtility.CreateConnectionString(false, txt_DbDataSource.Text, "master", "sa", "happytimes", 1000); 

using(SqlConnection con = new SqlConnection(Connectionstring)) { 
    con.Open(); 
    String sqlCommandText = @" 
     ALTER DATABASE " + DbName + @" SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
     DROP DATABASE [" + DbName + "]"; 
    SqlCommand sqlCommand = new SqlCommand(sqlCommandText, con); 
    sqlCommand.ExecuteNonQuery(); 
} 
result = 1; 
+0

私はDbName(GUID)にダッシュをいくつか入れていましたが、alter文の 'DbName'の前後に大括弧[]を入れる必要がありました。それは魅力のように機能します。 –

+0

SqlCommandは、親クラスからIDisposable実装を継承し、使用ブロックで保護する必要があります。 –

2

削除したいデータベース以外のデータベース用にsqlconnectionオブジェクトを作成します。

sqlCommandText = "DROP DATABASE [DBNAME]"; 
sqlCommand = new SqlCommand(sqlCommandText , sqlconnection); 
sqlCommand.ExecuteNonQuery(); 
+1

これは私が質問に貼り付けたものです。 –

+1

削除するデータベース以外のデータベースに対してsqlconnectionオブジェクトを作成します。同じdbの接続を使用してデータベースを削除することはできません。 – sreejithsdev

+0

私はcon.ChangeDatabase( "master")を使ってデータベースを変更しました。 –

4

SMOをご覧ください。 これらを使用すると、データベースの削除を含め、コードからSQL Serverのあらゆる側面を管理できます。

データベースオブジェクトには、データベースを削除する方法がDropあります。私はあなたが最初にデータベースをオフラインにすることをお勧めします...すべての接続を閉じ、などということ... HERESにそれを行う方法についての記事をここで

2

推測で接続をプールするには、SQL Serverのアクティビティモニターを使用して確認してください。

プーリングでは、キャッシュ内にデータベースへの接続が維持されています。新しいプールを作成すると、キャッシュ内にキャッシュがある場合は、新しいものをインスタンス化する代わりに戻します。彼らは、その時間に再利用されなければ、デフォルト時間(2分の私は思う)の周りにハングアップし、その後彼らは殺した。

変更データベースを使用するのではなく、データベースに変更を加えるだけでプール内の接続が交換されるため、最初の接続はそのままマスターに接続します。

使用中のデータベースのチェックルーチンを追加します(マスターとの接続を使用してください)。とにかく最初に実行することによってデータベースを強制的に削除することができます

ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

また、接続先のマスターから!

しかし、dbを使用しているすべての人は、もはやあなたを好きではありません...ここで

15

はあなただけで、接続文字列でDB名を使用していないEntity Frameworkのバージョン6

System.Data.Entity.Database.Delete(connectionString); 
+0

あなたは私を冗談していますか?私はこれをどこでもオンラインで見つけることができませんでした。ショックではこれは高く評価されていません。 – goodies4uall

+0

それは私にとって最高の答えです! –

1

を使用してそれを行う方法です。行が例外を与える

"Data Source=.\SQLEXPRESS;Integrated Security=True;" 
関連する問題