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

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

ただいまの
回答率

90.33%

  • C#

    7726questions

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

  • SQLite

    667questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 970

yamaguti

score 99

お世話になります。

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

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

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 (SQLiteConnection con = new SQLiteConnection("Data Source = C:\\Users/Takaaki Kawabe/Desktop/WindowsFormsApplication4 /myfriend.sqlite3"))

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

                    var Datatable = new DataTable();
                    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/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 = "備考";

                        cmd.ExecuteNonQuery();

                    }
                    //using (SQLiteDataAdapter adapter = new SQLiteDataAdapter("select * from PASS_KANRI where SiteNm = ?", con))
                    //{
                    //    //using (SQLiteCommand cmd = con.CreateCommand())
                    //    //{
                    //    //    //パラメータのセットと確定
                    //    cmd.Parameters.Add(new SQLiteParameter(DbType.String, textSiteNm));
                    //    cmd.Prepare();

                    //    //ExecuteReaderするとreaderが帰ってくる
                    //    using (SQLiteDataReader reader = cmd.ExecuteReader())
                    //    {
                    //        //行の読み込み
                    //        while (reader.Read())
                    //        {
                    //            //データグリッドビューのクリア
                    //            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)
        {
            //ヘッダーをコピーしないようにする
            //dataGridView1.ClipboardCopyMode =
            //  DataGridViewClipboardCopyMode.EnableWithoutHeaderText;
            //選択されたセルの内容をクリップボードへコピー
            //Clipboard.SetDataObject(dataGridView1.GetClipboardContent());
        }
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

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

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


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

あと、

while (reader.Read())
{
    //データグリッドビューのクリア
    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 = "備考";

}


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

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

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


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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/22 01:04

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

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

    キャンセル

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

  • C#

    7726questions

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

  • SQLite

    667questions

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