2012-12-28 71 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;"