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

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

ただいまの
回答率

90.48%

  • C#

    7437questions

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

  • SQL

    2475questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • Visual Studio

    1912questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • Windows 7

    383questions

    Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

C# SQL文 ユーザーに入力された検索条件でデータの絞り込み

解決済

回答 3

投稿 編集

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

START_

score 15

現在Visualstudio2015にてWindows Formで、SQLiteで作成されたDBをDataGridViewに表示させ、さらに表示したデータを「テーブル名」「カラム名」「文字列一致検索」の条件で絞り込み検索をさせたいです。
そこで現在SQL文の SQLiteCommand.CommandText にユーザよりtextBoxに入力された文字列を変数に格納しそれを使い検索をかけられれば。と思っております。

SQLDataAdapter.Fill();
で検索し表示させるときに、テーブル名やカラム等を

  string tableText = tableComboBox.Text;
    string columnText = SearchComboBox.Text;
    string searchWord = SearchTextBox.Text;


このように、フォームから入力されたtextBoxの値を変数に代入してその変数を使い
SQL文を作ろうと試みたのですが、変数として扱ってもらえず文字列として認識してしまい
Insufficient parameters supplied to the command
この例外が
SQLDataAdapter.Fill();
のところで出ます。
検索すると、'@'をつけるといいと書いてあったのですが

 string SqlCommandText = "select @columnText from @tableText where @searchWord";


結果は変わらず、うまくいきませんでした。
なにかいい方法はありませんか?
よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • SurferOnWww

    2018/05/01 11:29

    あなたが何を作っているか(Windows Forms? WPF? ASP.NET Web Forms? その他?)と、開発環境(OS, .NET, Visual Studio, SQL Server のバージョン・エディションなど)を書いてください。

    キャンセル

  • SurferOnWww

    2018/05/01 11:53

    やっぱり SQL Server ではなくて SQLite でしたか。そこは重要な情報なので、次回はきちんと書くようにしてください。SQL Server だと思ってレスを書いている回答者の皆さんに申し訳ないと思ってください。

    キャンセル

  • START_

    2018/05/01 12:00

    申し訳ありません。ご指摘ありがとうございます。

    キャンセル

回答 3

+2

「パラメータクエリ」で検索してみて下さい。

「@~」と記述している変数はSQLServer内の変数であり、C#で宣言した変数とは全く別の物です。ADP.NETを使用している場合にはSqlCommandクラスのParametersコレクションを使って変数の受け渡しを行います。

ADP.NETに限らずC#からSQLのように言語の壁を越えてデータを渡す場合には、通常は何らかの処理が必要になります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/01 16:11

    コメントありがととうございました!
    自分の知識不足を痛感いたしましたので少し戻って基礎知識から詰めなおしたいと思っております。
    また機会がありましたらご助力ください。

    キャンセル

+2

こんにちは。
ここにサンプルがありますよ。

https://www.ipentec.com/document/csharp-sql-parameter-programming

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/01 16:11

    こちらの添付サイト大変参考になりました。
    ありがとうございます!
    もっと知識を付けて頑張ります!!

    キャンセル

checkベストアンサー

+1

command.Parameters.Add() してますか?

