Удаление базы данных SQL Server через C #

Я использую этот код для удаления базы данных через 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;

Но я получаю сообщение об ошибке

Используемая база данных

Может ли кто-нибудь помочь?

9
Возможный дубликат stackoverflow.com/questions/5170429/…
добавлено автор Rui Jarimba, источник
Какая строка дает исключение?
добавлено автор Soner Gönül, источник
добавлено автор Frank van Puffelen, источник
sqlCommand.ExecuteNonQuery (); дает исключение
добавлено автор Anshuman Jasrotia, источник
@FrankvanPuffelen ваши решения работает. благодаря
добавлено автор Anshuman Jasrotia, источник
См. Удаление базы данных с C# для ответа с кодом.
добавлено автор mheyman, источник
Что такое CCMMttility?
добавлено автор GWhite, источник

7 ответы

Вот как вы это делаете, используя Entity Framework версии 6

System.Data.Entity.Database.Delete(connectionString);
19
добавлено
Это лучший ответ для меня!
добавлено автор Boris Modylevsky, источник
Ты шутишь, что ли! Я не мог найти его нигде в Интернете. В шоке, что это не выше, проголосовали.
добавлено автор goodies4uall, источник

Попробуй это:

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

Также убедитесь, что , что ваша строка подключения по умолчанию соответствует вашей базе данных master или любой другой базе данных, отличной от той, которую вы удаляете!

В стороне, вам действительно не нужно все это вокруг ваших запросов. ConnectionState всегда будет запускать Closed , поэтому вам не нужно это проверять. Аналогичным образом, объединение вашего соединения в блоке с использованием устраняет необходимость явно закрывать или удалять соединение. Все, что вам действительно нужно сделать, это:

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;
16
добавлено
SqlCommand наследует реализацию IDisposable от своего родительского класса и должен быть защищен в блоке использования.
добавлено автор David Burg, источник
Мне нужно было поставить скобки [] вокруг DbName инструкции alter, у меня были некоторые тире в моем DbName (GUID). Затем он работает как шарм.
добавлено автор Christophe Lambrechts, источник

Вы должны взглянуть на SMO . Они позволяют управлять всеми аспектами SQL Server из кода, включая удаление баз данных.

Объект базы данных имеет Drop для удаления базы данных.

4
добавлено

In this case i would recommend that you take the database offline first... that will close all connections and etc... heres an article on how to do it: http://blog.sqlauthority.com/2010/04/24/sql-server-t-sql-script-to-take-database-offline-take-database-online/

Microsoft clearly states that A database can be dropped regardless of its state: offline, read-only, suspect, and so on. on this MSDN article (DROP DATABASE (Transact-SQL))

2
добавлено

Пул соединения с угадыванием, используйте монитор активности сервера sql, чтобы убедиться.

Объединение поддерживает соединения с базой данных в кеше, а затем, когда вы создаете новый, если в кеше есть один, он передает его обратно, а не создает экземпляр нового. Они висят вокруг по умолчанию, (кажется, 2 минуты), если они не будут повторно использоваться в то время, тогда они убили.

Так как сначала нужно подключиться прямо к master, вместо использования базы данных изменений, поскольку я подозреваю, что база данных изменений просто заменит соединения в пуле.

Добавьте контрольную процедуру для используемой базы данных (используйте для этого подключение к мастеру!). Вы можете заставить базу данных быть сброшены так или иначе, сначала выполнив

ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE

снова от подключения к хозяину!

Однако все остальные, использующие db, больше не будут нравиться вам ...

2
добавлено

Создайте объект sqlconnection для другой базы данных, которую вы хотите удалить.

sqlCommandText = "DROP DATABASE [DBNAME]";
sqlCommand = new SqlCommand(sqlCommandText , sqlconnection);
sqlCommand.ExecuteNonQuery();
2
добавлено
Это то, что я вставил в вопросе.
добавлено автор Anshuman Jasrotia, источник
Я изменил базу данных, используя con.ChangeDatabase («master»);
добавлено автор Anshuman Jasrotia, источник
Создайте объект sqlconnection для другой базы данных, кроме того, что вы хотите удалить. Вы не можете удалить базу данных, используя соединение того же db.
добавлено автор sreejithsdev, источник
Я думаю, что некоторые другие ресурсы могут использовать этот db ..
добавлено автор sreejithsdev, источник

Просто не используйте имя DB в строке подключения.

"Data Source=.\SQLEXPRESS;Integrated Security=True;"
1
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)