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

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

新規登録して質問してみよう
ただいま回答率
85.48%
.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

1回答

5156閲覧

C#でSQLのLIKE 句での SqlParameter の使用が機能させる方法

samakimi

総合スコア3

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

1クリップ

投稿2022/11/20 03:54

編集2022/11/20 12:26

前提

WindowsFormにはテキストボックスが2つとボタンが1つあります。
1つのテキストボックスにキーワードを入れて、ボタンを押すことでもう1つテキストボックスにキーワードが一致したものだけが一覧で表示する

実現したいこと

C# では、テキストボックス(名前のプロパティ:searchBox)内の内容を検索し、
その内容を SqlParameter で@Keywordというパラメータに格納することが必須である。

例で以下を使うことです。

command.Parameters.Add("@Keyword", SqlDbType.NVarChar); command.Parameters["@Keyword"].Value = keywordText;

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

テキストボックス内に”ん”というキーワードを入力し、ボタンを押したとき
SQLは実行されたが、DataTableの変数itemTableには
本来はキーワード”ん”に一致するリンゴやみかんのデータが入っているが
一致するデータが入っていなかった。

下に該当するコードをかきました。

なぜ一致するデータするないのか、
また、一致するデータをitemTableに入るためにどのようなコードを書けばよいか教えてください。

該当のソースコード

C#

1public DataTable GetData() 2 { 3 DataTable itemTable = new DataTable(); 4 // 接続文字列の取得 5 var connectionString = ConfigurationManager.ConnectionStrings["db"].ConnectionString; 6 using (var connection = new SqlConnection(connectionString)) 7 using (var command = connection.CreateCommand()) 8 { 9 try 10 { 11 // データベースの接続開始 12 connection.Open(); 13 //テキストボックスのキーワード 14 string keywordText = searchBox.Text; 15 16 // SQLの設定 17 command.CommandText = @"SELECT * FROM item WHERE name LIKE '%@Keyword%'"; 18 19 command.Parameters.AddWithValue("@Keyword", keywordText); 2021 command.Parameters.Add("@Keyword", SqlDbType.NVarChar); 22 command.Parameters["@Keyword"].Value = keywordText; 23        を使用する       24   25 26 // SQLの実行 27 var adapter = new SqlDataAdapter(command); 28 adapter.Fill(itemTable); 29 30 } 31 catch (Exception exception) 32 { 33 throw; 34 } 35 finally 36 { 37 // データベースの接続終了 38 connection.Close(); 39 } 40 } 41 return itemTable; 42 } 43

データベースは以下のようになっている
SQL Server のテーブルの定義
CREATE TABLE item (
id INT NOT NULL PRIMARY KEY,
categoryId INT NOT NULL,
name NVARCHAR(max) NOT NULL,
price INT NOT NULL,
image NVARCHAR(max) NULL,
);

レコードを挿入
INSERT INTO m_item(categoryId, name, price, image)
VALUES(1, 'リンゴ', 200, 'apple.jpg',);
INSERT INTO m_item(categoryId, name, price, image)
VALUES(1, 'みかん', 150, 'orange.jpg');
INSERT INTO m_item(categoryId, name, price, image)
VALUES(2, 'ボールペン', 100, 'pen.jpg');

テーブル名:item

id categoryId name price image
1 1 リンゴ 200 apple.jpg
2 1 みかん 150 orange.jpg
3 2 ボールペン 100  pen.jpg

サンプルでは3つのレコードですが、

実際のテーブルは
カラム数:5カラム
レコード数:30
のテーブルとなっています

Windows 10 の Visual Studio 2022 で Windows Forms アプリです。
.NET6のFrameworkです。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/11/20 05:51

SQL Server のテーブルの定義を書いてください。 > "SELECT * FROM m_item WHERE ITEM_NAME LIKE '%@Keyword%'" と「データベースは以下のようになっている」に書いてあることが違います。
退会済みユーザー

退会済みユーザー

2022/11/20 08:13 編集

もう一つ、public List<ItemModel> GetData() メソッドの return itemTable; の itemTable は DataTable になってます。そのコードではコンパイルも通らないはずです。ちょっとイイカゲンすぎませんか?
退会済みユーザー

退会済みユーザー

2022/11/20 08:50

2 回目 SQL Server のテーブルの定義を書いてください。 > "SELECT * FROM m_item WHERE ITEM_NAME LIKE '%@Keyword%'" と「データベースは以下のようになっている」に書いてあることが違います。
退会済みユーザー

退会済みユーザー

2022/11/20 12:08

3 回目 SQL Server のテーブルの定義を書いてください。
退会済みユーザー

退会済みユーザー

2022/11/20 12:29 編集

matukeso さんの回答を見て、言われたように試してないの? そもそも、回答をもらって何もフィードバックを返さないのは失礼だと思わないの?
samakimi

2022/11/20 12:35 編集

解答について教えてくれたことはありがたいです こちらの事情によって今、試すことができない状況であるので、 明日ならできます。 少しフィードバックについて待ってほしいです。
退会済みユーザー

退会済みユーザー

2022/11/20 12:43 編集

だったら回答をもらったら即そのように回答のコメント欄に書こう。無言は失礼すぎる。
guest

回答1

0

ベストアンサー

SQL文中で@Keywordなら、c#のParameter側は”Keyword”で、@を抜きます。
SQLでのパラメタの使い方は、LIKE '%@Keyword%'ではなく
LIKE N'%'+@Keyword+N'%'とやるか、
LIKE @Keywordとして、c#側でcommand.Parameters["@Keyword"].Value = “%”+ keywordText + “%”とやるかです。

投稿2022/11/20 04:32

編集2022/11/20 06:31
matukeso

総合スコア1590

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

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

退会済みユーザー

退会済みユーザー

2022/11/20 05:40

> SQL文中で@Keywordなら、c#のParameter側は”Keyword”で、@を抜きます。 質問のコードのどこのことを言ってますか? 「@を抜きます」という必要はないはずですが。
samakimi

2022/11/21 11:25 編集

command.CommandText = @"SELECT * FROM m_item WHERE ITEM_NAME LIKE N'%' + @Keyword + N'%'";  command.Parameters.Add("@Keyword", SqlDbType.NVarChar); command.Parameters["@Keyword"].Value = keywordText; とC#で書くことで解決できました。 教えていただきありがとうございます。 疑問に思ったことはSQL文に書いているN'%' のNは何をしめているのですか? その部分を教えてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問