winform用户输入查询与拼音首字母的结合,提高用户的操作体验

在Winform界面中,同样也可以做到智能提示,由于Winform中的响应速度比较快,我们可以根据输入的首字母或者部分中文快速更新列表内容即可,如下图所示。

其实以上两个,都是需要一个Sql函数,就是把中文转换为首字母的函数,以便能够快速搜索内容,下面我列出SqlServer和Oracle的转换首字母的函数。以飨读者。

SqlServer的汉字转拼音码的函数:

代码
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->--
--
Definition for user-defined function f_GetPy :
--
GO
create   function   [dbo].f_GetPy(@str  nvarchar(4000))
returns   nvarchar(4000)
as
begin
declare   @strlen   int,@re  nvarchar(4000)
declare   @t   table(chr  nchar(1)   collate   Chinese_PRC_CI_AS,letter  nchar(1))
insert   into   @t(chr,letter)
   
select   '','A '  union   all   select  '','B '  union   all
   
select   '','C '  union   all   select  '','D '  union   all
   
select   '','E '  union   all   select  '','F '  union   all
   
select   '','G '  union   all   select  '','H '  union   all
   
select   '','J '  union   all   select  '','K '  union   all
   
select   '','L '  union   all   select  '','M '  union   all
   
select   '','N '  union   all   select  '','O '  union   all
   
select   '','P '  union   all   select  '','Q '  union   all
   
select   '','R '  union   all   select  '','S '  union   all
   
select   '','T '  union   all   select  '','W '  union   all
   
select   '','X '  union   all   select  '','Y '  union   all
   
select   '','Z '
   
select   @strlen=len(@str),@re=' '
   
while   @strlen>0
   
begin
       
select  top   1  @re=letter+@re,@strlen=@strlen-1
           
from  @t   a   where   chr <=substring(@str,@strlen,1)
           
order  by   chr   desc
       
if   @@rowcount=0
           
select  @re=substring(@str,@strlen,1)+@re,@strlen=@strlen-1
   
end
   
return(@re)
end

Oracle的汉字转拼音首字母的函数:

代码
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->CREATE ORREPLACE FUNCTION F_PINYIN(P_NAMEIN VARCHAR2)RETURN VARCHAR2 AS
     V_COMPARE
VARCHAR2(100);
     V_RETURN
VARCHAR2(4000);

    
FUNCTION F_NLSSORT(P_WORDIN VARCHAR2)RETURN VARCHAR2 AS
    
BEGIN
     
RETURN NLSSORT(P_WORD,'NLS_SORT=SCHINESE_PINYIN_M');
    
END;
   
BEGIN

   
FOR I IN 1..NVL(LENGTH(P_NAME),0) LOOP
     V_COMPARE :
= F_NLSSORT(SUBSTR(P_NAME, I,1));
    
IF V_COMPARE>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('')THEN
      V_RETURN :
= V_RETURN|| 'A';
     ELSIF V_COMPARE
>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('簿')THEN
      V_RETURN :
= V_RETURN|| 'B';
     ELSIF V_COMPARE
>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('')THEN
      V_RETURN :
= V_RETURN|| 'C';
     ELSIF V_COMPARE
>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('')THEN
      V_RETURN :
= V_RETURN|| 'D';
     ELSIF V_COMPARE
>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('')THEN
      V_RETURN :
= V_RETURN|| 'E';
     ELSIF V_COMPARE
>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('')THEN
      V_RETURN :
= V_RETURN|| 'F';
     ELSIF V_COMPARE
>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('')THEN
      V_RETURN :
= V_RETURN|| 'G';
     ELSIF V_COMPARE
>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('')THEN
      V_RETURN :
= V_RETURN|| 'H';
     ELSIF V_COMPARE
>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('')THEN
      V_RETURN :
= V_RETURN|| 'J';
     ELSIF V_COMPARE
>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('')THEN
      V_RETURN :
= V_RETURN|| 'K';
     ELSIF V_COMPARE
>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('')THEN
      V_RETURN :
= V_RETURN|| 'L';
     ELSIF V_COMPARE
>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('')THEN
      V_RETURN :
= V_RETURN|| 'M';
     ELSIF V_COMPARE
>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('')THEN
      V_RETURN :
= V_RETURN|| 'N';
     ELSIF V_COMPARE
>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('')THEN
      V_RETURN :
= V_RETURN|| 'O';
     ELSIF V_COMPARE
>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('')THEN
      V_RETURN :
= V_RETURN|| 'P';
     ELSIF V_COMPARE
>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('')THEN
      V_RETURN :
= V_RETURN|| 'Q';
     ELSIF V_COMPARE
>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('')THEN
      V_RETURN :
= V_RETURN|| 'R';
     ELSIF V_COMPARE
>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('')THEN
      V_RETURN :
= V_RETURN|| 'S';
     ELSIF V_COMPARE
>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('')THEN
      V_RETURN :
= V_RETURN|| 'T';
     ELSIF V_COMPARE
>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('')THEN
      V_RETURN :
= V_RETURN|| 'W';
     ELSIF V_COMPARE
>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('')THEN
      V_RETURN :
= V_RETURN|| 'X';
     ELSIF V_COMPARE
>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('')THEN
      V_RETURN :
= V_RETURN|| 'Y';
     ELSIF V_COMPARE
>= F_NLSSORT('')AND V_COMPARE<= F_NLSSORT('')THEN
      V_RETURN :
= V_RETURN|| 'Z';
    
END IF;
   
END LOOP;
   
RETURN V_RETURN;
  
END;

使用代码大概如下所示:

使用例子1:

代码
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->        ///<summary>
       
/// 根据商品名称获取商品列表
       
/// </summary>
       
/// <param name="goodsType">商品类型</param>
       
/// <returns></returns>
        public List<GoodsInfo> FindByName(string goodsName)
        {
           
string sql= string.Format("Name like '%{0}%' or dbo.f_GetPy(Name) like '{0}%' ", goodsName);
           
returnthis.Find(sql);
        }
 
原文地址:https://www.cnblogs.com/51net/p/2390461.html