Cannot drop database because it is currently in use

后端 未结 17 1369
北恋
北恋 2020-12-07 11:50

I want to drop a database. I have used the following code, but to no avail.

public void DropDataBase(string DBName,SqlConnection scon)
{
    try
    {
               


        
相关标签:
17条回答
  • 2020-12-07 12:47

    To delete a database even if it's running, you can use this batch file

    @echo off
    
    set /p dbName= "Enter your database name to drop: " 
    
    echo Setting to single-user mode
    sqlcmd -Q "ALTER DATABASE [%dbName%] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE"
    
    echo Dropping...
    sqlcmd -Q "drop database %dbName%"
    
    echo Completed.
    
    pause
    

    0 讨论(0)
  • 2020-12-07 12:50

    just renaming the DB (to be delete) did the trick for me. it got off the hold of whatever process was accessing the database, and so I was able to drop the database.

    0 讨论(0)
  • 2020-12-07 12:51

    It's too late, but it may be useful for future users.

    You can use the below query before dropping the database query:

     alter database [MyDatbase] set single_user with rollback immediate
    
     drop database [MyDatabase]
    

    It will work. You can also refer to

    How do I specify "close existing connections" in sql script

    I hope it will help you :)

    0 讨论(0)
  • 2020-12-07 12:51

    Just wanted to give a vb.net (as with c language if want to convert..) I was having similar problem for uninstal of one of my programs, dropping the DB was bit tricky, yes could get users to go into server drop it using Express, but thats not clean, after few looks around got a perfect little bit of code together...

        Sub DropMyDatabase()
        Dim Your_DB_To_Drop_Name As String = "YourDB"
        Dim Your_Connection_String_Here As String = "SERVER=MyServer;Integrated Security=True"
        Dim Conn As SqlConnection = New SqlConnection(Your_Connection_String_Here)
    
        Dim AlterStr As String = "ALTER DATABASE " & Your_DB_To_Drop_Name & " SET OFFLINE WITH ROLLBACK IMMEDIATE"
        Dim AlterCmd = New SqlCommand(AlterStr, Conn)
    
        Dim DropStr As String = "DROP DATABASE " & Your_DB_To_Drop_Name
        Dim DropCmd = New SqlCommand(DropStr, Conn)
    
        Try
            Conn.Open()
            AlterCmd.ExecuteNonQuery()
            DropCmd.ExecuteNonQuery()
            Conn.Close()
    
        Catch ex As Exception
            If (Conn.State = ConnectionState.Open) Then
                Conn.Close()
            End If
            MsgBox("Failed... Sorry!" & vbCrLf & vbCrLf & ex.Message)
        End Try
    End Sub
    

    Hope this helps anyone looking xChickenx

    UPDATE Using this converter here is the C# version :

    public void DropMyDatabase()
        {
            var Your_DB_To_Drop_Name = "YourDB";
            var Your_Connection_String_Here = "SERVER=MyServer;Integrated Security=True";
            var Conn = new SqlConnection(Your_Connection_String_Here);
    
            var AlterStr = "ALTER DATABASE " + Your_DB_To_Drop_Name + " SET OFFLINE WITH ROLLBACK IMMEDIATE";
            var AlterCmd = new SqlCommand(AlterStr, Conn);
    
            var DropStr = "DROP DATABASE " + Your_DB_To_Drop_Name;
            var DropCmd = new SqlCommand(DropStr, Conn);
    
            try
            {
                Conn.Open();
                AlterCmd.ExecuteNonQuery();
                DropCmd.ExecuteNonQuery();
                Conn.Close();
    
            }
            catch(Exception ex)
            {
                if((Conn.State == ConnectionState.Open))
                {
                    Conn.Close();
                }
                Trace.WriteLine("Failed... Sorry!" + Environment.NewLine + ex.Message);
            }
        }
    
    0 讨论(0)
  • 2020-12-07 12:52

    Using MS SQL Server 2008, in DELETE dialog with Close connection options, this is the generated script, I guess it is the best:

    EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'YOUR_DATABASE_NAME'
    GO
    USE [master]
    GO
    ALTER DATABASE [YOUR_DATABASE_NAME] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE
    GO
    USE [master]
    GO
    /****** Object:  Database [YOUR_DATABASE_NAME]    Script Date: 01/08/2014 21:36:29 ******/
    DROP DATABASE [YOUR_DATABASE_NAME]
    GO
    
    0 讨论(0)
提交回复
热议问题