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

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

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

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

2067閲覧

MVC データベース検索機能の追加

kasa_4333

総合スコア2

C#

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2022/09/12 06:16

編集2022/09/14 09:14

前提

ASP.NETを使用しています。
テキストボックスに文字を入れて検索ボタンを押すと、もともと表示されているSQLテーブルの品物カラムから一部検索でヒットしたものを表示したいと思っています。

データベースに接続し、index.cshtmlで一覧画面が表示されています。

実現したいこと

テキストボックスに文字を入れて検索ボタンを押すと、もともと表示されているSQLテーブルの品物カラムから一部検索でヒットしたものを表示したいと思っています。

発生している問題・エラーメッセージ

テキストボックスと検索ボタン
index.cshtml

<input type="text" name="textBox1"> <button OnClick="Button1_Click" name="Button1" id="Button1">検索</button>

該当のソースコード

SinamonoController

c#

1 //検索ボタン押下時 2 public ActionResult Button1_Click() 3 { 4 string ConnectionStr 5 = ConfigurationManager.ConnectionStrings["iPentecDBConnectionString"].ConnectionString; 6 7 SqlConnection connection; 8 connection = new SqlConnection(ConnectionStr); 9 connection.Open(); 10 11 //データベースに対して実行する指示を格納するクラス(上記オープンしたconnectionから生成[紐づけ]) 12 SqlCommand command = connection.CreateCommand(); 13 14 //コマンドのタイプをテキストで指定 15 command.CommandType = CommandType.Text; 16 17 //実行するSQLを設定 18 command.CommandText = "SELECT * FROM Bihin WHERE 品物 LIKE '%テキストボックスの値%'"; ; 19 20 //以下はSQL結果をDataTableに設定 21 SqlDataAdapter adapter = new SqlDataAdapter(); 22 DataTable dt = new DataTable(); 23 adapter.SelectCommand = command; 24 adapter.Fill(dt); 25 26 adapter = null; 27 command = null; 28 29 connection.Close(); 30 connection = null; 31 32 33 List<BihinDB> modelList = new List<BihinDB>(); 34 foreach (DataRow dr in dt.Rows) 35 { 36 modelList.Add(new BihinDB 37 { 38 BuppinName = dr["Sinamono"].ToString(), 39 ・・・ 40 }); 41 42 } 43 44 return View(modelList); 45 46 } 47 48 49 50 //テキストボックスの値を取得 51 public ActionResult Action1(string textbox) 52 { 53 // Viewに設定したnameと一致させることによってControllerで値を取得できる。 54 HttpContext.Session.Add("txt", textbox); 55 56 return RedirectToAction("");

ボタンをクリックしたときの処理をcontrollerに渡す方法、
テキストボックスの値を渡す方法、
SELECT文の中の”テキストボックスの値”の所はどのように書けばよいのか
教えていただきたいです。

試したこと

上記の検索ボタン押下時、テキストボックスの値の取得です。

①テキストボックスの値を取得
②ボタンクリック時のコードの中に、データベース接続をしてSELECT WHERE LIKE①を使って該当コードを表示させる

という方法で考えています。

補足情報(FW/ツールのバージョンなど)

ASP.NET MVC 
Windows 10 Pro,
Visual Studio2022 Version 17.3.2
.NET framework 4.7.2

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/09/13 01:23

その後どうなりましたか? 状況を書くとかしていただけませんか? 解決したならクローズしてください。
kasa_4333

2022/09/13 01:26

ただ今ボタンをクリックしたときの処理をcontrollerに渡すことがうまくできず、調べているところです。
退会済みユーザー

退会済みユーザー

2022/09/13 02:10

2 つ記事を紹介しましたが、どっちの記事を参考にしてますか?
kasa_4333

2022/09/13 02:12

上の.NET Framework 版の ASP.NET MVC5です。
guest

回答1

0

ベストアンサー

テキストボックスに文字を入れて検索ボタンを押すと、もともと表示されているSQLテーブルの品物カラムから一部検索でヒットしたものを表示したいと思っています。

