【问题标题】:Dropping SQL Server database through C#通过 C# 删除 SQL Server 数据库
【发布时间】:2021-12-20 05:43:02
【问题描述】:

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

但我得到一个错误

当前正在使用的数据库

谁能帮忙?

【问题讨论】:

标签: c# .net sql-server-2008


【解决方案1】:

试试这个:

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;

【讨论】:

  • 我需要在 alter 语句的 DbName 周围加上方括号 [],我的 DbName (GUID) 中有一些破折号。然后它就像一个魅力。
  • SqlCommand 从其父类继承 IDisposable 实现,并应在 using 块中进行保护。
【解决方案2】:

这是使用 Entity Framework 版本 6 的方法

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

【讨论】:

  • 你在开玩笑吧!我在网上的任何地方都找不到这个。令人震惊的是,这不是更高的投票。
  • 这对我来说是最好的答案!
  • 这需要Entity nuget参考吗?
  • @Sandy 是的,你需要添加EntityFramework 6 Nuget 包dotnet add package EntityFramework 或者EntityFramework Core Nuget 包dotnet add package Microsoft.EntityFrameworkCore.SqlServer
【解决方案3】:

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

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

【讨论】:

  • 谨防在项目中引用与生产环境不兼容的 SMO dll。
  • @MicahEpps:为什么?
  • 当心在项目中引用与生产环境不兼容的 SMO dll,因为如果您在开发环境中安装了 SS 版本 A,并且您部署到具有版本 B 的客户,那么dll 不会加载。
【解决方案4】:

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

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

【讨论】:

  • 这是我在问题中粘贴的内容。
  • 为要删除的不同数据库创建sqlconnection对象。不能使用同一个数据库的连接删除数据库。
  • 我已经使用 con.ChangeDatabase("master"); 更改了数据库
【解决方案5】:

在这种情况下,我建议您先使数据库脱机...这将关闭所有连接等...这里有一篇关于如何做到这一点的文章: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.this MSDN article (DROP DATABASE (Transact-SQL))

【讨论】:

    【解决方案6】:

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

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

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

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

    ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    

    再次从连接到master!

    但是其他使用 db 的人将不再喜欢你了...

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

        【解决方案8】:

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

        喜欢这个麻烦

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

        消失。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-19
          • 2011-03-10
          • 2017-10-22
          • 2014-07-31
          相关资源
          最近更新 更多