DOBON.NET DOBON.NETプログラミング掲示板過去ログ

頭文字抽出。

  • 題名: 頭文字抽出。
  • 著者: noko
  • 日時: 2004/01/05 16:54:39
  • ID: 2017
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[.NET Frameworkのバージョン1.1、C#]
分類:[.NET]

VS.NETを使用してC#を用いプログラムを行っています。
windowsアプリケーションです。
データベースにNo・シメイという項目があり、シメイは文字通りカタカナです。
formのコンボボックスにア〜ワの頭文字が入っていて、ボタンを押すとその選択された頭文字を基に、データベースのシメイを抽出、データグリッドに表示という処理を行いたいのですが、できません。
データアダプターの抽出条件にLIKE '{?}*'とし、ボタンが押されたときの処理として、
da_kasiramoji.SelectCommand.Parameters["シメイ"].Value=kasira.SelectedItem.ToString();
ということをやっています。

エラーメッセージは、
ParameterName 'シメイ' を持つ OleDbParameter は、この OleDbParameterCollection に含まれていません。
とでました。
どうかアドバイスをいただけると幸いです。
宜しくお願い致します。
■No2017に返信(nokoさんの記事)
あの・・・エラー内容通りのことではないですよね?

〜.selectCommand.Parameters.Addで、「シメイ」のパラメータを追加しましたか?
変数みたいなものなので、作らないと使用できませんが。
(ちゃんとやってたならごめんなさい。)
> 〜.selectCommand.Parameters.Addで、「シメイ」のパラメータを追加

VS.NETdでデータアダプタを作成するときにクエリビルダというところで指定しますので、それによって自動的に作成されます。
そのクエリビルダ上に、抽出条件という欄があり、そこに抽出条件を記載し、コードでパラメーター値をそこに当てはめるというやり方をすれば、普通は出来るんですが・・・。
事実、抽出条件を?(完全一致)とし、テキストボックスの値を基に抽出という形で行ったら、実装できました。
■No2024に返信(nokoさんの記事)

「ParameterName 'シメイ' を持つ OleDbParameter は、この OleDbParameterCollection に
含まれていません。」のメッセージは、同じことをやっても出ませんでした。

あの・・・毎回出るわけではないですよね?

このメッセージを出してしまう状況としては、
selectCommandのSQLをクエリビルダで編集して、確定する際に「このコマンドのパラメータ
コレクションを再生成する」のチェックを外し忘れてしまい、Parametersコレクションが
空になった場合ですね。(私の場合・・・。注意力散漫・・・。普段、滅多にクエリビルダは
使いませんが。なんとなく。)


で、SQLの方ですが、「'」で囲んでしまうと中の展開がされません。固定値の場合のみです。
パラメータの定義型に従って、必要であれば「'」はつくので、自分でパラメータに「'」を
送る必要はありません。
(自分で送ると、エスケープ済みの「'」文字そのものとして認識してくれるようです。)

問題の部分はクエリビルダでは単に「LIKE ?」として、〜シメイ").valueには
「指定したい文字列 & "%"」を送ります。
(これはVBです。C#での結合は+かなんかですか?ようは、文字列の結合です。)

※パススルークエリに指定しているので、LIKEの記号はデータベース依存です。
例はSQLServerの場合です。任意に読み替えてください。(*等)
ありがとうございます!!
帰宅したら早速やってみようと思います。
できそうな予感がします・・・。(^^)
もし「指定したい文字列 & "%"」の部分で、ア〜オの頭文字+%を指定したい場合は、
da_kasira.SelectCommand.Parameters["シメイ"].Value=Like "[ア-オ]+%";
という形ですか?

というのは、コンボボックスで"ア"というのを選んだら、ア〜オの頭文字の人が抽出されるようにしたいのです。
どうかよきアドバイスを宜しくお願いいたします。
■No2058に返信(nokoさんの記事)

da_kasira.SelectCommand.Parameters["シメイ"].Value=Like "[ア-オ]+%";
ですが、

 0.文字列の外にLikeと記述されてますが・・・。
 1.LIKE内の構文の誤り
 2.LIKEがパラメータ部分に入ってしまっている

1.
(ご利用のDBMSがそういう表現([]や-や+)をサポートするのであれば
誤りではないので無視です。)
例えばSQLServerにおいては、パターンの拡張で[]等を使用できるので、
「アからオのいずれかで始まるもの」は[ア-オ]%という表現で指定可能です。

・・・なお、私の前回の回答の「+」は、
検索用の文字列の後ろに文字(列)「%」を連結してください、という意味です。
別に、文字列中に「+」をつけてという意味ではありません・・・。
(VBでは「&」、C#では「+」です。)


2.
送る文字列にLIKEを含んでしまうと、
SQLは、''内にLIKEが展開されるような形になると思います。
SQLServerの構文としてこれを解釈すると、
 「Like 」の後に「ア」から「オ」のいずれかが続き、「+」がついて、後ろは任意、
という意味の検索になります。無意味な検索になります。
LIKEは、クエリ側のシメイの抽出条件に単に「LIKE ?」としておきます。
※ここで%を指定したいものですが、「LIKE ?%」と入力してもクエリデザイナが勝手に
「LIKE '?%'」と変換してしまい、''内に?が隠れることでパラメータの埋め込み位置
としては認識されなくなるようです。


1.を元にすると、
da_kasira.SelectCommand.Parameters["シメイ"].Value="[ア-オ]%";
となります。
コンボボックスのアイテムが「ア-オ」であれば、
da_kasira.SelectCommand.Parameters["シメイ"].Value="[" + kasira.SelectedItem.ToString() + "]%";
といったところでしょうか。
コンボが「ア」であれば、IF等で振り分ける等してください。
(「ア」だったら「ア-オ」を放り込むように。)


なお、SQLの仕様はDBMS毎なので、SQLそのものに関しては各DBMSのマニュアル等を
見てください。
SQLそのものが正しいかどうかは検証してから組んだ方がいいですよ。
(SQLServerではosql、Oarcleではsql*plus、Informixではisqlかな?)
VisualStudioではSQLServerに関しては、
「ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1041/tsqlref/ts_la-lz_115x.htm」に
LIKEの解説があります。
(この記事にはファイル"query_etc.lzh"が添付されていましたが、削除されました。)
■No2060に返信(こど。さんの記事)
こど様、ありがとうございました。
大変詳細なご説明により、初心者の私でも勉強できました。
いつもは、色々と聞くのですが、あまりに私の勉強不足のために、
わからないことも聞きづらく、調べてもあまり成果が上がりませんでしたが、
今回はとても勉強できました。
本当にありがとうございます。
今後も勉強して行きたいと思います。
m(_ _"m)ペコリ
  • 題名: Re[8]: 頭文字抽出。
  • 著者: noko
  • 日時: 2004/01/08 7:50:18
  • ID: 2074
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No2073に返信(nokoさんの記事)
> ■No2060に返信(こど。さんの記事)
> こど様、ありがとうございました。
> 大変詳細なご説明により、初心者の私でも勉強できました。
> いつもは、色々と聞くのですが、あまりに私の勉強不足のために、
> わからないことも聞きづらく、調べてもあまり成果が上がりませんでしたが、
> 今回はとても勉強できました。
> 本当にありがとうございます。
> 今後も勉強して行きたいと思います。
> m(_ _"m)ペコリ
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板