質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

1回答

739閲覧

DBがコマンドから削除されない

heart_crimson

総合スコア15

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

2クリップ

投稿2018/07/09 10:13

編集2018/07/10 08:01

前提・実現したいこと

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の構文なので動いているようではあるのですが。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mather

2018/07/09 10:18

Console.WriteLine で出力しているデバッグログも追記してはどうでしょうか。
heart_crimson

2018/07/09 10:21

コメントありがとうございます。デバッグログとはどのように出力すればよいのでしょうか? 無知で大変申し訳ございません…。
mather

2018/07/09 10:24

Console.WriteLine("バックアップが完了しました。"); など書いてますよね。これが出力されていると思うのですが、それをコピペしてください。
heart_crimson

2018/07/09 10:31

>mather様 追記しました。質問内容に記載している通り、catch文に入っていないので、try文の所だけしか出力されておりませんが大丈夫でしょうか…?
heart_crimson

2018/07/09 10:47

>Orlofsky様 コメントありがとうございます。 最初に調べたやり方がこういう書き方であったため、やり方にこだわりはありません。NpgsqlCommandでバックアップもリストアも出来る、という話で問題ないでしょうか? 一度自分で調べてみますので、少々お時間いただければ幸いです…。
Orlofsky

2018/07/09 10:54

PostgreSQLに限らず、データベースにバックアップやリストアできるユーティリティが提供されているのにそれを使わないのではて?と思っただけです。わざわざバックアップやリストアするコードを書くより、業務で必要なプログラムコードを書いた方が建設かと。
heart_crimson

2018/08/23 01:06 編集

>Orlofsky様 返信遅くなり申し訳ございません。一度、上記の試してみたのですが構文エラーが出てしまいます。NpgsqlCommandに「pg_dump -U postgres test」は間違いなのでしょうか?
guest

回答1

0

データベースの削除が出来ていません。

削除した後にまた作成を実行していますよね。削除されていなかったらここでエラーが起こると思うのですが、エラーがないということは削除に成功しているんだと思いますよ?

あと、 pg_restore を実行しているのにログには「バックアップが完了しました。」と出力しています。「リストアが完了しました。」などのほうがいいですね。

投稿2018/07/09 10:34

mather

総合スコア6753

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

heart_crimson

2018/07/09 11:03

回答ありがとうございます。 確かに!と思って、レストア部分のtokens.Add(fileName_);のfileName_を、 別のデータベースのパス(レコードを一つinsertしただけで、それ以外のテーブル数等に変わりはなし) に書き換えてみたのですが、DBが入れ替わっていないようです。 (プログラム実行前と後でレコードに違いが出るはずなのに出ない) WriteLineで出力される文字列にも変わりはありません。 pg_restoreの出力部分については修正いたしました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問