2012-12-28 93 views
9

我使用此代碼刪除通過C#滴SQL Server數據庫

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 + "]"; 

而且確保你的連接字符串默認你到master數據庫或任何其他數據庫以外的其他數據庫!

順便說一句,你確實不需要圍繞你的查詢所有這些東西。 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

我需要在alter語句的'DbName'周圍放置括號[],我的DbName(GUID)中有一些破折號。然後它就像一個魅力。 –

+0

SqlCommand從其父類繼承IDisposable實現,並應在使用塊中受到保護。 –

2

爲除您想要刪除的其他數據庫創建sqlconnection對象。

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

這就是我在問題中所粘貼的內容。 –

+1

爲除了要刪除的其他數據庫創建sqlconnection對象。不能使用相同數據庫的連接刪除數據庫。 – sreejithsdev

+0

我已經使用con.ChangeDatabase(「master」)更改了數據庫; –

4

你應該看看SMO。 這些允許您從代碼管理SQL Server的所有方面,包括刪除數據庫。

數據庫對象有一個Drop方法來刪除數據庫。

2

連接池在猜測,使用sql server的活動監視器,以確保雖然。

池化保持連接到數據庫在緩存中的活動,然後當你創建一個新的時,如果有一個在緩存中,它將它遞迴而不是實例化一個新緩存。如果他們在那段時間沒有被重複使用,他們會在默認的時間內停留(2分鐘),然後他們就會被殺死。

因此,作爲第一次直接連接到主,而不是使用更改數據庫,因爲我懷疑更改數據庫將簡單地交換池中的連接。

爲正在使用的數據庫添加一個檢查例程(使用連接到master來執行它!)。您可以強制數據庫首先執行

ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

再次從連接到主!

然而,其他人使用數據庫,將不再喜歡你...

15

這裏是您使用實體框架版本6

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

你在開玩笑吧!我無法在網上找到它。令人震驚的是,這不是更高的投票率。 – goodies4uall

+0

這對我來說是最好的答案! –

1

只是不要在連接字符串中使用DB名稱是怎麼做的。

"Data Source=.\SQLEXPRESS;Integrated Security=True;"