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

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

ただいまの
回答率

89.05%

C#でMySQLを使ってSQLをエクスポートしたい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,177

KFSIT

score 29

いつも大変お世話になっております。

C#を使ってMySQLの特定のテーブルのSQLをエクスポートする機能を作ろうとしています。
テーブル内のデータを出力するのではなく、テーブルを定義するSQL文が記述されたファイルをエクスポートするというものです。
ですが、調べて出てきたSQL通りにやってもうまくいきません。
どなたかご教授願います
下記は自分が記述しているコードです。

        var id = textBox1.Text;
            var password = textBox2.Text;
            var db = textBox3.Text;
            var ip = textBox4.Text;
            var table = textBox30.Text;
            if (id == "" || password == "" || db == "" || ip == ""||table=="")
            {
                textBox5.Text = "未入力の項目があります。";
                return;
            }
            string connection = "userid=" + id + ";password=" + password + ";database=" + db + ";server=" + ip + ";";
            MySqlConnection conn = new MySqlConnection(connection);
            MySqlCommand da=new MySqlCommand("select * from " + table + " into outfile \"C:\\DB_Export\\backup.csv\" fields terminated by ',';", conn);
            DataTable dt = new DataTable("DB");
            try
            {
                da.ExecuteNonQuery();
                textBox5.Text = "csvファイルの出力に成功しました。";
            }
            catch (Exception)
            {
                textBox5.Text = "データベースへの接続に失敗しました。";
       }


上記のコードを実行すると
InvalidOperationExceptionはハンドルされませんでした。
型 'System.InvalidOperationException' のハンドルされていない例外が MySql.Data.dll で発生しました

追加情報:Connection must be valid and open.

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2017/07/05 13:48

    エラーメッセージを書いてください。略さないで、コピペして。

    キャンセル

  • KFSIT

    2017/07/05 13:52

    エラーメッセージを追記しました、見ていただけるとありがたいです。

    キャンセル

回答 3

+1

一度以下のようなコードで DataTable を作って、それを CSV ファイルにするようにしてはいかがですか?

テキストボックスのユーザー入力から接続文字列やクエリを組み立てるのは次のステップでやるようにして、まずは固定してやってみることをお勧めします。

public DataTable CreateDataTable()
{
    string connString = "接続文字列";
    string query = "SELECT * FROM Table";
    using (MySqlConnection connection = new MySqlConnection(connString))
    {
        MySqlCommand command = new MySqlCommand(query, connection);
        MySqlDataAdapter adapter = new MySqlDataAdapter();
        adapter.SelectCommand = command;

        DataSet ds = new DataSet();
        adapter.Fill(ds);

        return ds.Tables[0];
    }
}

まずはここまで実装してみて、CreateDataTable メソッドの戻り値に DataTable が取得できるかどうかを調べて下さい。

その上で、DataTable から CSV ファイルを生成するコードを追加するというように順を追ってやっていくことをお勧めします。

DataTable から CSV ファイルを作る方法は、CSV DataTable をキーワードにググると多々ヒットしますのでご自分で調べてください。

【2017/7/6 11:24 追記】

2017/07/06 11:08 の私のコメントに「自分の PC で mysqldbexport を使ってどのようなバックアップ用のスクリプトが生成されるかの例を回答欄に書いておきます」と書きましたが、それを以下に書いておきます。

既存の test という名前のデータベースのバックアップを取るため、コマンドラインから、

mysqldbexport --server=root:****@localhost --export=both test > e:\test.sql

と入力すると(**** はパスワード)、e ドライブに test.sql という名前で以下の内容のファイルが生成されます。 

