2010年4月22日

根据汉字的拼音首字母搜索数据库(附 LINQ 调用方法)

我们经常需要使用拼音首字母来检索数据库,特别是应用于医院、商店等行业软件中。譬如搜索“zgr”就可以搜索所有包含“中国人”的记录。那么如果来实现才能即高效又方便呢?

方法一:先查询出所有记录,然后在逻辑层转化为拼音首字母后查询,显然傻瓜才会这么做。

方法二:在需要搜索的表中添加一个字段用于存放被检索字段内容对应的拼音,在搜索的时候同时去查询这两个字段,这种方法可行,但会增加数据库存放的大小。

方法三:在数据库中建立一个函数,在执行查询语句时通过此函数来转化搜索,函数如下:

代码
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
--
Author: xoyozo
--
Create date: 2010-4-17
--
Description: 提供中文首字母
--
=============================================
CREATE FUNCTION fun_getPY
(
@str NVARCHAR(4000)
)
RETURNS NVARCHAR(4000)
AS
BEGIN
DECLARE @word NCHAR(1),@PY NVARCHAR(4000)
SET @PY=''
WHILE len(@str)>0
BEGIN
SET @word=left(@str,1)
SET @PY=@PY+(CASE WHEN unicode(@word) BETWEEN 19968 AND 19968+20901
THEN (SELECT TOP 1 PY FROM (
SELECT 'A' AS PY,N'' AS word
UNION ALL SELECT 'B',N'簿'
UNION ALL SELECT 'C',N''
UNION ALL SELECT 'D',N''
UNION ALL SELECT 'E',N''
UNION ALL SELECT 'F',N''
UNION ALL SELECT 'G',N''
UNION ALL SELECT 'H',N''
UNION ALL SELECT 'J',N''
UNION ALL SELECT 'K',N''
UNION ALL SELECT 'L',N''
UNION ALL SELECT 'M',N''
UNION ALL SELECT 'N',N''
UNION ALL SELECT 'O',N''
UNION ALL SELECT 'P',N''
UNION ALL SELECT 'Q',N''
UNION ALL SELECT 'R',N''
UNION ALL SELECT 'S',N''
UNION ALL SELECT 'T',N''
UNION ALL SELECT 'W',N''
UNION ALL SELECT 'X',N''
UNION ALL SELECT 'Y',N''
UNION ALL SELECT 'Z',N''
) T
WHERE word>=@word COLLATE Chinese_PRC_CS_AS_KS_WS
ORDER BY PY ASC) ELSE @word END)
SET @str=right(@str,len(@str)-1)
END
RETURN @PY
END

 

使用方法:

select * fromwhere fun_getPY(字段) like N'%zgr%'

 

此方法是最快捷方便的,通过测试在文章表中搜索标题首字母,其耗时大约为不使用此函数搜索的 3 倍,相信部署在小数据量的项目中的成本是非常低的。

LINQ 方式操作

初学 LINQ 的朋友或许对 .dbml 文件不是很熟悉,数据库中的表可以直接拖动到 .dbml 的左侧,而存储过程、函数等可以直接拖到其右侧,然后就可以直接在逻辑使用了,下面是例子:

DataClasses1DataContext db = new DataClasses1DataContext();
var q
= from d in db.Documents
where d.Title.Contains("zgr") || db.fun_getPY(d.Title).Contains("zgr")
select d;

原文地址:http://xoyozo.me/blog/sql-by-chinese-spell.html

posted @ 2010-04-22 10:24 xoyozo 阅读(815) 评论(8) 编辑

2009年8月1日

如何解决系统补丁(KB971092)重复安装问题

一个关于Visual Studio 2008 SP1 (KB971092) 的系统补丁重复安装问题的解决方案

前几天微软发布了针对 VS2008SP1 的安全补丁,足足有300多M,当然更新了,但是更新完了又提示更新,没完没了,而且每次关机都会有安装补丁,请勿关闭电源的提示(我用 win7),那就忍了,想想MS应该会很快发布解决方案。没想到昨天出去了,我老婆在关机时安装更新时强行关机,导致重装系统。。。哎~后来查网上是说未安装 Visual C++,它的个头实在大,对于专门WEB开发的我来说没必要安装它,所以有了以下解决方案:

1.)下载补丁包或直接从 \Windows\SoftwareDistribution\Download\Install 目录找。

2.)双击安装,记住释放文件的目录。出现提示“VC Libraries QFE Patch 不适用或被系统的其他条件阻止。有关详细信息,请单击以下链接。”时,不要关闭窗口。

3.)找到释放安装文件的临时文件夹,复制到桌面。

4.)现在可以关闭刚才的提示窗口了。

5.)找到“\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat”这个文件,添加 Everyone 的权限为可写。

6.)运行桌面文件夹内的 VS90SP1-KB971092-x86.msp 等待安装完成,完成时没有提示。

7.)更新成功!

图片忘截了,现在更新成功了没法截,只能附上网上找来的图片!

