0

aspnet(c#) からデータベースを削除しようとしています。しかし、それは私にエラーを与えています:いくつかの接続があります. すべての接続を削除した場合:

SELECT pg_terminate_backend (pg_stat_activity.pid) FROM pg_stat_activity 
WHERE pg_stat_activity.pid <> pg_backend_pid() and pg_stat_activity.datname = 'databsename';

別のエラーが表示されます:接続が失われます。

上記の文を実行すると、すべての接続が閉じられます。

コネクタとして npgsql を使用します。

ここに私のコード: ボタン内のコード:

NpgsqlConnection _connPgComienzo = new NpgsqlConnection("my_connection_to_other_DDBB_in_the_same_server;");

    try
    {

        _connPgComienzo.Open();
        FileInfo file1 = new FileInfo(Server.MapPath("desconectar.sql"));
        string script_crear_bbdd = file1.OpenText().ReadToEnd();
        var m_createdb_cmd1 = new NpgsqlCommand(script_crear_bbdd, _connPgComienzo);
        m_createdb_cmd1.ExecuteNonQuery();
        _connPgComienzo.Close();

        _connPgComienzo.Open();
        FileInfo file2 = new FileInfo(Server.MapPath("drop_bbdd.sql"));
        string script_crear_bbdd2 = file2.OpenText().ReadToEnd();
        var m_createdb_cmd2 = new NpgsqlCommand(script_crear_bbdd2, _connPgComienzo);
        m_createdb_cmd2.ExecuteNonQuery();
        _connPgComienzo.Close();

    }
    catch (Exception ex)
    {

    }

desconectar.slq:

SELECT pg_terminate_backend (pg_stat_activity.pid) FROM pg_stat_activity 
WHERE pid <> pg_backend_pid() AND pg_stat_activity.datname = 'theDDBBIWantToDrop';

drop_bbdd.sql:

 DROP DATABASE theDDBBIWantToDrop;
4

1 に答える 1

0

*psqlあなたのを終了するために使用してみてくださいpostgreSQL database

  • そのためには、C# を使用して作成するbatch file(*.bat)必要があります。この .bat ファイルには、データベース接続を終了する次のスクリプトが含まれている必要があります。

psql -U postgres -d postgres -c SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname ='yourdb'

例えば

Private Sub TerminateDBactivity()
    Dim strPG_dumpPath As String
    Dim strSub As String
    strPG_dumpPath = Application.StartupPath.ToString()
    strPG_dumpPath = strPG_dumpPath.Replace("\", "\\")
    Dim a As Integer = strPG_dumpPath.IndexOf(":\\", 0)
    a = a + 2
    strSub = strPG_dumpPath.Substring(0, (a - 2))
    strPG_dumpPath = strPG_dumpPath.Substring(a, (strPG_dumpPath.Length - a))
    Dim sbSB1 As New StringBuilder(strPG_dumpPath)
    sbSB1 = sbSB1.Replace("\\", vbCrLf & vbCrLf & "cd ")
    Dim sbSB2 As New StringBuilder("cd /D ")
    sbSB2 = sbSB2.Append(strSub)
    sbSB2 = sbSB2.Append(":\")
    sbSB1 = sbSB2.Append(sbSB1)
    sbSB1 = sbSB1.Append(vbCrLf & vbCrLf & "cd PG" & vbCrLf & vbCrLf)
    Dim sw As New StreamWriter(Application.StartupPath.ToString() & "\PG\pgTerminate.bat")
    If sbSB1.Length <> 0 Then
        sbSB1 = sbSB1.Append("psql -U postgres  -d postgres -c ""SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '" & gStrDBName & "';")
        sw.WriteLine(sbSB1)
        sw.Dispose()
        sw.Close()
        Dim processDB As New ProcessStartInfo
        processDB.FileName = Application.StartupPath.ToString() & "\PG\pgTerminate.bat"
        processDB.WindowStyle = ProcessWindowStyle.Hidden
        Process.Start(processDB).WaitForExit()
        Cursor.Current = Cursors.Default
    End If
End Sub
  • このコードはpgTerminate.bat、このパスにファイルを作成しますD:\Apps\RSTAR PGSQL DOTCONNECT\bin\Debug\PG

  • pgTerminate.batのように見える

    cd /DD:\アプリ

cd RSTAR PGSQL DOTCONNECT

cd bin

cd Debug

cd PG

psql -U postgres  -d postgres -c SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = 'mydb';

注:コードを試す前に、手動で終了バットファイルを作成し、それが機能しているかどうかをテストする必要があります

于 2014-06-09T11:47:15.530 に答える