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

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

ただいまの
回答率

90.61%

  • C#

    6850questions

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

  • Visual Studio

    1766questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • DataGrid

    50questions

    GUIの一種であり、データを表の形式でみることが可能です。

C# DBファイル選択後GridViewに表示

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 269

START_

score 15

同じような内容の質問を連投しすみません。
はまりにはまってどうしようもなくなってしまいました。。

実現したいことの内容は前質問と同じ通りWindowsFormを使っています。
まずファイルダイアログを表示して[.db]拡張子ファイルを選択しそのファイルをDataGridViewに表示させようとしています。

下記にコード書きました。まだ途中ですが実行すると何も起こらずに実行画面のままです。デバッグすると全部例外なくとおって入るのですが、表示もしてくれません。
また、このような警告もでます。
CA2100    'DataBaseConnection.DataDisplay(DataGridView)' の 'SQLiteDataAdapter.SQLiteDataAdapter(string, SQLiteConnection)' に渡されたクエリ文字列には、変数 'this.command.CommandText' が含まれる可能性があります。これらの変数のいずれかがユーザー入力から取得される可能性がある場合は、文字列の連結によってクエリを構成する代わりに、ストアド プロシージャまたはパラメーター化 SQL クエリを使用することを検討してください。    

いろいろサイトも見たのですが詰まってしまいました。。
すみませんが助けていただければと、よろしくお願いいたします。

namespace DataBase
{
    public partial class MainForm : Form
    {
        string FName = "";

        DataBaseConnection DataBase = new DataBaseConnection();
        ZipGridView ZipGrid = new ZipGridView();

        /// <summary>
        /// DataSetのインスタンスを作る
        /// </summary>
        static DataSet dataset = new DataSet();

        /// <summary>
        /// DataSetにテーブルを追加する
        /// </summary>
        DataTable table = dataset.Tables.Add();

        public MainForm()
        {
            InitializeComponent();

            //イベントの追加
            SaveTool.Click += new EventHandler(DataSave);
            OpenTool.Click += new EventHandler(OpenToolClick);
        }

        /// <summary>
        /// フォーム画面読み込みイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MainForm_Load(object sender, EventArgs e)
        {
            // テーブルをクリア
            table.Clear();
        }

        /// <summary>
        /// データベースオープンのファイル選択ダイアログ表示
        /// </summary>
        public void OpenDialog()
        {
            //OpenFileDialogクラスのインスタンスを作成
            OpenFileDialog ofd = new OpenFileDialog();

            //複数のファイルを選択できるようにする
            ofd.Multiselect = false;
            //はじめに表示されるフォルダを指定する
            //指定しない(空の文字列)の時は、現在のディレクトリが表示される
            ofd.InitialDirectory = @"C:\Users\funabiki\Desktop\船引\00_船引社内研修\03_C#\12_データベース\DataBase";         // C:\  デバッグ用 
            //[ファイルの種類]に表示される選択肢を指定する
            //指定しないとすべてのファイルが表示される
            ofd.Filter = "DB File(*.db)|*.db|すべてのファイル(*.*)|*.*";
            //[ファイルの種類]ではじめに選択されるものを指定する
            //2番目の「すべてのファイル」が選択されているようにする
            ofd.FilterIndex = 1;
            //タイトルを設定する
            ofd.Title = "開く";
            //ダイアログボックスを閉じる前に現在のディレクトリを復元するようにする
            ofd.RestoreDirectory = true;
            //存在しないファイルの名前が指定されたとき警告を表示する
            //デフォルトでTrueなので指定する必要はない
            ofd.CheckFileExists = true;
            //存在しないパスが指定されたとき警告を表示する
            //デフォルトでTrueなので指定する必要はない
            ofd.CheckPathExists = true;

            //ダイアログを表示する
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                FName = ofd.FileName;
                //OKボタンがクリックされたとき、選択されたファイル名を表示する
                Console.WriteLine(FName);
            }
        }

        /// <summary>
        /// [開く]ツールクリック処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OpenToolClick(object sender, EventArgs e)
        {
            // ダイアログオープン
            OpenDialog();
            // データベース接続
            DataBase.Open(FName);
            // 全データ取得
            DataBase.GetTableName();
            // GridView書き込み
            DataBase.DataDisplay(DataGridView);
        }
    }
}
namespace DataBase
{
    class DataBaseConnection 
    {
        /// <summary>
        /// SQLiteアクセスクラス
        /// </summary>
        private SQLiteConnection dbConnect = null;

        private SQLiteCommand command = new SQLiteCommand();
        /// <summary>
        /// テーブル名の一覧を格納
        /// </summary>
        List<string> dataList = new List<string>();
        /// <summary>
        /// DataSetのインスタンス
        /// <summary>
        static DataSet dataset = new DataSet();
        /// <summary>
        /// データテーブル
        /// </summary>
        DataTable table = dataset.Tables.Add();


        /// <summary>
        /// データベースに接続
        /// </summary>
        /// <param name="FileName">データベースファイル名</param>
        public void Open(string FileName)
        {
            dbConnect = new SQLiteConnection();
            // 接続文字列の作成
            dbConnect.ConnectionString = string.Format("Data Source={0};Version=3;", FileName);
            dbConnect.Open();
        }

