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

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

ただいまの
回答率

90.50%

  • C#

    7138questions

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

  • SQLite

    623questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,053

yamaguti

score 99

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

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

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

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

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SQLite;

namespace WindowsFormsApplication4
{
    public partial class Itiran : Form
    {
        public Itiran()
        {
            InitializeComponent();
        }
        private void btnsintou_Enter(object sender, EventArgs e)
        {
            //新規登録ボタンを押下すると登録画面に遷移
            Touroku Touroku = new Touroku();
            Touroku.Show();
            this.Visible = false;
        }
        private DataTable datatable = new DataTable();
        protected override void OnLoad(EventArgs e)
        {
            dataGridView1.DataSource = datatable;
            base.OnLoad(e);
        }
        //テーブルの内容を表示
        private void buttonkensaku_Click(object sender, EventArgs e)
        {
            //検索条件がない場合
            if (txtSiteNm.Text == "")
            {
                using (SQLiteConnection con = new SQLiteConnection("Data Source = C:\\Users/BC049/Desktop/WindowsFormsApplication4/myfriend.sqlite3"))


                using (SQLiteDataAdapter adapter = new SQLiteDataAdapter("select * from PASS_KANRI", con))
                {
                    //データグリッドビューのクリア
                    datatable.Clear();

                    dataGridView1.DataSource = datatable;
                    adapter.Fill(datatable);

                    //dataGridView1.Columns[0].HeaderText = "ID";
                    //No,SiteNm,LoginId,Password,BIKO カラム順
                    //テーブルの内容表示
                    dataGridView1.Columns[0].HeaderText = "No";
                    dataGridView1.Columns[1].HeaderText = "サイト名";
                    dataGridView1.Columns[2].HeaderText = "ログインIDまたはEmail等";
                    dataGridView1.Columns[3].HeaderText = "パスワード";
                    dataGridView1.Columns[4].HeaderText = "登録日";
                    dataGridView1.Columns[5].HeaderText = "備考";

                }
            }
            else
            {
                string dbConnectionString = "Data Source = C:\\Users/BC049/Desktop/WindowsFormsApplication4/myfriend.sqlite3";
                using (SQLiteConnection cn = new SQLiteConnection(dbConnectionString))
                {
                    cn.Open();
                    using (SQLiteTransaction trans = cn.BeginTransaction())
                    {
                        SQLiteCommand cmd = cn.CreateCommand();
                        //DBセレクト
                        cmd.CommandText = "SELECT * from PASS_KANRI where SiteNm = @SiteNm";

                        //パラメータセット
                        cmd.Parameters.Add("SiteNm", System.Data.DbType.String);

                        cmd.Parameters["SiteNm"].Value = txtSiteNm.Text;

                        //datatableのクリア
                        datatable.Clear();
                        //datatableに検索結果をセット
                        datatable.Load(cmd.ExecuteReader());

                        dataGridView1.DataSource = datatable;

                        //dataGridView1.Columns[0].HeaderText = "ID";
                        //No,SiteNm,LoginId,Password,BIKO カラム順
                        //テーブルの内容表示
                        dataGridView1.Columns[0].HeaderText = "No";
                        dataGridView1.Columns[1].HeaderText = "サイト名";
                        dataGridView1.Columns[2].HeaderText = "ログインIDまたはEmail等";
                        dataGridView1.Columns[3].HeaderText = "パスワード";
                        dataGridView1.Columns[4].HeaderText = "登録日";
                        dataGridView1.Columns[5].HeaderText = "備考";
                        trans.Commit();
                        cn.Close();

                    }
                }
                //string dbConnectionString = "Data Source = C:\\Users/BC049/Desktop/WindowsFormsApplication4/myfriend.sqlite3";
                ////string dbConnectionString = "Data Source = C:\\Users/Takaaki Kawabe/Desktop/WindowsFormsApplication4 /myfriend.sqlite3";
                //using (SQLiteConnection cn = new SQLiteConnection(dbConnectionString))
                //{
                //    cn.Open();
                //    using (SQLiteTransaction trans = cn.BeginTransaction())
                //    {
                //        SQLiteCommand cmd = cn.CreateCommand();
                //        //select文を走らせる
                //        cmd.CommandText = "SELECT * from PASS_KANRI where SiteNm = @SiteNm";

                //        //パラメータのセット
                //        cmd.Parameters.Add("SiteNm", System.Data.DbType.String);

                //        cmd.Parameters["SiteNm"].Value = txtSiteNm.Text;

                //        //データグリッドビューのクリア
                //        datatable.Clear();

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

                //        dataGridView1.Columns[0].HeaderText = "No";
                //        dataGridView1.Columns[1].HeaderText = "サイト名";
                //        dataGridView1.Columns[2].HeaderText = "ログインIDまたはEmail等";
                //        dataGridView1.Columns[3].HeaderText = "パスワード";
                //        dataGridView1.Columns[4].HeaderText = "登録日";
                //        dataGridView1.Columns[5].HeaderText = "備考";

            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dataGridView1_Validating(object sender, CancelEventArgs e)
        {
            //Clipboard.SetDataObject(dataGridView1.GetClipboardContent());
            //ヘッダーをコピーしないようにする
            //dataGridView1.ClipboardCopyMode =
            //  DataGridViewClipboardCopyMode.EnableWithoutHeaderText;
            //選択されたセルの内容をクリップボードへコピー
            //Clipboard.SetDataObject(dataGridView1.GetClipboardContent());
        }

        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            //DataGridViewの内容をコピー
            Clipboard.SetDataObject(dataGridView1.GetClipboardContent());
        }

        private void Itiran_Load(object sender, EventArgs e)
        {

        }

        private void Itiran_KeyDown(object sender, KeyEventArgs e)
        {
            //Enterキーでコントロール遷移
            if (e.KeyCode == Keys.Enter)
            {
                if (e.Shift)
                {
                    ProcessTabKey(false);
                }
                else
                {
                    ProcessTabKey(true);
                }
            }
        }
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

0

まず基本的な所ですが、

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


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

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

adapter.Fill(datatable);


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

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

datatable.Load(cmd.ExecuteReader());


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

全体的な処理ですが

    string dbConnectionString = "Data Source = C:\\Users/Desktop/WindowsFormsApplication4/myfriend.sqlite3";

    using (SQLiteConnection cn = new SQLiteConnection(dbConnectionString))
    {
        cn.Open();
        SQLiteCommand cmd = cn.CreateCommand();

        //検索条件がない場合
        if (txtSiteNm.Text == "")
        {
            cmd.CommandText = "SELECT * from PASS_KANRI";
        }
        else
        {
            cmd.CommandText = "SELECT * from PASS_KANRI where SiteNm = @SiteNm";

            //パラメータのセット
            cmd.Parameters.Add("SiteNm", System.Data.DbType.String);
            cmd.Parameters["SiteNm"].Value = txtSiteNm.Text;
        }

        //datatableのクリア
        datatable.Clear();
        //datatableに検索結果をセット
        datatable.Load(cmd.ExecuteReader());

        dataGridView1.DataSource = datatable;

        //dataGridView1.Columns[0].HeaderText = "ID";
        //No,SiteNm,LoginId,Password,BIKO カラム順
        //テーブルの内容表示
        dataGridView1.Columns[0].HeaderText = "No";
        dataGridView1.Columns[1].HeaderText = "サイト名";
        dataGridView1.Columns[2].HeaderText = "ログインIDまたはEmail等";
        dataGridView1.Columns[3].HeaderText = "パスワード";
        dataGridView1.Columns[4].HeaderText = "登録日";
        dataGridView1.Columns[5].HeaderText = "備考";

        cn.Close();
    }

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/25 11:45

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

    キャンセル

  • 2017/01/25 13:49

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

    キャンセル

  • 2017/01/25 20:50 編集

    削除します。

    キャンセル

0

検索条件無しの時は

adapter.Fill(datatable);

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

cmd.ExecuteNonQuery();

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/25 09:35

    特に意図はありません

    キャンセル

  • 2017/01/25 10:02

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

    キャンセル

  • 2017/01/25 10:14

    そうですね

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/25 10:15

    ご回答ありがとうございます。

    一度、列挙して頂いた部分を踏まえて
    コードを修正させて頂きます。

    キャンセル

  • 2017/01/25 21:02

    一度目の検索では、条件をしてしても正常に表示されるようになったのですが
    二度目以降の検索は、database is lokedとエラーが出てしまいます。

    試しにtrans.Comit();を入れたところ解消しました。
    select文にコミットは意味が無いかと思いますが、他に方法があるのでしょうか?

    キャンセル

  • 2017/01/25 21:11

    YAmaGNZさんの回答へのコメントという形でソースを書かれると極めて読みづらく、かつソース全てを書いていないと思うので、質問文を編集して(elseから書き始めるのではなく)全てのコードを提示していただけないでしょうか。

    そのうえで一応回答ですが、トランザクションを開始したのにコミットしないからDBがロックされているのだと思います。
    select文にコミットが不要というより、そもそもselect文にトランザクションが不要なのです。
    トランザクションとは複数の更新・削除処理が全て成功しないと意味がないような場面において、中途半端な更新処理が確定しないようにする仕組みです。(かなり説明端折ってます)
    なのでselect文にトランザクションを使う意味がないのです。

    キャンセル

  • 2017/01/25 21:21

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

    キャンセル

  • 2017/01/25 21:25

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

    キャンセル

  • 2017/01/25 23:49

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

    キャンセル

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

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

関連した質問

  • 解決済

    C# DataGridViewの新規行追加について

    現在C#、Visual Studio2013 を勉強しています ■実現したいこと 入力した値をDataGridViewに新規行を追加して表示させる プログラムの

  • 解決済

    C# DataGridViewについて

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

  • 解決済

    dataGridViewを使った検索機能について

    お世話になっております。 パスワード管理するシステムの検索機能を実装しているのですが、 検索ボタンを押したときにdataGridView内に同じデータが、検索ボタンを押下し

  • 解決済

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

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

  • 解決済

    落ちる原因が分からない(windowsフォーム)

    お世話になります。 パスワード管理するプログラムを実装しているのですが、 Update部分で落ちてしまい原因がわかりません。 DataGridViewのチェックをつけ

  • 解決済

    DataGridViewのイベント

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

  • 受付中

    visual basic 2015  DataGridViewから出た数値又は任意の数値をChart...

    前提・実現したいこと buttonを押すとDataGridViewの数値をChart(グラフ)に代入、グラフを表示させたいです 下記の写真参照 ここのサイトを参照させていただき

  • 解決済

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

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

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

  • C#

    7138questions

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

  • SQLite

    623questions

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