posted @ 2009-08-01 14:15 xoyozo 阅读(3773) 评论(15) 编辑

2009年7月11日

在线生成条形码(39码、EAN-13)

 

公司有个项目是使用实体刷卡的会员管理系统,并为其它系统如餐饮系统、美发厅管理系统等提供统一的会员注册与信息管理。暂定使用一维条形码卡。

一般来说,商品最常用的编码是EAN-13,而非商品(如图书馆会员卡,驾驶证条码等)一般使用39码。

在线测试地址:http://www.toolsfamily.com/tools/barcode/

 

39码

39码比较简单,条码以“*”为起始符和终止符,见下图:

 

它所能表示的字符包括:0~9 的数字,大写 A~Z 的英文字母,「+」,「-」,「*」,「/」,「%」,「$」,「.」,以及空格符(Space)等,共44组编码。

39码表:“0”对应白色空位,“1”对应黑色线条。

字元

逻辑型态

字元

逻辑型态

A

110101001011

N

101011010011

B

101101001011

O

110101101001

C

110110100101

P

101101101001

D

101011001011

Q

101010110011

E

110101100101

R

110101011001

F

101101100101

S

101101011001

G

101010011011

T

101011011001

H

110101001101

U

110010101011

I

101101001101

V

100110101011

J

101011001101

W

110011010101

K

110101010011

X

100101101011

L

101101010011

Y

110010110101

M

110110101001

Z

100110110101

字元

逻辑型态

字元

逻辑型态

0

101001101101

100101001001

1

110100101011

100101011011

2

101100101011

100101101101

3

110110010101

100100101001

4

101001101011

101001001001

5

110100110101

100100100101

6

101100110101

110010101101

7

101001011011

空白

100110101101

8

110100101101

 

 

9

101100101101

 

值得注意的是,39码生成的条形中,每个码之间有一个空位,经扫描枪测试,该空位与一个单位的线条宽度相等时,能确保被正确扫描。

代码见附件

 

EAN-13码

EAN-13码是由13位数字构成,其中最后一位为校验码:

 

 

左侧空白区

起始符

左侧数据符

中间分隔符

右侧数据符

校验符

终止符

右测空白区

9个模块

3个模块

42个模块

5个模块

35个模块

7个模块

3个模块

9个模块

 校验码计算的步骤如下: 以 234235654652 为例:


数据码

校验码

代码位置序号

13

12

11

10

9

8

7

6

5

4

3

2

1

数字码

2

3

4

2

3

5

6

5

4

6

5

2

?

偶数位

 

3

+

2

+

5

+

5

+

6

+

2

 

奇数位

2

+

4

+

3

+

6

+

4

+

5

 

 

 

  ① 从序号2开始,将所有偶数位的数字代码求和,得出S1;  S1=3+2+5+5+6+2=23

  ② 从序号3开始,将所有奇数位的数字求和,得出S2;  S2=2+4+3+6+4+5=24

  ③ S3=S1*3+S2;  S3=23*3+24=93

  ④ C=10-(S3的个位数),得到校验码C的值。并且当S3的个位数为0时,C=0。  C=10-3=7

 EAN码的编码规则: 


数字符

左侧数据符

右侧数据符

A

B

C

0

0001101

0100111

1110010

1

0011001

0110011

1100110

2

0010011

0011011

1101100

3

0111101

0100001

1000010

4

0100011

0011101

1011100

5

0110001

0111001

1001110

6

0101111

0000101

1010000

7

0111011

0010001

1000100

8

0110111

0001001

1001000

9

0001011

0010111

1110100

 (关于左侧数据符,网络上的资料均显示A3及B6为6位数,经本人实践亲自查证,已修正)

起始符:101
中间分隔符:01010
终止符:101。
A、B、C中的“0”和“1”分别表示具有一个模块宽度的“空”和“条”。
因为左侧数据编码方式有两种,要按照前置码选其中一种,如表:

前置字符

左侧数据符编码规则的选择

0

A

A

A

A

A

A

1

A

A

B

A

B

B

2

A

A

B

B

A

B

3

A

A

B

B

B

A

4

A

B

A

A

B

B

5

A

B

B

A

A

B

6(中国)

A

B

B

B

A

A

7

A

B

A

B

A

B

8

A

B

A

B

B

A

9

A

B

B

A

B

A

6903244981002 (心相印软抽100抽) 为例:前置码为6,编码规则为 000000000101ABBBAA01010CCCCCC101000000000
再对应码表替换ABC,结果为:00000000010100010110100111010000100110110100011010001101010111010010010001100110111001011100101101100101000000000
 

在线DEMO:http://www.toolsfamily.com/tools/barcode/

源码下载:BarCode.rar

本文原始发表于:http://xoyozo.me/blog/barcode.html

posted @ 2009-07-11 09:37 xoyozo 阅读(9485) 评论(16) 编辑

导航

<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

公告

昵称:xoyozo
园龄:4年3个月
粉丝:0
关注:0

搜索

 
 

常用链接

我的标签

随笔档案

最新评论