2014-06-09 71 views
0

我想从aspnet(c#)中删除数据库。但它给了我一个错误:有一些联系。 如果我删除所有连接:Drop Postgresql数据库

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; 
+0

http://stackoverflow.com/questions/17449420/postgresql-unable-to-drop-database- because -of-some-auto-connections-to-db?rq = 1 – Endrju

+0

它不适用于我。 而我不想阻止连接,我想突然删除数据库。 我编辑说,是的,它在postgresql客户端(maestro),但不工作在C# – Za7pi

+0

向我们显示的代码不工作。编辑你的问题并粘贴它。 – Endrju

回答

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 
  • 此代码将在这条道路D:\Apps\RSTAR PGSQL DOTCONNECT\bin\Debug\PG

  • pgTerminate.bat看起来像

    CD/DD创建pgTerminate.bat文件:\ 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文件和测试无论其工作与否

+0

蝙蝠是好吗? 这条线是在蝙蝠内部还是外部? 'cd/D D:\ Apps' – Za7pi

+2

@hector你的答案帮助了我! –

+0

@ Za7pi它里面只有...定义'psql'的路径在你的情况下,这将改变 –