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

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

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

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

C#

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

Visual Studio

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

Q&A

解決済

1回答

3583閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

DataGrid

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

C#

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

Visual Studio

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

0グッド

0クリップ

投稿2018/04/25 04:40

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

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

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

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

C#

1namespace DataBase 2{ 3 public partial class MainForm : Form 4 { 5 string FName = ""; 6 7 DataBaseConnection DataBase = new DataBaseConnection(); 8 ZipGridView ZipGrid = new ZipGridView(); 9 10 /// <summary> 11 /// DataSetのインスタンスを作る 12 /// </summary> 13 static DataSet dataset = new DataSet(); 14 15 /// <summary> 16 /// DataSetにテーブルを追加する 17 /// </summary> 18 DataTable table = dataset.Tables.Add(); 19 20 public MainForm() 21 { 22 InitializeComponent(); 23 24 //イベントの追加 25 SaveTool.Click += new EventHandler(DataSave); 26 OpenTool.Click += new EventHandler(OpenToolClick); 27 } 28 29 /// <summary> 30 /// フォーム画面読み込みイベント 31 /// </summary> 32 /// <param name="sender"></param> 33 /// <param name="e"></param> 34 private void MainForm_Load(object sender, EventArgs e) 35 { 36 // テーブルをクリア 37 table.Clear(); 38 } 39 40 /// <summary> 41 /// データベースオープンのファイル選択ダイアログ表示 42 /// </summary> 43 public void OpenDialog() 44 { 45 //OpenFileDialogクラスのインスタンスを作成 46 OpenFileDialog ofd = new OpenFileDialog(); 47 48 //複数のファイルを選択できるようにする 49 ofd.Multiselect = false; 50 //はじめに表示されるフォルダを指定する 51 //指定しない(空の文字列)の時は、現在のディレクトリが表示される 52 ofd.InitialDirectory = @"C:\Users\funabiki\Desktop\船引\00_船引社内研修\03_C#\12_データベース\DataBase"; // C:\ デバッグ用 53 //[ファイルの種類]に表示される選択肢を指定する 54 //指定しないとすべてのファイルが表示される 55 ofd.Filter = "DB File(*.db)|*.db|すべてのファイル(*.*)|*.*"; 56 //[ファイルの種類]ではじめに選択されるものを指定する 57 //2番目の「すべてのファイル」が選択されているようにする 58 ofd.FilterIndex = 1; 59 //タイトルを設定する 60 ofd.Title = "開く"; 61 //ダイアログボックスを閉じる前に現在のディレクトリを復元するようにする 62 ofd.RestoreDirectory = true; 63 //存在しないファイルの名前が指定されたとき警告を表示する 64 //デフォルトでTrueなので指定する必要はない 65 ofd.CheckFileExists = true; 66 //存在しないパスが指定されたとき警告を表示する 67 //デフォルトでTrueなので指定する必要はない 68 ofd.CheckPathExists = true; 69 70 //ダイアログを表示する 71 if (ofd.ShowDialog() == DialogResult.OK) 72 { 73 FName = ofd.FileName; 74 //OKボタンがクリックされたとき、選択されたファイル名を表示する 75 Console.WriteLine(FName); 76 } 77 } 78 79 /// <summary> 80 /// [開く]ツールクリック処理 81 /// </summary> 82 /// <param name="sender"></param> 83 /// <param name="e"></param> 84 private void OpenToolClick(object sender, EventArgs e) 85 { 86 // ダイアログオープン 87 OpenDialog(); 88 // データベース接続 89 DataBase.Open(FName); 90 // 全データ取得 91 DataBase.GetTableName(); 92 // GridView書き込み 93 DataBase.DataDisplay(DataGridView); 94 } 95 } 96}

C#

1namespace DataBase 2{ 3 class DataBaseConnection 4 { 5 /// <summary> 6 /// SQLiteアクセスクラス 7 /// </summary> 8 private SQLiteConnection dbConnect = null; 9 10 private SQLiteCommand command = new SQLiteCommand(); 11 /// <summary> 12 /// テーブル名の一覧を格納 13 /// </summary> 14 List<string> dataList = new List<string>(); 15 /// <summary> 16 /// DataSetのインスタンス 17 /// <summary> 18 static DataSet dataset = new DataSet(); 19 /// <summary> 20 /// データテーブル 21 /// </summary> 22 DataTable table = dataset.Tables.Add(); 23 24 25 /// <summary> 26 /// データベースに接続 27 /// </summary> 28 /// <param name="FileName">データベースファイル名</param> 29 public void Open(string FileName) 30 { 31 dbConnect = new SQLiteConnection(); 32 // 接続文字列の作成 33 dbConnect.ConnectionString = string.Format("Data Source={0};Version=3;", FileName); 34 dbConnect.Open(); 35 } 36 37 /// <summary> 38 /// データベース切断 39 /// </summary> 40 private void ConnectionClose() 41 { 42 dbConnect.Close(); 43 dbConnect.Dispose(); 44 } 45 46 /// <summary> 47 /// テーブル名の取得 48 /// </summary> 49 public void GetTableName() 50 { 51 DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.SQLite"); 52 53 using (SQLiteCommand command = dbConnect.CreateCommand()) 54 { 55 // すべてのデータを指定 56 command.CommandText = "SELECT * FROM sqlite_master WHERE type='table'"; 57 using (SQLiteDataReader reader = command.ExecuteReader()) 58 { 59 while (reader.Read()) 60 { 61 dataList.Add(reader.ToString()); 62 } 63 Console.WriteLine(dataList); // test用 64 } 65 } 66 } 67 68 /// <summary> 69 /// データをDataGridViewに表示 70 /// </summary> 71 /// <param name="GridView">表示したいDataGridView</param> 72 public void DataDisplay(DataGridView GridView) 73 { 74 command.CommandText = " SELECT * FROM sqlite_master WHERE type='table' "; 75 76 77 // データアダプタオブジェクトの作成 78 var adapter = new SQLiteDataAdapter(command.CommandText, dbConnect); 79 80 // 抽出したデータをデータセットに格納 81 adapter.Fill(dataset); 82 83 // DataGridViewのデータソースにデータセットのテーブルをバインド 84 GridView.DataSource = dataset.Tables[0]; 85 86 } 87 } 88}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/04/25 04:57 編集

前のスレッドを放置して同じような質問を連投するのは止めましょう。前のスレッドにレスを貰っているのに、それにきちんと対応せず放置したりすると、そのうちあなたの質問も放置されますよ。
退会済みユーザー

退会済みユーザー

2018/04/25 05:25

すみません。レスいただいていたもの通知を見逃しておりました。。ご指摘ありがとうございます。
Zuishin

2018/04/25 05:56

これもどこを参考にしたのかひどいコードですね。Console.WriteLine() を使っていますが、コンソール画面が出るんですか? ここを System.Diagnostics.Debug.WriteLine() に変えてデバッグすれば少なくともデータベースにテーブルが登録されていて取得に成功すればその名前が出力ウィンドウに表示されます。何も出なければきっとデータベースが空ですね。
退会済みユーザー

退会済みユーザー

2018/04/25 06:02

Zuishin様 > まだまだ勉強不足です。。どこか良い参考サイトありますでしょうか。もしよろしければご助力いただきたいです。
Zuishin

2018/04/25 06:17

データベースの中身によって処理が違うので丸々コピペできるサイトは無いと思います。同じ SQL を複数回発行してたり取得したデータを捨ててたり接続をクローズしてなかったりと問題だらけのソースではありますが、コピペ元で動いていたのなら動くんでしょう。db ファイルに正しくデータが格納されていてそれを取得できることを確かめたら少し基礎から sqlite の使い方を調べてみるのが良いかと。
Zuishin

2018/04/25 06:31 編集

https://teratail.com/questions/122748 あれ? 検索していたらこんなのが出てきました。教えてもらってるんじゃないですか? リンク先は良いサイトばかりです。こういうのを参考にしましょう。
退会済みユーザー

退会済みユーザー

2018/04/25 07:23

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

2018/04/25 07:28

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

退会済みユーザー

2018/04/27 01:41

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

回答1

0

ベストアンサー

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

投稿2018/04/25 05:09

tamina

総合スコア136

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

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

退会済みユーザー

退会済みユーザー

2018/04/25 05:27

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

2018/04/25 05:39

こんなのをイメージしています。 string[] arr = new string[] {"Product 1", "Product 24", "Product 356"} DataGridView1.DataSource = arr
退会済みユーザー

退会済みユーザー

2018/04/25 05:54

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

2018/04/25 06:09

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

退会済みユーザー

2018/04/27 01:39

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問