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

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

ただいまの
回答率

88.59%

C#プログラム実行中のエラー

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,428

yamaguti

score 133

お世話になります。
画面から入力値を受取、SQLにて絞りこみ、DataGridViewに表示させるPGを実装しております。

エラーが出てしまい、調べてみたのですが、なにが原因となっているのかわかりません。
エラーの原因、及び解消法をご教示いただけますでしょうか。

エラー内容
System.InvalidOperationException: ''Fill' を呼び出す前に、SelectCommand プロパティが初期化されませんでした。'

        private void btnserch_Click(object sender, EventArgs e)
        {
            //DB接続等
            string dbPath = Application.StartupPath + @"\kabukanri.db";
            using (SQLiteConnection con = new SQLiteConnection("Data Source=" + dbPath))
            {
                con.Open();
                DataTable datatable = new DataTable();
                #region 検索時項目が入っている場合のSQL

                StringBuilder sql = new StringBuilder();
                SQLiteCommand cmd = con.CreateCommand();

                SQLiteDataAdapter adapter = new SQLiteDataAdapter();
                sql.AppendLine("select");
                sql.AppendLine("  損益.日付 || 曜日.曜日");
                sql.AppendLine("  , 損益.損益額");
                sql.AppendLine("  , コメント.コメント");
                sql.AppendLine("from");
                sql.AppendLine("  損益テーブル 損益");
                sql.AppendLine("  left join 曜日テーブル 曜日");
                sql.AppendLine("    on 曜日.ID = 損益.曜日ID");
                sql.AppendLine("  left join コメントテーブル コメント");
                sql.AppendLine("    on コメント.日付 = 損益.日付");
                sql.AppendLine("where");
                sql.AppendLine("  1 = 1");
                sql.AppendLine("  and 損益.日付 >= @日付From");
                sql.AppendLine("  and 損益.日付 <= @日付To");
                sql.AppendLine("  and 損益.損益額 >= @損益額From");
                sql.AppendLine("  and 損益額 <= @損益額To");

                cmd.Parameters.Add("日付From", System.Data.DbType.String);
                cmd.Parameters.Add("日付To", System.Data.DbType.String);
                cmd.Parameters.Add("損益額From", System.Data.DbType.String);
                cmd.Parameters.Add("損益額To", System.Data.DbType.String);

                cmd.Parameters["日付From"].Value = txtdateF.Text;
                cmd.Parameters["日付To"].Value = txtdateT.Text;
                cmd.Parameters["損益額From"].Value = txtkinF.Text;
                cmd.Parameters["損益額To"].Value = txtkinT.Text;

                cmd.CommandText = sql.ToString();
                cmd.ExecuteNonQuery();
                //cmd.Connection = cmd;

                adapter.Fill(datatable);
                this.dataGridView1.DataSource = datatable;
            }
        }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2017/05/31 21:13 編集

    分かってやってるとは思えないです。 なんで cmd.ExecuteNonQuery(); があるのですか? adapter に cmd が設定してありますか?

    キャンセル

  • workaholist

    2017/06/01 09:01

    こういう記事をまず読んだ方が良いと思います。http://www.atmarkit.co.jp/ait/series/2779/

    キャンセル

回答 3

checkベストアンサー

+4

別質問で誰かが回答していましたが、C#でDBを取り扱う一連のチュートリアルを一度やった方がいいですね
SQLiteCommand(ExecuteNonQuery、ExecuteScalar、ExecuteReader)とSQLiteDataAdapterの使い分け(SQLを実行するだけ、スカラー値を取得する、DataSetで値を取得する)さえも、こんがらがっている=根本的に理解できていないように思われます

System.Data.SQLite 実用サンプルの紹介

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

どのような構造のアプリを作っているのか分かりませんが、できれば一度 Visual Studio のウィザードを使って定番の構成のアプリを作ってみてはいかがでしょう?

SQLLite でウィザードが使えるかどうか分かりませんが、使えなければ SQL Server Express を使ってとりあえず作ってみて、ウィザードが自動生成するコードを見れば今後の開発の参考になると思います。(SQL Server に抵抗があるなら LocalDB でもいいです。Visual Studio と一緒にインストール済みかもしれません)

DB が SQL Server の場合ですが、以下のチュートリアル、

チュートリアル : データベースへのデータの保存 (単一テーブル)
https://msdn.microsoft.com/ja-jp/library/0f92s97z(v=vs.120).aspx

10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (C#)
https://code.msdn.microsoft.com/windowsdesktop/10-ADONET-C-cbfe7688

・・・のように Visual Studio のデータソース構成ウィザードを利用して型付 DataSet + TableAdapter を作って、それを利用してアプリを作ると、以下のページの図のような構造のアプリが、ほとんど自分でコードを書くこと無しに作れます。

Windows フォーム アプリケーションでのデータへの接続
https://msdn.microsoft.com/ja-jp/library/wxt2cwcc(v=vs.120).aspx

操作に慣れると 10 分もかからず作れるはずです。今回のような問題に悩むことはなくなり、開発工数は激減するはずです。保守工数も減るはずです。お試しください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

以下のサイトも参考にしてください。

C#/.NET で SQLite を使う基本中のキホン

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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