そういうのは Microsoft のチュートリアルに詳しくやり方が載っています。

.NET Framework 版の ASP.NET MVC5 ならこれ ↓

チュートリアル: ASP.NET MVC アプリケーションで Entity Framework を使用して並べ替え、フィルター処理、ページングを追加する
https://docs.microsoft.com/ja-jp/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/sorting-filtering-and-paging-with-the-entity-framework-in-an-asp-net-mvc-application

.NET Core/.NET 版の ASP.NET Core MVC ならこれ ↓

チュートリアル: 並べ替え、フィルター処理、ページングを追加する - ASP.NET MVC と EF Core
https://docs.microsoft.com/ja-jp/aspnet/core/data/ef-mvc/sort-filter-page?view=aspnetcore-6.0


【追記】

下の 2022/09/13 11:53 の私のコメントで「回答欄に追記します」と書いた件です。

テキストボックスはSearchStringでcontrollerに値を受け渡しているという解釈であっていますか??

そうです。もう少し詳しく説明します。

チュートリアルはビュー index.cshtml に以下のコードを追加してますが、それはやったんですよね? そして、アプリを実行して index ページを表示するとテキストボックスとボタンが表示されるのですよね?

@using (Html.BeginForm()) { <p> Find by name: @Html.TextBox("SearchString") <input type="submit" value="Search" /></p> }

であれば、そのテキストボックスに例えば abc と入力してボタンをクリックすると、

SearchString=abc

というクエリ文字列が index ページの url に追加されてサーバーに GET 要求されます。

データベースに接続し、index.cshtmlで一覧画面が表示されています。

ということですから、現状の Index アクションメソッドは以下のようになっていると想像してます。

C#