        /// <summary>
        /// データベース切断
        /// </summary>
        private void ConnectionClose()
        {
            dbConnect.Close();
            dbConnect.Dispose();
        }

        /// <summary>
        /// テーブル名の取得
        /// </summary>
        public void GetTableName()
        {
            DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.SQLite");

            using (SQLiteCommand command = dbConnect.CreateCommand())
            {
                // すべてのデータを指定
                command.CommandText = "SELECT * FROM sqlite_master WHERE type='table'";
                using (SQLiteDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        dataList.Add(reader.ToString());
                    }
                    Console.WriteLine(dataList);    // test用
                }
            }
        }

        /// <summary>
        /// データをDataGridViewに表示
        /// </summary>
        /// <param name="GridView">表示したいDataGridView</param>
        public void DataDisplay(DataGridView GridView)
        {
            command.CommandText = " SELECT * FROM sqlite_master WHERE type='table' ";


            // データアダプタオブジェクトの作成
            var adapter = new SQLiteDataAdapter(command.CommandText, dbConnect);

            // 抽出したデータをデータセットに格納 
            adapter.Fill(dataset);

            // DataGridViewのデータソースにデータセットのテーブルをバインド
            GridView.DataSource = dataset.Tables[0];

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • START_

    2018/04/25 16:23

    はい。先の質問の趣旨でしたFillを使ってデータの取得はできるようになりましたが、その取得したデータがGridViewのDataSourceにセットしても反映されず教えていただいたサイトを拝見しましたが、解決まで至らず今回失礼とは思いましたが質問させていただきました。

    キャンセル

  • Zuishin

    2018/04/25 16:28

    データの取得ができるようになったということは DB に問題はなかったということですか? Fill した結果を Debug.WriteLine() で出力するなどして確かめてみましたか?

    キャンセル

  • START_

    2018/04/27 10:41

    Zuishin 様 >> やはり仰っていただいていた通りFillの引数に問題がありました。いつも本当にありがとうございます!

    キャンセル

回答 1

checkベストアンサー

+3

DataSourceをセットするところで、固定値を入れてみてはどうでしょうか?
固定値を入れて表示されなければ表示系の問題。
固定値を入れて表示されれば、データの問題と考えられます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/25 14:27

    コメントありがとうございます。
    接続文字列の”FileName”を直値で入力して試してみます。

    キャンセル

  • 2018/04/25 14:39

    こんなのをイメージしています。

    string[] arr = new string[] {"Product 1", "Product 24", "Product 356"}
    DataGridView1.DataSource = arr

    キャンセル

  • 2018/04/25 14:54

    [ConnectionString]
    これはつかわないのですか?

    キャンセル

  • 2018/04/25 15:09

    まずは、DBにアクセスせずに固定値をGUIに表示させてみましょう。

    キャンセル

  • 2018/04/27 10:39

    まず、DBに固定値で表示できました、そこでデータの部分に着目しデバッグしていくと、GetTableNameのメソッドを抜けたところでadapterの値がusingで破棄されていることに気づくことができ、解決いたしました!
    本当に助かりました。
    ありがとうございます!

    キャンセル

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

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

関連した質問

  • 解決済

    C# DataGridViewについて

    前提・実現したいこと C#で「ボタンをクリックすると、XMLの内容をDataGridView」に表示するプログラムを作りました。 しかし、ボタンを何回もクリックすると、XM

  • 解決済

    [sqlite3]出力結果をきれいに改行して出力したい

    皆様お世話になっております。 OSXのターミナルでsqlite3を使って、テーブルの構造を確認しようとしたらカラムごとに改行されず、一行で出力されてしましました。テーブル構造を確

  • 解決済

    SQLiteエラーが解決できない

    お世話になります。 C#とSqliteでタスク管理を行うシステムを作成しております。 テスト的にまずはプログラム側で固定値をDBにインサートしようとしているのですが、下

  • 解決済

    C#フォームの検索機能 Sqliteのパラメータ設定について

    お世話になります。 C# windowsフォームにて検索機能を実装しているのですが、なにも設定しない状態の検索は可能なのですが、フォームから検索条件を指定するとエラーが出ます

  • 解決済

    C#(SQlite)を使い検索画面を実装中です。

    C#(SQlite)を使い検索画面を実装中です。 お世話になります。 検索画面を実装中なのですが、検索条件なしの際は、うまくいくのですが 検索条件を入れたときが結果が取れ

  • 解決済

    ワークテーブルへの集計クエリの作成

    お世話になります。 データベースに格納されている日々の損益テーブルを、集計してワークテーブルに入れたいです。 損益テーブル ID 年月日 金額 1 2017/06/

  • 解決済

    DataGridViewのイベント

    Form1の画面にDataGridViewを貼りつけ、DataGridViewのカラムを3つ追加します。 カラム1のColumn TypeはDataGridView TextB

  • 解決済

    異なるDB間で、特定のカラムのみコピーしたい

    前提・実現したいこと 自作のAndroidアプリ内でsqliteを利用しています。 構造が同じ2つのデータベースA,Bがあり、複数テーブルが存在します。 実現したいことは、デー

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

  • C#

    6850questions

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

  • Visual Studio

    1766questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • DataGrid

    50questions

    GUIの一種であり、データを表の形式でみることが可能です。