首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Uniquery进行不区分大小写的UniData搜索

如何使用Uniquery进行不区分大小写的UniData搜索
EN

Stack Overflow用户
提问于 2009-10-28 19:04:48
回答 2查看 2K关注 0票数 2

不幸的是,我不得不与IBM的UniData数据库系统进行一些交互。我是用UniObjects for .net的UniObjects代码来完成这一任务的。

我正在构建一个只有一个搜索框的ASP.NET搜索页面。我遇到的问题是,准则是区分大小写的。如何使用UniQuery进行不区分大小写的搜索?

我可以返回所有内容,并在Linq到XML语句中实现大小写不敏感,但这将导致性能问题,因为它效率不高。

下面是我编写的代码:

代码语言:javascript
复制
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类似于转换数据和选择所基于的文字,因此实际上选择不是基于大小写。

我不知道“挑选式处理代码MCL、MCT和MCU”是什么。有人能解释吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-16 14:18:33

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

我发现一些文档建议打开选项92,我应该使用一些MCL代码和OCONV函数。我没能把它弄到手。但!我在正确的轨道上!

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

技术上没有,没有不区分大小写的select语句.

然而,您可以做一些事情,使您的UniQuery语句的行为方式相同。

您可以在属性上创建一个字典项,将其转换为所有大写或小写。在下面的示例中,字典项将字段2转换为所有小写。例子:

声发射DICT F2.CASE

001: d

002: 2

003: MCL

004:

005: 15升

006: s UDT.OPTIONS 92使单片机、MCL和MCT类型字典的行为不同。您可以在UDT.OPTIONS联机文档中的UniData命令引用中了解到这一点。

所以,他说要先动手去创造这些额外的字典项目,这是我无法忍受的。只是太费劲了。感谢阿拉曼斯社区学院的斯科特·克罗斯比送我这个:

先生,你很久以前就问过这个了,我再也没回过你的电话。我记得你问我在筛选一些代码的时候,我在做一个项目。您的问题是查询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元素WITHDTD";

基本上,我想在PERSON.EMAIL.ADDRESSES中搜索$email (来自PHP ),以查看数据库中是否存在它。谢谢,斯科特C.克罗斯比

因此,当您从他的示例中删除PHP和XML内容时,命令如下所示:

代码语言:javascript
复制
LIST PERSON WITH EVAL"OCONV(PERSON.EMAIL.ADDRESSES,'MCL')" LIKE 'some.lower.case@email.address' PERSON.EMAIL.ADDRESSES ID.SUPP NOPAGE TOXML ELEMENTS WITHDTD";

使用EVAL"OCONV(FILE.FIELD.NAME,'MCL')“类似于‘小写搜索文本’的语法使我们得到了我们想要的。这不是世界上最漂亮的东西,但做起来很容易,而且很管用。

票数 1
EN

Stack Overflow用户

发布于 2009-10-28 20:40:58

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

,这里有一个想法:

您可以在.ToLower上调用txtSearch.Text,并在UT.OPERS字典中将LAST.NAMEFIRST.NAME等的转换代码(属性3)设置为MCL

我在测试中发现的一件事是,只有当您用通配符括号包围每个选择条件时,它才能工作,例如:...WITH LAST.NAME = ""[{0}]""

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

编辑:

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

如果您在描述您的字段的字典的属性3中放置了这些“挑选样式”转换代码中的任何一个,则每次使用该字典时,转换都会运行。

例如,如果您将"MCL“添加到您的LAST.NAME字段中,那么当您执行LIST UT.OPERS LAST.NAME时,所有姓氏都将以小写形式格式化,而不管数据是如何实际存储的。

我认为UDT.OPTION 92所做的是确保选择标准中的文字也使用字典中相同的转换代码进行转换,从而使您对大小写不敏感。

代码语言:javascript
复制
SELECT UT.OPERS WITH LAST.NAME = "Smith"

将改为:

代码语言:javascript
复制
SELECT UT.OPERS WITH LAST.NAME = "smith" 

在进行比较之前。

从本质上说,.ToLower 92为您所做的就是防止您不得不按照我前面介绍的想法调用。不太划算,

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1639403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档