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は常に開始する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

EntityFrameworkバージョン6を使用してこれを行う方法は次のとおりです

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

SMOをご覧ください。これらを使用すると、データベースの削除など、SQLServerのすべての側面をコードから管理できます。

データベースオブジェクトには、データベースを削除するためのDropメソッドがあります。

于 2012-12-28T13:07:42.167 に答える
2

推測では接続プールですが、SQLサーバーのアクティビティモニターを使用して確認してください。

プーリングは、データベースへの接続をキャッシュ内で維持します。新しいデータベースを作成するときに、キャッシュ内にデータベースがある場合は、新しいインスタンスを作成する代わりに、データベースを返します。彼らはデフォルトの時間(私が思うに2分)の間ぶらぶらしていて、その時間に再利用されなければ、彼らは殺しました。

したがって、最初に、変更データベースを使用する代わりに、マスターに直接接続します。変更データベースは、プール内の接続を単純に交換するだけだと思います。

使用中のデータベースのチェックルーチンを追加します(マスターへの接続を使用して実行してください!)。最初に実行することで、とにかくデータベースを強制的に削除できます

ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE

再びマスターへの接続から!

しかし、dbを使用している他のすべての人は、もはやあなたを好きではなくなります...

于 2012-12-28T13:37:36.097 に答える
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.Microsoftは、このMSDNの記事(DROP DATABASE(Transact-SQL))で次のように明確に述べています。

于 2012-12-28T13:16:32.307 に答える
1

接続文字列にDB名を使用しないでください。

"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 に答える