2

残念ながら、IBMのUniDataデータベースシステムと何らかのやり取りをする必要があります。これは、UniObjects for .netを使用してC#コードから実行しています。

1つの検索ボックスを持つASP.NET検索ページを作成しています。私が抱えている問題は、基準で大文字と小文字が区別されることです。UniQueryで大文字と小文字を区別しない検索を行うにはどうすればよいですか?

すべてを返し、Linq to XMLステートメントで大文字と小文字を区別しないようにすることはできますが、効率が悪いため、パフォーマンスの問題が発生します。

これが私が書いたコードです:

using IBMU2.UODOTNET;
using UniObjectsHelper;
using System.Xml.Linq;
...
    void DoSearch()
    {
        XElement xml;

        using (UniSession us = UniHelper.OpenSession((UniDataConfig)ConfigurationManager.GetSection("unidataConfig")))
        {
            UniCommand cmd = us.CreateUniCommand();

            // this is probably insecure. I will deal with that later
            cmd.Command = string.Format(@"LIST UT.OPERS WITH @ID = ""{0}"" OR WITH LAST.NAME = ""{0}"" OR WITH FIRST.NAME = ""{0}""  OR WITH MIDDLE.NAME = ""{0}"" LAST.NAME FIRST.NAME MIDDLE.NAME TOXML", txtSearch.Text);
            cmd.Execute();

            xml = XElement.Parse(cmd.Response);
        }

        gvwResults.DataSource = from x in xml.Descendants("UT.OPERS")
                                select new
                                {
                                    User = x.Attribute("_ID").Value,
                                    FirstName = x.Attribute("FIRST.NAME").Value,
                                    LastName = x.Attribute("LAST.NAME").Value,
                                    MiddleName = x.Attribute("MIDDLE.NAME").Value
                                };
        gvwResults.DataBind();                                
    }

編集

私はこれを見つけました:

UDT.OPTIONS 92

U_INSENSITIVE_MATCH

このオプションは、ディクショナリ定義にPick®スタイルの変換を含むデータで実行されるクエリに影響します。Pick®スタイルの処理コードMCL、MCT、およびMCUは、大文字と小文字を変換します。これらの変換は、比較と選択の前にデータに適用されるため、大文字と小文字が異なる一致する文字は省略されます。UDT.OPTIONS 92を使用すると、LIKEはデータと選択の基になるリテラルの両方を変換するため、選択は実際には大文字と小文字に基づいていません。

「Pick®スタイルの処理コードMCL、MCT、MCU」とは何なのかよくわかりません。誰か説明できますか?

4

2 に答える 2

1

少し調べてみたところ、UniQuery で大文字と小文字を区別しないSELECTLIST、またはコマンドが見つからず、大文字と小文字の区別を変更するためのスイッチ/設定も見つかりません。SORT信じられないでしょ?

ただし、ここにアイデアがあります:

、などの辞書で変換コード (属性 3) を呼び出し.ToLowerて設定できます。 txtSearch.TextMCLUT.OPERSLAST.NAMEFIRST.NAME

これをテストしてわかったことの 1 つは、各選択基準をワイルドカード ブラケットで囲んだ場合にのみ機能することです。...WITH LAST.NAME = ""[{0}]""

などのストック ディクショナリを変更したくない場合はLAST.NAME、新しいディクショナリ アイテムを作成し、それらL_を区別するためにプレフィックス (または何か) を付けることができます。

編集:

  • MCL はテキストを小文字に変換します
  • MCT はテキストを適切な大文字と小文字に変換します
  • MCU はテキストを大文字に変換します

フィールドを説明するディクショナリの属性 3 にこれらの「Pick-style」変換コードのいずれかを配置すると、ディクショナリを使用するたびに変換が実行されます。

たとえば、LAST.NAMEフィールドに「MCL」を追加LIST UT.OPERS LAST.NAMEすると、データが実際にどのように保存されているかに関係なく、すべての姓が小文字でフォーマットされます。

UDT.OPTION 92 が行うと信じていることは、選択基準のリテラル辞書にある同じ変換コードを使用して変換されるため、大文字と小文字を区別しないことです。

SELECT UT.OPERS WITH LAST.NAME = "Smith"

次のように変換されます。

SELECT UT.OPERS WITH LAST.NAME = "smith" 

比較が行われる前。

基本的に、UDT.OPTION 92 が行うことは、.ToLower上で提示したアイデアを呼び出さなくても済むようにすることです。お金に見合う価値はあまりありません、IMHO。

于 2009-10-28T20:40:58.377 に答える
1

Unidata/Datatel で大文字と小文字を区別しない検索を実現するために、計算列や辞書アイテムを作成する必要はありません。

オプション 92 をオンにすることを提案するドキュメントを見つけたので、MCL コードと OCONV 関数を使用する必要があります。私はそれをうまく機能させることができませんでした。しかし!私は正しい軌道に乗っていました!

Rocket Software (IBM から UniData を取得した会社) のエンジニアから、大文字と小文字を区別しないクエリに関する次のような回答も得ました。

技術的にはいいえ、大文字と小文字を区別しない選択ステートメントはありません。
ただし、UniQuery ステートメントを同じように動作させることはできます。
属性をすべて大文字または小文字に変換するディクショナリ アイテムを作成できます。以下の例では、辞書アイテムはフィールド 2 をすべて小文字に変換します。

例:

AE DICT VOC F2.CASE
001: D
002: 2
003: MCL
004:
005: 15L
006: S

UDT.OPTIONS 92 により、MCU、MCL、および MCT タイプの辞書の動作が異なります。これについては、UniData オンライン ドキュメントで利用可能な UDT.OPTIONS コマンド リファレンスを参照してください。

それで、彼は、これらの追加の辞書アイテムを作成するために事前に面倒をみると話していましたが、これは私が従うことはできません. それはあまりにも多くの努力です。これを送ってくれた Alamance Community College の Scott Crosby に感謝します。

男、あなたは何年も前にこれを尋ねましたが、私はあなたに返事をしませんでした。プロジェクトに取り組んでいて、コードをふるいにかけているときにあなたが尋ねたのを覚えています. あなたの質問は、Unidata DB のクエリに関するものでしたが、より具体的には、大文字と小文字を区別しない検索を使用していました。私が思いついた唯一の解決策は、MCL コードで OCONV を使用して、比較する前に Unidata にデータの strtolower を実行させることです。おそらくすでにこれを行う方法を見つけたでしょうが、とにかくここにあります!

$query = "LIST PERSON WITH EVAL\"OCONV(PERSON.EMAIL.ADDRESSES,'MCL')\" LIKE '" . strtolower($email) . "' PERSON.EMAIL.ADDRESSES ID.SUPP NOPAGE TOXML ELEMENTS WITHDTD";

基本的に、PERSON.EMAIL.ADDRESSES で $email (PHP アプリから) を検索して、データベースに存在するかどうかを確認したかったのです。ありがとう、スコット・C・クロスビー

したがって、彼の例から PHP と XML のものを取り出すと、コマンドは次のようになります。

LIST PERSON WITH EVAL"OCONV(PERSON.EMAIL.ADDRESSES,'MCL')" LIKE 'some.lower.case@email.address' PERSON.EMAIL.ADDRESSES ID.SUPP NOPAGE TOXML ELEMENTS WITHDTD";

構文 WITH EVAL"OCONV(FILE.FIELD.NAME,'MCL')" LIKE 'lower case search text' は、必要なものを取得します。それは世界で最も美しいものではありませんが、簡単に実行でき、機能します.

于 2010-03-16T14:18:33.560 に答える