16

我正在使用此代码通过 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

8 回答 8

29

尝试这个:

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

还要确保您的连接字符串默认您使用master数据库或您要删除的数据库以外的任何其他数据库!

顺便说一句,您真的不需要围绕查询的所有内容。ConnectionState 将始终 start off 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;
于 2012-12-28T13:29:00.517 回答
26

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

System.Data.Entity.Database.Delete(connectionString);
于 2013-11-26T11:36:24.107 回答
4

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

数据库对象有一个Drop方法来删​​除数据库。

于 2012-12-28T13:07:42.167 回答
2

为您要删除的不同数据库创建 sqlconnection 对象。

sqlCommandText = "DROP DATABASE [DBNAME]";
sqlCommand = new SqlCommand(sqlCommandText , sqlconnection);
sqlCommand.ExecuteNonQuery();
于 2012-12-28T12:48:31.843 回答
2

在这种情况下,我建议您先将数据库脱机......这将关闭所有连接等......这里有一篇关于如何做到这一点的文章:http: //blog.sqlauthority.com/2010/04/24 /sql-server-t-sql-script-to-take-database-offline-take-database-online/

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

于 2012-12-28T13:16:32.307 回答
2

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

池化使与数据库的连接在缓存中保持活动状态,然后当您创建新的连接时,如果缓存中有一个,它会将其返回而不是实例化一个新的。他们会在默认时间(我认为是 2 分钟)徘徊,如果他们在那段时间内没有被重新使用,那么他们就会被杀掉。

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

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

ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE

再次从连接到master!

然而,其他所有使用 db 的人,都将不再喜欢你了……

于 2012-12-28T13:37:36.097 回答
1

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

"Data Source=.\SQLEXPRESS;Integrated Security=True;"
于 2016-10-18T13:43:20.093 回答
0

我遇到了和 Anshuman 一样的麻烦...通过我对 Anshuman 相关代码的测试,出现了非常简单的错误:必须有SqlConnection.ClearAllPools();而不是SqlConnection.ClearPool(con);

像这样的烦恼

“无法删除数据库,因为正在使用中......”

消失。

于 2021-12-19T21:32:17.377 回答