如何使用Uniquery进行UniData案例不敏感搜索

时间:2009-10-28 19:04:49

标签: .net unidata uniquery

不幸的是,我必须与IBM的UniData数据库系统进行一些交互。我是用c#代码和UniObjects for .net。

做的

我正在构建一个只有一个搜索框的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”是什么。谁能解释一下?

2 个答案:

答案 0 :(得分:1)

我环顾四周,在UniQuery中找不到不区分大小写的SELECTLISTSORT命令,也没有在开关/设置中找到修改区分大小写的命令。难以置信,嗯?

这是一个想法:

您可以在.ToLower上致电txtSearch.Text,并将MCL字典中的转换代码(属性3)设置为UT.OPERS LAST.NAME,{{1}等苹果苹果。

我在测试中发现的一件事是,只有当您使用通配符括号括起每个选择条件时它才有效,例如:FIRST.NAME

如果您不想修改...WITH LAST.NAME = ""[{0}]""等的库存词典,可以创建新的词典项目,并在其前面添加LAST.NAME(或其他内容)以区分它们。

修改

  • MCL将文本转换为小写
  • MCT将文本转换为正确的案例
  • MCU将文本转换为大写

如果您在字典的属性3中放入任何一个“Pick-style”转换代码来描述您的字段,则每次使用字典时都会运行转换。

例如,如果您将“MCL”添加到L_字段,那么当您LAST.NAME时,无论数据实际存储的方式如何,所有姓氏都将以小写格式设置。

我相信UDT.OPTION 92的作用是确保选择标准中的文字使用字典中的相同转换代码进行转换,从而使您不区分大小写。< / p>

LIST UT.OPERS LAST.NAME

将转换为:

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

在比较之前。

基本上,UDT.OPTION 92将为您做的是阻止您在我上面提到的想法中调用SELECT UT.OPERS WITH LAST.NAME = "smith" 。没什么好看的,恕我直言。

答案 1 :(得分: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   类型字典表现不同。   你可以在中读到这个   UDT.OPTIONS命令参考   可在UniData在线获得   文档。

所以,他正在谈论事先找到麻烦来创建这些额外的字典项目,这是我无法遵守的。这太费劲了。感谢Alamance社区学院的斯科特克罗斯比给我这个:

  

男人,你这几年前问的,我   从来没有回复过你。我记得你   问我什么时候筛选一些   代码,在项目上工作。您的   问题是关于查询   Unidata DB,但更具体地说,   使用案例敏感搜索。该   我想出的唯一解决方案是使用   OCONV用MCL代码,给力   Unidata对数据做了一个strtolower   在比较之前。你可能已经   找到了一种方法来做到这一点,但现在就是这样   反正!

     

$ query =“LIST PERSON WITH   EVAL \ “OCONV(PERSON.EMAIL.ADDRESSES, 'MCL')\”   喜欢'“.strtolower($ email)。”'   PERSON.EMAIL.ADDRESSES ID.SUPP NOPAGE   TOXML ELEMENTS WITHDTD“;

     

基本上,我想搜索   $ email的PERSON.EMAIL.ADDRESSES   (来自PHP应用程序),看看它是否存在   数据库。谢谢,Scott C. Crosby

所以,当你从他的例子中取出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'小写搜索文本' 得到我们想要的东西。它不是世界上最漂亮的东西,但它很容易做到并且有效。