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

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

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

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

SQLite

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

Q&A

解決済

3回答

4801閲覧

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

yamaguti

総合スコア185

C#

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

SQLite

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

0グッド

0クリップ

投稿2017/01/24 12:08

編集2017/02/16 13:35

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

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

cmd.Parameters["SiteNm"].Value = txtSiteNm.Text;をウォッチで見ると、画面から入力した値が取れている為
後何が足らないのか分かりません。

ご教示の程よろしくお願い致します。

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 41 42 using (SQLiteDataAdapter adapter = new SQLiteDataAdapter("select * from PASS_KANRI", con)) 43 { 44 //データグリッドビューのクリア 45 datatable.Clear(); 46 47 dataGridView1.DataSource = datatable; 48 adapter.Fill(datatable); 49 50 //dataGridView1.Columns[0].HeaderText = "ID"; 51 //No,SiteNm,LoginId,Password,BIKO カラム順 52 //テーブルの内容表示 53 dataGridView1.Columns[0].HeaderText = "No"; 54 dataGridView1.Columns[1].HeaderText = "サイト名"; 55 dataGridView1.Columns[2].HeaderText = "ログインIDまたはEmail等"; 56 dataGridView1.Columns[3].HeaderText = "パスワード"; 57 dataGridView1.Columns[4].HeaderText = "登録日"; 58 dataGridView1.Columns[5].HeaderText = "備考"; 59 60 } 61 } 62 else 63 { 64 string dbConnectionString = "Data Source = C:\\Users/BC049/Desktop/WindowsFormsApplication4/myfriend.sqlite3"; 65 using (SQLiteConnection cn = new SQLiteConnection(dbConnectionString)) 66 { 67 cn.Open(); 68 using (SQLiteTransaction trans = cn.BeginTransaction()) 69 { 70 SQLiteCommand cmd = cn.CreateCommand(); 71 //DBセレクト 72 cmd.CommandText = "SELECT * from PASS_KANRI where SiteNm = @SiteNm"; 73 74 //パラメータセット 75 cmd.Parameters.Add("SiteNm", System.Data.DbType.String); 76 77 cmd.Parameters["SiteNm"].Value = txtSiteNm.Text; 78 79 //datatableのクリア 80 datatable.Clear(); 81 //datatableに検索結果をセット 82 datatable.Load(cmd.ExecuteReader()); 83 84 dataGridView1.DataSource = datatable; 85 86 //dataGridView1.Columns[0].HeaderText = "ID"; 87 //No,SiteNm,LoginId,Password,BIKO カラム順 88 //テーブルの内容表示 89 dataGridView1.Columns[0].HeaderText = "No"; 90 dataGridView1.Columns[1].HeaderText = "サイト名"; 91 dataGridView1.Columns[2].HeaderText = "ログインIDまたはEmail等"; 92 dataGridView1.Columns[3].HeaderText = "パスワード"; 93 dataGridView1.Columns[4].HeaderText = "登録日"; 94 dataGridView1.Columns[5].HeaderText = "備考"; 95 trans.Commit(); 96 cn.Close(); 97 98 } 99 } 100 //string dbConnectionString = "Data Source = C:\\Users/BC049/Desktop/WindowsFormsApplication4/myfriend.sqlite3"; 101 ////string dbConnectionString = "Data Source = C:\\Users/Takaaki Kawabe/Desktop/WindowsFormsApplication4 /myfriend.sqlite3"; 102 //using (SQLiteConnection cn = new SQLiteConnection(dbConnectionString)) 103 //{ 104 // cn.Open(); 105 // using (SQLiteTransaction trans = cn.BeginTransaction()) 106 // { 107 // SQLiteCommand cmd = cn.CreateCommand(); 108 // //select文を走らせる 109 // cmd.CommandText = "SELECT * from PASS_KANRI where SiteNm = @SiteNm"; 110 111 // //パラメータのセット 112 // cmd.Parameters.Add("SiteNm", System.Data.DbType.String); 113 114 // cmd.Parameters["SiteNm"].Value = txtSiteNm.Text; 115 116 // //データグリッドビューのクリア 117 // datatable.Clear(); 118 119 // var Datatable = new DataTable(); 120 // dataGridView1.DataSource = datatable; 121 122 // dataGridView1.Columns[0].HeaderText = "No"; 123 // dataGridView1.Columns[1].HeaderText = "サイト名"; 124 // dataGridView1.Columns[2].HeaderText = "ログインIDまたはEmail等"; 125 // dataGridView1.Columns[3].HeaderText = "パスワード"; 126 // dataGridView1.Columns[4].HeaderText = "登録日"; 127 // dataGridView1.Columns[5].HeaderText = "備考"; 128 129 } 130 } 131 /// <summary> 132 /// 133 /// </summary> 134 /// <param name="sender"></param> 135 /// <param name="e"></param> 136 private void dataGridView1_Validating(object sender, CancelEventArgs e) 137 { 138 //Clipboard.SetDataObject(dataGridView1.GetClipboardContent()); 139 //ヘッダーをコピーしないようにする 140 //dataGridView1.ClipboardCopyMode = 141 // DataGridViewClipboardCopyMode.EnableWithoutHeaderText; 142 //選択されたセルの内容をクリップボードへコピー 143 //Clipboard.SetDataObject(dataGridView1.GetClipboardContent()); 144 } 145 146 private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) 147 { 148 //DataGridViewの内容をコピー 149 Clipboard.SetDataObject(dataGridView1.GetClipboardContent()); 150 } 151 152 private void Itiran_Load(object sender, EventArgs e) 153 { 154 155 } 156 157 private void Itiran_KeyDown(object sender, KeyEventArgs e) 158 { 159 //Enterキーでコントロール遷移 160 if (e.KeyCode == Keys.Enter) 161 { 162 if (e.Shift) 163 { 164 ProcessTabKey(false); 165 } 166 else 167 { 168 ProcessTabKey(true); 169 } 170 } 171 } 172 } 173} 174 175

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

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

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

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

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

guest

回答3

0

ベストアンサー

まず基本的な所ですが、

C#

1var Datatable = new DataTable(); 2dataGridView1.DataSource = datatable;

C#は変数名の大文字、小文字は区別されるので
ここでの「Datatable」と「datatable」は別物です。
変数「Datatable」を宣言していますが、これ以降「Datatable」は使用されないので
var Datatable = new DataTable();
は全く意味がありません。

データの取得は
検索条件なしの場合は、datatableに

C#

1adapter.Fill(datatable);

でデータをセットしていますが、検索条件ありの場合はdatatableにデータをセットする箇所がありません。
「ExecuteNonQuery」は主にINSERT文やUPDATE文、DELETE文を実行する時に使用するもので、データを返すものではありません。

データを取得するのであれば

C#

1datatable.Load(cmd.ExecuteReader());

というようにすればよいかと思います。

全体的な処理ですが

C#

1 string dbConnectionString = "Data Source = C:\\Users/Desktop/WindowsFormsApplication4/myfriend.sqlite3"; 2 3 using (SQLiteConnection cn = new SQLiteConnection(dbConnectionString)) 4 { 5 cn.Open(); 6 SQLiteCommand cmd = cn.CreateCommand(); 7 8 //検索条件がない場合 9 if (txtSiteNm.Text == "") 10 { 11 cmd.CommandText = "SELECT * from PASS_KANRI"; 12 } 13 else 14 { 15 cmd.CommandText = "SELECT * from PASS_KANRI where SiteNm = @SiteNm"; 16 17 //パラメータのセット 18 cmd.Parameters.Add("SiteNm", System.Data.DbType.String); 19 cmd.Parameters["SiteNm"].Value = txtSiteNm.Text; 20 } 21 22 //datatableのクリア 23 datatable.Clear(); 24 //datatableに検索結果をセット 25 datatable.Load(cmd.ExecuteReader()); 26 27 dataGridView1.DataSource = datatable; 28 29 //dataGridView1.Columns[0].HeaderText = "ID"; 30 //No,SiteNm,LoginId,Password,BIKO カラム順 31 //テーブルの内容表示 32 dataGridView1.Columns[0].HeaderText = "No"; 33 dataGridView1.Columns[1].HeaderText = "サイト名"; 34 dataGridView1.Columns[2].HeaderText = "ログインIDまたはEmail等"; 35 dataGridView1.Columns[3].HeaderText = "パスワード"; 36 dataGridView1.Columns[4].HeaderText = "登録日"; 37 dataGridView1.Columns[5].HeaderText = "備考"; 38 39 cn.Close(); 40 }

みたいなように、なるべく共通した部分はどちらのロジックでも同じものを使用するようにしたほうが
Columnが追加されたり、名称が変更になったりと修正が必要になった場合に変更忘れ等でバグを作り出す可能性が減ります。

(実行せずに書いているので動作しない可能性があります)

投稿2017/01/25 01:29

YAmaGNZ

総合スコア10222

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

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

yamaguti

2017/01/25 02:45

ご回答ありがとうございます。 ご提供頂いたコードを参考に修正させて頂きます。
ynakano

2017/01/25 04:49

これをコピペしてもデータグリッドビューに値は入らないですよ。 (YAmaGNZさんが言いたいのは冗長な処理のまとめ方なのではないでしょうか)
yamaguti

2017/01/25 12:20 編集

削除します。
guest

0

検索条件なしの時のExecuteNonQueryがおかしいと思います。
ExecuteNonQueryの戻り値は「クエリによって影響を受けた行数」で、INSERT、DELETE、UPDATE文で使うもののはずです。
また、データグリッドビューのDataSourceは定義してありますが、DataSourceにクエリ結果を格納する操作(Fill)がなされていないので、データグリッドビューに何も表示されません。
検索条件なしの時と同じ処理でいいのにと思うのですが。

他に気になる点を挙げます。

  • 検索条件なしの処理ですが、DBコネクションをオープンしてないです。
  • 検索条件ありの処理、SELECT文にトランザクションは不要です。
  • 記述が冗長すぎてバグの素です。検索処理あり/なしで異なるのはSQL文とクエリパラメータだけで他は全て一緒にしてよいので、記述をまとめた方が良いです。

投稿2017/01/25 00:59

ynakano

総合スコア1894

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

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

yamaguti

2017/01/25 01:15

ご回答ありがとうございます。 一度、列挙して頂いた部分を踏まえて コードを修正させて頂きます。
yamaguti

2017/01/25 12:02

一度目の検索では、条件をしてしても正常に表示されるようになったのですが 二度目以降の検索は、database is lokedとエラーが出てしまいます。 試しにtrans.Comit();を入れたところ解消しました。 select文にコミットは意味が無いかと思いますが、他に方法があるのでしょうか?
ynakano

2017/01/25 12:11

YAmaGNZさんの回答へのコメントという形でソースを書かれると極めて読みづらく、かつソース全てを書いていないと思うので、質問文を編集して(elseから書き始めるのではなく)全てのコードを提示していただけないでしょうか。 そのうえで一応回答ですが、トランザクションを開始したのにコミットしないからDBがロックされているのだと思います。 select文にコミットが不要というより、そもそもselect文にトランザクションが不要なのです。 トランザクションとは複数の更新・削除処理が全て成功しないと意味がないような場面において、中途半端な更新処理が確定しないようにする仕組みです。(かなり説明端折ってます) なのでselect文にトランザクションを使う意味がないのです。
yamaguti

2017/01/25 12:21

質問文にソースを反映致しました。
ynakano

2017/01/25 12:25

検索条件の有無による冗長処理の整理はしなかったんですね・・・ 片やDataAdapter、片やExecuteReaderというのがものすごく気持ち悪いです。
yamaguti

2017/01/25 14:49

まずは、条件有りのとき検索条件に沿った結果が出せるようになりましたので こちらに合わせて冗長処理の解消を行いたいと思っております。
guest

0

検索条件無しの時は

adapter.Fill(datatable);

で、検索条件有りの時がTransactionを使った

cmd.ExecuteNonQuery();

なのは、なにか意図があってですか?
それともコピペミス?
もしコピペミスならこういう実装は(書いてる内容が冗長過ぎるという意味で)止めた方がいいんじゃないですか?

投稿2017/01/24 20:01

dojikko

総合スコア3939

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

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

yamaguti

2017/01/25 00:35

特に意図はありません
dojikko

2017/01/25 01:02

だったら検索条件有りの時Selectの結果をdatatableに入れる(Fillする)ようにコードが書かれていないですよね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問