# WARNING: Using a password on the command line interface can be insecure.
# Source on localhost: ... connected.
# Exporting metadata from `test`
DROP DATABASE IF EXISTS `test`;
CREATE DATABASE `test`;
USE `test`;
# TABLE: `test`.`employees`
CREATE TABLE `employees` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Name` varchar(50) NOT NULL,
  `Title` varchar(50) NOT NULL,
  `Description` varchar(250) DEFAULT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
# TABLE: `test`.`products`
CREATE TABLE `products` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `ProductName` varchar(50) NOT NULL,
  `Price` decimal(10,0) NOT NULL,
  `Remarks` varchar(250) DEFAULT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
# TABLE: `test`.`テストテーブル`
CREATE TABLE `テストテーブル` (
  `id` int(11) NOT NULL,
  `name` varchar(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#...done.
USE `test`;
# Exporting data from `test`
# Data for table `test`.`employees`:
# Data for table `test`.`products`:
INSERT INTO `test`.`products` VALUES (1, 'Orange', 100, 'Califolnia');
INSERT INTO `test`.`products` VALUES (2, 'Apple', 150, 'From Japan');
INSERT INTO `test`.`products` VALUES (3, 'Banana', 300, 'Taiwan');
INSERT INTO `test`.`products` VALUES (4, 'Grape', 400, 'France');
INSERT INTO `test`.`products` VALUES (7, 'トマト', 500, '日本');
INSERT INTO `test`.`products` VALUES (9, 'スイカ', 6, '神奈川');
INSERT INTO `test`.`products` VALUES (10, 'メロン', 1000, '夕張');
INSERT INTO `test`.`products` VALUES (14, 'イチゴ', 200, 'アメリカ');
INSERT INTO `test`.`products` VALUES (15, 'サツマイモ', 500, '鹿児島');
# Data for table `test`.`テストテーブル`:
INSERT INTO `test`.`テストテーブル` VALUES (1, 'リンゴ');
INSERT INTO `test`.`テストテーブル` VALUES (2, 'バナナ');
INSERT INTO `test`.`テストテーブル` VALUES (3, 'ミカン');
INSERT INTO `test`.`テストテーブル` VALUES (4, 'メロン');
#...done.

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/06 08:52

    返信が遅れて申し訳ありません。

    記載方法がわかりにくく、申し訳ありません。
    はい、エクスポートしたいのはテーブル生成+既存データのinsertのスクリプトファイルです。
    もしよろしければその方法を教えていただけると非常にありがたいです。

    キャンセル

  • 2017/07/06 11:08

    mysqldump または mysqldbexport ユーティリティを使ったことはありますか? 使ったことがなければそれを使うことを検討してみてください。

    新しいサーバーでは前者は使えなくなっているので注意してください(自分が知る限りですが、自分の PC に最近インストールした MySQL Community Server 5.7.17 では使えなくなっていました)

    mysqldump
    https://dev.mysql.com/doc/refman/5.6/ja/mysqldump.html

    mysqldbexport
    https://dev.mysql.com/doc/mysql-utilities/1.5/en/mysqldbexport.html

    レンタルサーバー会社が提供している MySQL を利用している場合は、レンタルサーバー会社が提供しているツールを調べてください。phpMyAdmin が提供されているのではないかと思います。

    ご参考に、自分の PC で mysqldbexport を使ってどのようなバックアップ用のスクリプトが生成されるかの例を回答欄に書いておきます。

    キャンセル

  • 2017/07/06 13:06

    ありがとうございます。
    挙げていただいたユーティリティは利用したことがないので、その2つの利用を検討してみます。

    例まで挙げていただきありがとうございます。
    非常に助かります。

    キャンセル

checkベストアンサー

0

exception をきちんと受け取ってエラーの詳細を見ないといけないのですが、
おそらくは into outfile が原因です。

RDB がこれを解釈して処理するのですから、outfile に記載するパスは  RDB サーバが認識できるパス  である必要があります。RDB は Windows 上で動いているのでしょうか?

やりたいことからすると、本来はこういう感じになります。

  1. select * で全データを受けとる(ExecuteQuery())
  2. 受け取ったデータを csv として書き出す(BufferedWriter とか使って)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/05 13:54

    回答ありがとうございます。

    今回私がやりたいことですが、
    テーブルを定義するSQL文をエクスポートする という機能の実現です。
    テーブル内のデータをExcelに出力する機能は別で実現しました。

    キャンセル

  • 2017/07/05 14:48

    テーブルを定義する SQL が欲しいなら、SELECT 文を投げてもだめです。
    SHOW CREATE TABLE [テーブル名] を使います。

    キャンセル

  • 2017/07/05 15:06

    show create table のコードで実行したところ、テーブルを定義するSQLが出力できました。
    ありがとうございます、本当に助かりました。

    キャンセル

0

ひょっとして、
MySQL データベースからテーブル定義書を生成する 
http://mariyudu.hatenablog.com/entry/2014/07/18/222532
で書かれているような、テーブル構造を得たいと云う事ですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/05 15:03

    回答ありがとうございます。
    はい、URLにのっているようなテーブル構造を得たいです。
    知識が浅く、伝わりにくい文章で申し訳ありません。

    キャンセル

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

  • ただいまの回答率 89.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る