通过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; 

但是我收到了一个错误

数据库目前正在使用中

有人可以帮忙吗?

试试这个:

 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; 

以下是使用Entity Framework第6版的方法

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

你应该看看SMO 。 这些允许您从代码管理SQL Server的所有方面,包括删除数据库。

数据库对象具有删除数据库的Drop方法。

为除要删除的数据库之外的其他数据库创建sqlconnection对象。

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

在这种情况下,我建议您首先使数据库脱机…将关闭所有连接等…下面是一篇关于如何操作的文章: http : //blog.sqlauthority.com/2010/04/24 / SQL服务器-T-SQL脚本到采取数据库脱机通吃的数据库在线/

Microsoft明确指出, A database can be dropped regardless of its state: offline, read-only, suspect, and so on. 在这篇MSDN文章(DROP DATABASE(Transact-SQL))

猜测连接池,使用sql server的活动监视器来确保。

池在缓存中保持与数据库的连接,然后在创建新缓存时,如果缓存中有一个连接,则将其交还,而不是实例化新的。 他们闲逛一段默认时间,(我认为2分钟),如果他们在那段时间没有被重复使用,那么他们就会被杀死。

因此,首先直接连接到master,而不是使用更改数据库,因为我怀疑更改数据库将只是交换池中的连接。

为正在使用的数据库添加检查例程(使用与master的连接来执行此操作!)。 您可以通过首先执行来强制删除数据库

 ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

再次从连接到高手!

然而,其他人使用数据库,将不再喜欢你…

只是不要在连接字符串中使用DB名称。

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