2009-10-28 59 views
2

不幸的是,我必須與IBM的UniData數據庫系統進行一些交互。我正在使用UniObjects for .net的c#代碼。如何使用Uniquery執行UniData案例不敏感搜索

我正在構建一個具有單個搜索框的ASP.NET搜索頁面。我遇到的問題是標準區分大小寫。我如何使用UniQuery進行不區分大小寫的搜索?

我可以返回所有內容並在我的Linq 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

此選項AFFE cts查詢在 上的數據在字典定義中包含Pick®風格 轉換。 MCT, MCT和MCU轉換 字符的情況下,Pick®式處理代碼。這些轉換是 適用於 之前的數據比較和選擇,因此 省略匹配字符不同於 的情況。 UDT.OPTIONS 92使LIKE 轉換數據和選擇所基於的文字 ,所以 基於大小寫的情況選擇實際上不是 。

我真的不知道「Pick®式處理代碼MCL,MCT和MCU」是什麼。誰能解釋一下?

回答

1

您不必創建任何計算列或字典項目以在Unidata/Datatel中實現不區分大小寫的搜索。

我發現了一些文檔,建議選項92打開,我應該使用一些MCL代碼和OCONV功能。我無法完成它的工作。但!我在正確的軌道上!

我甚至得到了在火箭的軟件(從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 online 文檔中的 UDT.OPTIONS命令參考 中閱讀。

因此,他在談論如何去創造這些額外的字典項目,這是我不能遵守的事情。這太費勁了。感謝Alamance社區學院的Scott Crosby向我發送這封信:

男人,你問這個年齡段,而我 永遠不會回到你身邊。我記得你問我什麼時候通過一些 代碼篩選項目。您的 問題是關於查詢 Unidata DB,但更具體地說,是使用大小寫敏感搜索的 。我想出的 唯一的解決方案是使用 OCONV與MCL代碼,以強制 Unidata在比較之前對數據 做一個strtolower。您可能已經有 找到了一種方法來做到這一點,但無論如何這裏是 !

$ query =「具有 EVAL \」的人員名單OCONV(PERSON.EMAIL.ADDRESSES,'MCL')\「 LIKE'」。 strtolower($ email)。 「' PERSON.EMAIL.ADDRESSES ID.SUPP NOPAGE TOXML ELEMENTS WITHDTD」;

Bascially,我想查詢 PERSON.EMAIL.ADDRESSES爲$電子郵件 (從PHP應用程序),看它是否在 數據庫中存在。謝謝,斯科特·克羅斯比C.

所以,當你把PHP和XML的東西了他的例子中,命令如下:

LIST PERSON WITH EVAL"OCONV(PERSON.EMAIL.ADDRESSES,'MCL')" LIKE '[email protected]' PERSON.EMAIL.ADDRESSES ID.SUPP NOPAGE TOXML ELEMENTS WITHDTD"; 

的語法, 與EVAL「OCONV(FILE .FIELD.NAME,'MCL')「LIKE'小寫搜索文本' 獲得我們想要的。這不是世界上最漂亮的事情,但它很容易做到,它的工作原理。

1

我環顧四周一點,我無法找到在UniQuery也不是一個開關的情況下不敏感SELECTLIST,或SORT命令/設置爲修改的情況下,靈敏度。難以置信,呃?

這裏有一個想法,但:

您可以撥打txtSearch.Text.ToLower和設置轉換代碼(屬性3)MCLUT.OPERS字典LAST.NAMEFIRST.NAME等蘋果和蘋果。

一兩件事,我在測試這個發現的是,它只有在你周圍的每一個選擇條件通配符支架的作品,如:...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。恕我直言,對於降壓沒有太大的影響。

+0

感謝您的意見。看我的編輯。你怎麼看? – 2009-10-28 21:09:48

+0

因此,在執行比較時,查詢中沒有可以將字段轉換爲小寫的函數嗎? – 2009-10-29 22:32:03

+0

UniQuery中有一個CNV命令,用於在查詢期間將轉換代碼應用於字段;不幸的是,它似乎並不認爲它可以應用於WITH條件。 – 2009-10-29 22:43:03