1public ActionResult Index() 2{ 3 4 // SELECT * FROM Bihin で全レコードを DataTable に取得 5 // DataTable から List<BihinDB> modelList を生成 6 7 return View(modelList); 8}

そのアクションメソッドで送信されてきた SearchString=abc を受け取るためにはチュートリアルの「Index メソッドにフィルター機能を追加する」セクションに書いてあるように、Index メソッドの引数に searchString を追加します。(注: アクションメソッドの引数は大文字小文字の区別はされません)。

そして、チュートリアルのように Index アクションメソッドで searchString の有無を調べて処理を分ければよさそうです。

C#

1public ViewResult Index(string searchString) 2{ 3 if (!String.IsNullOrEmpty(searchString)) 4 { 5 // SELECT * FROM Bihin LIKE searchString で検索したレコードを DataTable に取得 6 } 7 else 8 { 9 // SELECT * FROM Bihin で全レコードを DataTable に取得 10 } 11 12 // DataTable から List<BihinDB> modelList を生成 13 14 return View(modelList); 15}

投稿2022/09/12 06:57

編集2022/09/13 03:24
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kasa_4333

2022/09/12 07:37

迅速な回答ありがとうございます。 サイト拝見いたしました。ありがとうございます。 上のサイトを見たのですが、こちらはEntity Frameworkを使用していなくてもできますか? できればEntity Frameworkなしで検索機能の追加をしたいと思っていまして・・・
退会済みユーザー

退会済みユーザー

2022/09/12 07:42

> できればEntity Frameworkなしで検索機能の追加をしたいと思っていまして・・・ なぜですか? そもそも Visual Studio のデザイナが ADO.NET + DataSet/DataTable という旧 ASP.NET Web Forms で使っていたやり方に対応してないので Linq to Entities を使わないというのは茨の道なんですけど。
kasa_4333

2022/09/12 07:56

そうなんですね。 授業でEntity Frameworkを使用して一覧表示と登録画面を作ったので、 Entity Frameworkを利用しないでデータベース接続をして一覧を表示、検索機能の追加をするという課題が出ていまして・・・
退会済みユーザー

退会済みユーザー

2022/09/12 07:57

研修の課題とか学校の宿題とかならこんなところで質問するべきではなく、講師・先生に聞くべき話ですよ。
kasa_4333

2022/09/12 07:59

そうですよね。ごもっともです。 一覧まで自力でできたので、もう少しだと思い質問してしまいました。 丁寧な回答ありがとうございました。
退会済みユーザー

退会済みユーザー

2022/09/12 08:16

> 一覧まで自力でできたので では、その先も自助努力で頑張ってはいかが? 「ボタンをクリックしたときの処理をcontrollerに渡す方法、テキストボックスの値を渡す方法」が問題のようですが、そこはチュートリアルに書いてあることが参考になるはず。
kasa_4333

2022/09/12 08:28

そうですね、ありがとうございます! チュートリアルをじっくり見てみましたが、すごく参考になりそうだなと思いました。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2022/09/13 01:23

その後どうなりましたか? 状況を書くとかしていただけませんか? 解決したならクローズしてください。
kasa_4333

2022/09/13 01:34 編集

テキストボックスはSearchStringでcontrollerに値を受け渡しているという解釈であっていますか??
退会済みユーザー

退会済みユーザー

2022/09/13 01:54

2 つ記事を紹介しましたが、どっちの記事を参考にしてますか?
kasa_4333

2022/09/13 02:14

Coreではない方です。
退会済みユーザー

退会済みユーザー

2022/09/13 02:53

回答欄に追記します。
kasa_4333

2022/09/13 04:16

詳しくありがとうございます!とても分かりやすいです。 もともと一覧画面を表示していたpublic ActionResult~ の部分を修正して、 ifを使ってsearchStringに値があるときはヒットするデータを表示、searchStringに値がないときは一覧を表示するということですね。 早速試してみます。
kasa_4333

2022/09/13 05:18

// SELECT * FROM Bihin LIKE searchString で検索したレコードを DataTable に取得 というところで、 command.CommandText = "SELECT * FROM Bihin WHERE BuppinName LIKE serchString"; ; このようなコードを書きました。 ダブルコーテーションでSELECT文を囲っているため、serchStringが文字のように扱われて?、値をうまく取れていません。 searchStringをとってくるにはどうすればよいのでしょうか。
退会済みユーザー

退会済みユーザー

2022/09/13 05:41

そこはホントに基本のキなので分かっていると思っていたのですが・・・ SQL インジェクションの問題があるのでユーザー入力の文字列で SQL 文を組み立てるのは禁止です。パラメータ化しましょう。 SQL Server なら SELECT クエリを、 "SELECT * FROM Bihin WHERE BuppinName LIKE N'%' + @BuppinName + N'%'" のようにして、SqlCommand クラスを使ってパラメータの定義と値の設定を行うようにしましょう。やり方の例は: パラメータ化クエリ http://surferonwww.info/BlogEngine/post/2012/02/02/Parameterized-query.aspx ググれば他にも多々役に立つ記事は見つかるはずです。
kasa_4333

2022/09/13 06:33

基本のキなのですね、、見落としていました。 URLまで詳しくありがとうございます!
退会済みユーザー

退会済みユーザー

2022/09/13 07:07

もっと詳しく書くと、「基本のキ」というのは C# の文法の話で、そこは以下のようにすることで文法的には OK となりますが、 command.CommandText = "SELECT * FROM Bihin WHERE BuppinName LIKE " + serchString; そうするとユーザー入力の文字列で SQL 文を組み立てることになり、SQL インジェクションの問題があるので禁止ということです。
退会済みユーザー

退会済みユーザー

2022/09/13 09:47

リテラルは ' で囲う必要がありました。 ×: "SELECT * FROM Bihin WHERE BuppinName LIKE " + serchString; 〇: "SELECT * FROM Bihin WHERE BuppinName LIKE '" + serchString + "'"; さらに、あいまい検索するなら、 "SELECT * FROM Bihin WHERE BuppinName LIKE '%" + serchString + "%'"; でも、くどいようですが、ユーザー入力の文字列で SQL 文を組み立てるのは SQL インジェクションの問題があるので禁止です。
kasa_4333

2022/09/14 00:14

詳しくありがとうございます! パラメータ化する方法で書き換えたら、チェックボックスから値を受け渡して、検索することができました! 本当にありがとうございます。ベストアンサーとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問