【问题标题】:Drop Postgresql database删除 Postgresql 数据库
【发布时间】:2014-07-29 22:10:23
【问题描述】:

我正在尝试从 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;

【问题讨论】:

  • 它对我不起作用。而且我不想阻止连接,我想突然删除数据库。我编辑说是的,它在 postgresql 客户端(maestro)中工作,但在 C# 中不工作
  • 向我们展示无效的代码。编辑您的问题并粘贴。
  • @Za7pi 您可以使用上述查询使用pAdmin 或您使用的任何方法终止您的数据库吗??
  • @Za7pi 你想restore PostgreSQL-Database 使用c# 还是什么??

标签: c# asp.net postgresql npgsql drop-database


【解决方案1】:

*尝试使用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
  • 此代码将在此路径D:\Apps\RSTAR PGSQL DOTCONNECT\bin\Debug\PG 中创建pgTerminate.bat 文件

  • pgTerminate.bat 看起来像

    cd /D D:\Apps

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';

注意:在尝试代码之前,您应该手动创建终止 bat 文件并测试其是否工作

【讨论】:

  • 蝙蝠还好吗?这条线是在球棒里面还是外面? cd /D D:\Apps
  • @hector 你的回答帮助了我!!
  • @Za7pi 仅在其内部...在您的情况下,它定义了 psql 的路径,这将改变
  • 我的代码:string str_Path = Server.MapPath(".") + "\\run.bat"; ProcessStartInfo processInfo = new ProcessStartInfo(str_Path); processInfo.UseShellExecute = false; Process batchProcess = new Process(); batchProcess.StartInfo = processInfo; batchProcess.Start(); bat: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 = 'DDBB'; 错误:其他用户正在访问数据库“myDDBB”
猜你喜欢
  • 2019-12-13
  • 2013-02-12
  • 2011-10-27
  • 2017-08-18
  • 1970-01-01
  • 2020-04-18
  • 2021-09-23
  • 2012-07-08
  • 1970-01-01
相关资源
最近更新 更多