2

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

我正在构建一个具有单个搜索框的 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.选项 92

U_INSENSITIVE_MATCH

此选项会影响在字典定义中包含 Pick® 样式转换的数据上运行的查询。Pick® 风格的处理代码 MCL、MCT 和 MCU 转换字符的大小写。这些转换在比较和选择之前应用于数据,从而省略了不同大小写的匹配字符。UDT.OPTIONS 92 使 LIKE 转换数据和选择所基于的文字,因此选择实际上不基于大小写。

我真的不知道“Pick® 风格的处理代码 MCL、MCT 和 MCU”是什么。谁能解释一下?

4

2 回答 2

1

我环顾四周,在 UniQuery 中找不到不区分大小写SELECTLIST、 或命令,也找不到修改区分大小写的开关/设置。SORT难以置信,是吗?

这里有一个想法:

您可以在字典中调用.ToLower并设置转换代码(属性3)为,,txtSearch.Text等。苹果到苹果。 MCLUT.OPERSLAST.NAMEFIRST.NAME

我在测试中发现的一件事是,它仅在您将每个选择标准都用通配符括号括起来时才有效,例如:...WITH LAST.NAME = ""[{0}]""

如果您不想修改库存字典LAST.NAME等,您可以创建新的字典项目并在它们前面加上L_(或其他东西)以区分它们。

编辑:

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

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

例如,如果您在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我上面提出的想法。恕我直言,物有所值。

于 2009-10-28T20:40:58.377 回答
1

您无需创建任何计算列或字典项即可在 Unidata/Datatel 中实现不区分大小写的搜索。

我发现一些文档建议打开选项 92,我应该使用一些 MCL 代码和 OCONV 函数。我无法让它工作。但!我走在正确的轨道上!

我什至从 Rocket Software(从 IBM 获得 UniData 的公司)的工程师那里得到了关于不区分大小写查询的答案:

从技术上讲,不存在不区分大小写的 select 语句。
但是,您可以执行使 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 社区学院的 Scott Crosby 给我发了这个:

伙计,你很久以前就问过这个问题,我再也没有回复你。我记得你在我筛选一些代码,做一个项目时问过你。您的问题是关于查询 Unidata DB,但更具体地说,是使用不区分大小写的搜索。我想出的唯一解决方案是将 OCONV 与 MCL 代码一起使用,以强制 Unidata 在比较之前对数据执行 strtolower。您可能已经找到了一种方法来做到这一点,但无论如何都在这里!

$query = "LIST PERSON WITH EVAL\"OCONV(PERSON.EMAIL.ADDRESSES,'MCL')\" LIKE '" 。strtolower($email) 。"'PERSON.EMAIL.ADDRESSES ID.SUPP NOPAGE TOXML 元素 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 回答