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);
        }
复制代码
 
转载:http://www.cnblogs.com/wuhuacong/archive/2010/01/25/1655916.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

和Null有关的函数(r3笔记第48天)

关于null相关的函数在日常的工作中还有比较实用的,可能会碰到各种和Null校验相关的情况,大体有以下几种。 case when decode nvl nvl...

330120
来自专栏乐沙弥的世界

dbms_xplan之display_cursor函数的使用

        DBMS_XPLAN包中display_cursor函数不同于display函数,display_curso...

21530
来自专栏芋道源码1024

数据库[分库分表]中间件 Sharding-JDBC 源码分析 —— SQL 解析(四)之插入SQL

本文主要基于 Sharding-JDBC 1.5.0 正式版 1. 概述 2. InsertStatement 3. #parse() 3.1 #parseI...

46270
来自专栏企鹅号快讯

数据库中间件 Sharding-JDBC 源码分析——SQL 解析之插入SQL

1. 概述 本文前置阅读: 《SQL 解析(一)之词法解析》 《SQL 解析(二)之SQL解析》 本文分享插入SQL解析的源码实现。 不考虑 INSERT SE...

21250
来自专栏Jerry的SAP技术分享

使用ABAP(ADBC)和Java(JDBC)连接SAP HANA数据库

在表DBCON里维护一条记录,指向HANA数据库。con_ENV里填入HANA数据库的主机名和端口号。如vmXXXX:30015

45730
来自专栏数据和云

Oracle Hints - 先知的提示

在上周恩墨微信大讲堂的讨论中,几个有趣的视图跃入我们的视野,可以分享给大家。 在Oracle 11g中,新增的视图V$SQL_HINT记录了Oracle数据库中...

30760
来自专栏文渊之博

DATETIME类型和BIGINT 类型互相转换

项目中使用BIGINT来存放时间,以下代码用来转换时间类型和BIGINT类型 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIE...

24480
来自专栏向治洪

百度地图之收索视野内的建筑物

根据用户移动地图的位置,显示在视野范围内的建筑物,简单的思路是,添加地图监听,当地图移动结束之后,计算出当前屏幕四个角的GeoPoint,根据这4个点,通过my...

19190
来自专栏文渊之博

探索SQL Server元数据(三):索引元数据

在第一篇中我介绍了如何访问元数据,元数据为什么在数据库里面,以及如何使用元数据。介绍了如何查出各种数据库对象的在数据库里面的名字。第二篇,我选择了触发器的主题,...

25410
来自专栏java达人

mysql left( right ) join使用on 与where 筛选的差异

有这样的一个问题mysql查询使用mysql中left(right)join筛选条件在on与where查询出的数据是否有差异。 可能只看着两个关键字看不出任...

25970

扫码关注云+社区

领取腾讯云代金券