using System;
using System.Data.SQLite;
using System.IO;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "untitled.db");
            using (var connection = new SQLiteConnection($"Data Source={fileName}"))
            {
                connection.Open();
                using (var transaction = connection.BeginTransaction())
                {
                    using (var command = connection.CreateCommand())
                    {
                        command.CommandText = "create table untitled(id, name);";
                        command.ExecuteNonQuery();
                    }
                    using (var command = connection.CreateCommand())
                    {
                        command.CommandText = "insert into untitled (id, name) values (@id, @name)";
                        command.Parameters.Add(new SQLiteParameter("@id", 1));
                        command.Parameters.Add(new SQLiteParameter("@name", "taro"));
                        command.ExecuteNonQuery();
                    }
                    transaction.Commit();
                }
            }
            Console.ReadKey();
        }
    }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/01 12:51

    Zuishin様
    >>コメントありがとうございます。
    添付していただいたソース調べていたときに似ているもの見つけたのですが、いまいち仕組みが理解できなかったので質問なのですが。(id , name)のところに変数を入れればよいのですか?
    別サイトの似ているソースを見つけた時に、Command.Textの書式が自分がイメージしていた「SELECT~...」というものではなかったので違うと思いスルーしてしまっておりました。。

    キャンセル

  • 2018/05/01 13:04

    そこはカラム名です。

    キャンセル

  • 2018/05/01 13:11

    Kunihiro_Narita さんと cutedog さんの回答は読みましたか?
    @ をつけるといいという情報を見つけた時にも、ちゃんと使い方の説明が書いてあったはずですが読んでいませんよね?
    適当にソースらしきものを見つけて切り貼りしたのでは完成しません。
    理解して使わないとデータ全部壊れますよ。

    キャンセル

  • 2018/05/01 13:23

    ご指摘ありがとうございます。
    はい。読んでいるつもりです。
    ですが、まだ理解できていないところが多くいろいろな手段を試しどのような動きになるのか模索中です。
    カラム名以外の項目も動的にしたいです。

    キャンセル

  • 2018/05/01 13:32 編集

    カラム名は動的でなく静的に与えています。
    いろいろな手段で模索をする前に、説明をまず調べて読みましょう。

    > insert into untitled (id, name) values (@id, @name)

    ここの (id, name) がカラム名で、id という名前のカラムと name という名前のカラムを表します。
    カラムが分からなければ「データベース カラム」で調べてください。
    (@id, @name) がパラメータで、command.Parameters.Add() したパラメータがここに展開されます。
    変数が使えるのはここです。
    パラメータが分からなければ「パラメータクエリ」で調べてください。

    キャンセル

  • 2018/05/01 13:45

    細かく説明ありがとうございます。

    "select columnText from tableText where searchWord"
    今回自分はこのようにしているのですが、カラムは教えていただいた方法でやってみます。
    テーブル名とwhereの条件はどのようにすればよいのでしょうか。

    キャンセル

  • 2018/05/01 13:46

    なぜそれが私にわかると思うのですか?
    実際のデータベースと自分の欲しいデータに合わせて SQL を組まなければなりません。

    キャンセル

  • 2018/05/01 13:51

    そこまで何も知らないし知る気がないなら少し軌道修正してください。
    SQLite ではなく SQL Server Express を使い、SQL やパラメータを使うのではなく Entity Framework を使うのがいいと思います。
    そうすればコマンドを叩かなくてもマウス操作でデータベースと画面を同期できます。

    キャンセル

  • 2018/05/01 13:56

    まずは書店で Entity Framework の本を一冊買ってきてそれを読みながら使い方を覚え、理解したうえで実際に作りたいものを作ってください。
    遠回りのように見えるかもしれませんが、断片的なソースの切り貼りの方がかえって遠回りになります。

    キャンセル

  • 2018/05/01 13:58

    すみません。質問の仕方が悪かったです。
    テーブル名とwhereの条件部分もユーザに入力された値を使いたいのでそこも変数を使いたいのですが、
    command.Parameters.Add() の要領で変数は使えるのでしょうか?

    キャンセル

  • 2018/05/01 13:59

    できるところとできないところがあります。
    https://takamints.hatenablog.jp/entry/2015/11/05/details-of-parameterized-query-using-SQLiteDatabase-rawQuery-on-Android

    キャンセル

  • 2018/05/01 16:09

    添付先とても参考になりました。
    ありがとうございます。
    もっともっと勉強してがんばります。
    初歩的なことばかり質問してすみません。
    理解したいという気持ちはありますが、断片的な情報ばかりをかき集めていてそれぞれがつながっていないので今回ご指摘いただいたことを忘れずにやっていきます。
    ほんとうにありがとうございました。

    キャンセル

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

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

関連した質問

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

  • C#

    7437questions

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

  • SQL

    2475questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • Visual Studio

    1912questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • Windows 7

    383questions

    Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。