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

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

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

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Q&A

解決済

1回答

4432閲覧

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

yamaguti

総合スコア185

C#

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

0グッド

0クリップ

投稿2017/01/21 09:33

編集2017/01/21 11:05

お世話になります。

C# windowsフォームにて検索機能を実装しているのですが、なにも設定しない状態の検索は可能なのですが、フォームから検索条件を指定するとエラーが出ます。
-------------エラー内容-----------------------
型 'System.InvalidOperationException' のハンドルされていない例外が System.Data.SQLite.dll で発生しました

追加情報:Database is not open
また入力値をwhere句のパラメータに取り込む時にこのようなコードの書き方ではまずいでしょうか?
よろしくお願いいたします。

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10using System.Data.SQLite; 11 12namespace WindowsFormsApplication4 13{ 14 public partial class Itiran : Form 15 { 16 public Itiran() 17 { 18 InitializeComponent(); 19 } 20 private void btnsintou_Enter(object sender, EventArgs e) 21 { 22 //新規登録ボタンを押下すると登録画面に遷移 23 Touroku Touroku = new Touroku(); 24 Touroku.Show(); 25 this.Visible = false; 26 } 27 private DataTable datatable = new DataTable(); 28 protected override void OnLoad(EventArgs e) 29 { 30 dataGridView1.DataSource = datatable; 31 base.OnLoad(e); 32 } 33 //テーブルの内容を表示 34 private void buttonkensaku_Click(object sender, EventArgs e) 35 { 36 //検索条件がない場合 37 if (txtSiteNm.Text == "") 38 { 39 //using (SQLiteConnection con = new SQLiteConnection("Data Source = C:\\Users/BC049/Desktop/WindowsFormsApplication4/myfriend.sqlite3")) 40 using (SQLiteConnection con = new SQLiteConnection("Data Source = C:\\Users/Takaaki Kawabe/Desktop/WindowsFormsApplication4 /myfriend.sqlite3")) 41 42 using (SQLiteDataAdapter adapter = new SQLiteDataAdapter("select * from PASS_KANRI", con)) 43 { 44 //データグリッドビューのクリア 45 datatable.Clear(); 46 47 var Datatable = new DataTable(); 48 dataGridView1.DataSource = datatable; 49 adapter.Fill(datatable); 50 51 //dataGridView1.Columns[0].HeaderText = "ID"; 52 //No,SiteNm,LoginId,Password,BIKO カラム順 53 //テーブルの内容表示 54 dataGridView1.Columns[0].HeaderText = "No"; 55 dataGridView1.Columns[1].HeaderText = "サイト名"; 56 dataGridView1.Columns[2].HeaderText = "ログインIDまたはEmail等"; 57 dataGridView1.Columns[3].HeaderText = "パスワード"; 58 dataGridView1.Columns[4].HeaderText = "登録日"; 59 dataGridView1.Columns[5].HeaderText = "備考"; 60 61 } 62 } 63 else 64 { 65 string dbConnectionString = "Data Source = C:\\Users/Takaaki Kawabe/Desktop/WindowsFormsApplication4 /myfriend.sqlite3"; 66 using (SQLiteConnection cn = new SQLiteConnection(dbConnectionString)) 67 { 68 cn.Open(); 69 using (SQLiteTransaction trans = cn.BeginTransaction()) 70 { 71 SQLiteCommand cmd = cn.CreateCommand(); 72 //select文を走らせる 73 cmd.CommandText = "SELECT * from PASS_KANRI where SiteNm = @SiteNm"; 74 75 //パラメータのセット 76 cmd.Parameters.Add("SiteNm", System.Data.DbType.String); 77 78 cmd.Parameters["SiteNm"].Value = txtSiteNm.Text; 79 80 //データグリッドビューのクリア 81 datatable.Clear(); 82 83 var Datatable = new DataTable(); 84 dataGridView1.DataSource = datatable; 85 86 dataGridView1.Columns[0].HeaderText = "No"; 87 dataGridView1.Columns[1].HeaderText = "サイト名"; 88 dataGridView1.Columns[2].HeaderText = "ログインIDまたはEmail等"; 89 dataGridView1.Columns[3].HeaderText = "パスワード"; 90 dataGridView1.Columns[4].HeaderText = "登録日"; 91 dataGridView1.Columns[5].HeaderText = "備考"; 92 93 cmd.ExecuteNonQuery(); 94 95 } 96 //using (SQLiteDataAdapter adapter = new SQLiteDataAdapter("select * from PASS_KANRI where SiteNm = ?", con)) 97 //{ 98 // //using (SQLiteCommand cmd = con.CreateCommand()) 99 // //{ 100 // // //パラメータのセットと確定 101 // cmd.Parameters.Add(new SQLiteParameter(DbType.String, textSiteNm)); 102 // cmd.Prepare(); 103 104 // //ExecuteReaderするとreaderが帰ってくる 105 // using (SQLiteDataReader reader = cmd.ExecuteReader()) 106 // { 107 // //行の読み込み 108 // while (reader.Read()) 109 // { 110 // //データグリッドビューのクリア 111 // datatable.Clear(); 112 113 // var Datatable = new DataTable(); 114 // dataGridView1.DataSource = datatable; 115 // //テーブルの内容表示 116 // dataGridView1.Columns[0].HeaderText = "No"; 117 // dataGridView1.Columns[1].HeaderText = "サイト名"; 118 // dataGridView1.Columns[2].HeaderText = "ログインIDまたはEmail等"; 119 // dataGridView1.Columns[3].HeaderText = "パスワード"; 120 // dataGridView1.Columns[4].HeaderText = "登録日"; 121 // dataGridView1.Columns[5].HeaderText = "備考"; 122 123 // } 124 // } 125 //} 126 127 } 128 } 129 } 130 /// <summary> 131 /// 132 /// </summary> 133 /// <param name="sender"></param> 134 /// <param name="e"></param> 135 private void dataGridView1_Validating(object sender, CancelEventArgs e) 136 { 137 //ヘッダーをコピーしないようにする 138 //dataGridView1.ClipboardCopyMode = 139 // DataGridViewClipboardCopyMode.EnableWithoutHeaderText; 140 //選択されたセルの内容をクリップボードへコピー 141 //Clipboard.SetDataObject(dataGridView1.GetClipboardContent()); 142 } 143 } 144} 145 146

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

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

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

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

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

guest

回答1

0

ベストアンサー

この書き方ですと、SQLiteDataAdapterとcmdの紐づけというか関連がありません。
書くとするのであれば

c#

1var cmd = con.CreateCommand(); 2var adapter = new SQLiteDataAdapter(cmd);

という書き方となります。

あと、

c#

1while (reader.Read()) 2{ 3 //データグリッドビューのクリア 4 datatable.Clear(); 5 6 var Datatable = new DataTable(); 7 dataGridView1.DataSource = datatable; 8 //テーブルの内容表示 9 dataGridView1.Columns[0].HeaderText = "No"; 10 dataGridView1.Columns[1].HeaderText = "サイト名"; 11 dataGridView1.Columns[2].HeaderText = "ログインIDまたはEmail等"; 12 dataGridView1.Columns[3].HeaderText = "パスワード"; 13 dataGridView1.Columns[4].HeaderText = "登録日"; 14 dataGridView1.Columns[5].HeaderText = "備考"; 15 16}

(たぶん、条件なしの部分をコピペしただけだと思いますが)
cmd.ExecuteReader()はDataReaer型のデータを取得します。DataTable型とは違います。
のところですが、reader.read()のループは行単位で行われます。
つまり、クエリの結果が複数行あれば複数回ループ内容が実行されます。
あと、 new DataTable()として、空のDataTableインスタンスを生成して、それをDataGridViewにバインドしていますので、DataGridViewには何も表示されません。
あと、DataGridViewのHeaderTextはどっちみち設定されるようですので、このような場所で設定しなくてももっと前段で設定を済ませておいていいと思いますが。

書き方はいろいろありますが、シンプルに書くと

c#

1var cmd = con.CreateCommand(); 2cmd.commandText = "select * from PASS_KANRI where SiteNm = ?"; 3cmd.Parameters.Add(new SQLiteParameter(DbType.String, textSiteNm)); 4cmd.Prepare(); 5var adapter = new SQLiteDataAdapter(cmd); 6var data = new DataTable(); 7adapter.Fill(data); 8DataGridView1.DataSource = data;

といった感じになるかと思います。(動作検証はしてません)

投稿2017/01/21 10:28

turbgraphics200

総合スコア4267

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

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

yamaguti

2017/01/21 16:04

ご回答ありがとうございます。 パラメータは取ってこれていますが、まだデータグリッドビューにデータが表示されないので 原因を探っているところです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問