C# DBファイル選択後GridViewに表示
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 1,632
同じような内容の質問を連投しすみません。
はまりにはまってどうしようもなくなってしまいました。。
実現したいことの内容は前質問と同じ通り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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+3
DataSourceをセットするところで、固定値を入れてみてはどうでしょうか?
固定値を入れて表示されなければ表示系の問題。
固定値を入れて表示されれば、データの問題と考えられます。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.33%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
SurferOnWww
2018/04/25 13:57 編集
前のスレッドを放置して同じような質問を連投するのは止めましょう。前のスレッドにレスを貰っているのに、それにきちんと対応せず放置したりすると、そのうちあなたの質問も放置されますよ。
START_
2018/04/25 14:25
すみません。レスいただいていたもの通知を見逃しておりました。。ご指摘ありがとうございます。
Zuishin
2018/04/25 14:56
これもどこを参考にしたのかひどいコードですね。Console.WriteLine() を使っていますが、コンソール画面が出るんですか? ここを System.Diagnostics.Debug.WriteLine() に変えてデバッグすれば少なくともデータベースにテーブルが登録されていて取得に成功すればその名前が出力ウィンドウに表示されます。何も出なければきっとデータベースが空ですね。
START_
2018/04/25 15:02
Zuishin様 > まだまだ勉強不足です。。どこか良い参考サイトありますでしょうか。もしよろしければご助力いただきたいです。
Zuishin
2018/04/25 15:17
データベースの中身によって処理が違うので丸々コピペできるサイトは無いと思います。同じ SQL を複数回発行してたり取得したデータを捨ててたり接続をクローズしてなかったりと問題だらけのソースではありますが、コピペ元で動いていたのなら動くんでしょう。db ファイルに正しくデータが格納されていてそれを取得できることを確かめたら少し基礎から sqlite の使い方を調べてみるのが良いかと。
Zuishin
2018/04/25 15:24 編集
https://teratail.com/questions/122748 あれ? 検索していたらこんなのが出てきました。教えてもらってるんじゃないですか?
リンク先は良いサイトばかりです。こういうのを参考にしましょう。
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の引数に問題がありました。いつも本当にありがとうございます!