前提・実現したいこと
C#からPostgreSQLの操作を行っています。
DBをバックアップ→DB削除→空のDBを作る→バックアップしたDBを復元までを行おうとしています。
発生している問題・エラーメッセージ
エラーメッセージは出ておらず、どこも例外がcatchされることなく終了するのですが、
データベースの削除が出来ていません。
それ以降の部分も、ファイル削除以外は出来ていないと思われます。
以下ソースコードです。
別プロジェクトでやりたい事を、実験的に書いているので、
メソッド全然作ってないですが気にしないでください…。
該当のソースコード
C#
1using Npgsql; 2using System; 3using System.Collections.Generic; 4using System.Diagnostics; 5using System.IO; 6 7namespace StudyingPostgreSQL 8{ 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 NpgsqlConnectionStringBuilder connect = new NpgsqlConnectionStringBuilder 14 { 15 Host = "localhost", 16 Port = 5432, 17 UserName = "postgres", 18 Password = "postgres", 19 Database = "test", 20 SearchPath = "test", 21 }; 22 23 string fileName_ = @"C:\Users\MyName\Desktop\" + DateTime.Now.ToString("yyyyMMdd-HHmmss") + @".all.dump.backup"; 24 25 #region 1.DBをバックアップする 26 try 27 { 28 var p = new Process(); 29 30 p.StartInfo.UseShellExecute = false; 31 p.StartInfo.RedirectStandardOutput = true; 32 p.StartInfo.RedirectStandardError = true; 33 p.StartInfo.CreateNoWindow = true; 34 p.StartInfo.FileName = "pg_dump.exe"; 35 p.StartInfo.RedirectStandardInput = false; 36 37 var tokens = new List<string>(); 38 tokens.Add("-h"); // ホスト 39 tokens.Add("localhost"); 40 tokens.Add("-p"); // ポート 41 tokens.Add("5432"); 42 tokens.Add("-U"); // ユーザー 43 tokens.Add("postgres"); 44 tokens.Add("-Z"); // 圧縮 45 tokens.Add("9"); // 圧縮レベル最大 46 tokens.Add("-f"); // 出力ファイル名 47 tokens.Add(fileName_); 48 tokens.Add("test"); // DB名 49 50 p.StartInfo.Arguments = String.Join(" ", tokens.ToArray()); 51 52 p.Start(); 53 p.BeginOutputReadLine(); 54 p.BeginErrorReadLine(); 55 p.WaitForExit(); 56 p.Close(); 57 p.Dispose(); 58 59 Console.WriteLine("バックアップが完了しました。"); 60 } 61 catch (Exception e) 62 { 63 Console.WriteLine(e.Message); 64 } 65 #endregion 66 67 #region 2.DBを削除 68 try 69 { 70 using (var conn = new NpgsqlConnection(connect)) 71 { 72 conn.Open(); 73 74 NpgsqlCommand command = new NpgsqlCommand(@"disconnect test", conn); 75 76 Console.WriteLine("testデータベースから切断されました。"); 77 } 78 } 79 catch (Exception e) 80 { 81 Console.WriteLine(e.Message); 82 } 83 84 try 85 { 86 using (var conn = new NpgsqlConnection(connect)) 87 { 88 conn.Open(); 89 90 NpgsqlCommand command = new NpgsqlCommand(@"drop database test", conn); 91 92 Console.WriteLine("testデータベースを削除しました。"); 93 } 94 } 95 catch (Exception e) 96 { 97 Console.WriteLine(e.Message); 98 } 99 #endregion 100 101 #region 新規DBを作成 102 try 103 { 104 using (var conn = new NpgsqlConnection(connect)) 105 { 106 conn.Open(); 107 108 NpgsqlCommand command = new NpgsqlCommand(@"create database test", conn); 109 110 Console.WriteLine("データベースを作成しました。"); 111 } 112 } 113 catch (Exception e) 114 { 115 Console.WriteLine(e.Message); 116 } 117 #endregion 118 119 #region バックアップファイルをレストア 120 try 121 { 122 var p = new Process(); 123 124 p.StartInfo.UseShellExecute = false; 125 p.StartInfo.RedirectStandardOutput = true; 126 p.StartInfo.RedirectStandardError = true; 127 p.StartInfo.CreateNoWindow = true; 128 p.StartInfo.FileName = "pg_restore.exe"; 129 p.StartInfo.RedirectStandardInput = false; 130 131 var tokens = new List<string>(); 132 tokens.Add(fileName_); 133 tokens.Add("-d"); // DB名 134 tokens.Add("test"); 135 tokens.Add("-h"); // ホスト 136 tokens.Add("localhost"); 137 tokens.Add("-p"); // ポート 138 tokens.Add("5432"); 139 tokens.Add("-U"); // ユーザー名 140 tokens.Add("postgres"); 141 tokens.Add("-W"); // パスワード 142 tokens.Add("postgres"); 143 144 p.StartInfo.Arguments = String.Join(" ", tokens.ToArray()); 145 146 p.Start(); 147 p.BeginOutputReadLine(); 148 p.BeginErrorReadLine(); 149 p.WaitForExit(); 150 p.Close(); 151 p.Dispose(); 152 153 Console.WriteLine("バックアップが完了しました。"); 154 } 155 catch (Exception e) 156 { 157 Console.WriteLine(e.Message); 158 } 159 #endregion 160 161 #region リストアしたバックアップファイルを削除 162 try 163 { 164 File.Delete(fileName_); 165 } 166 catch (Exception e) 167 { 168 Console.WriteLine(e.Message); 169 } 170 #endregion 171 finally 172 { 173 Console.WriteLine("何かキーを押してください..."); 174 Console.ReadKey(); 175 } 176 } 177 } 178}
試したこと
NpgsqlCommandからDB削除を試みましたが、同様の結果でした。
また、connectのPassword、Databaseを他のもの(デフォルトで入っているpostgres)に、
切り替えても同様でした。
参考になりそうなサイトでも構いません。
ご教授いただければ幸いです。
補足情報(FW/ツールのバージョンなど)
.NET Framework 4.5
追記
以下、上記プログラムを実行した際に出力される内容です。
バックアップが完了しました。 testデータベースから切断されました。 testデータベースを削除しました。 データベースを作成しました。 バックアップが完了しました。 何かキーを押してください...
- NpgsqlやSQLからデータベースの接続・切断は出来ない?
Cの組み込みだとDISCONNECTという構文があるようなのですが。
- デフォルトのpostgresデータベースに接続している間に、testデータベースを削除しようとしたのですが、
testデータベースの接続を切断→postgresデータベースに接続する方法が分かりませんでした…。
DROP DATABASEやCREATE DATABASEはSQLの構文なので動いているようではあるのですが。