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

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

新規登録して質問してみよう
ただいま回答率
86.02%
.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

解決済

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

samakimi
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のインターフェイスのエレメントにアクセスすることができます。

1回答

0グッド

1クリップ

492閲覧

投稿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です。

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

適切な質問に修正を依頼しましょう。

2022/11/20 12:33

こちらの質問が他のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

SurferOnWww

2022/11/20 05:51

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

2022/11/20 08:13 編集

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

2022/11/20 08:50

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

2022/11/20 12:08

3 回目 SQL Server のテーブルの定義を書いてください。
SurferOnWww

2022/11/20 12:29 編集

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

2022/11/20 12:35 編集

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

2022/11/20 12:43 編集

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

回答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

総合スコア1427

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

SurferOnWww

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は何をしめているのですか? その部分を教えてください。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

.NET

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

C#

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

Windows Forms

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