读书人

输入首字母就能查询数据库中汉字字段值

发布时间: 2012-02-14 19:19:19 作者: rapoo

输入首字母就能查询数据库中汉字字段值的代码
数据库中有个汉字的姓名字段,如何编写一段代码实现输入首字母就能查询的功能?
比如:
数据库中有:王小丫,王小红,王大丫
程序中输入:W的查询结果为:王小丫,王小红,王大丫
X的查询结果为:王小丫,王小红
D的查询结果为:王大丫
WX的查询结果为:王小丫
哪位高手指点一二

[解决办法]
有一个拼音控件可以实现
我邮箱8091858lin@163.com
我给你发过去
[解决办法]
建议在数据表中增加一个字段, 用于存放姓名字段的音头码, 这样便于查询。
这个音头码字段的值在姓名字段值发生变化时要及时更新。
[解决办法]
这样也不行,不可能在一个一个的输入,这样麻烦
而且楼主要实现的是W的查询结果为:王小丫,王小红,王大丫
X的查询结果为:王小丫,王小红
D的查询结果为:王大丫
WX的查询结果为:王小丫
这样的话,你在一个一个的输入,客户肯定不接受,一个拼音控件就可以了!~
直接转换!~但是也要在数据表中添加字段!~
[解决办法]
OK发过去了!
[解决办法]
你增加一个字段来保存拼音码不就OK了吗?先使用工具生成拼音码保存,然后模糊LIKE查询
[解决办法]
同意楼上
[解决办法]
晕了根我说的一个道理!~
[解决办法]
这样的话,你在一个一个的输入,客户肯定不接受,一个拼音控件就可以了!~

不明白你所说的。

“建议在数据表中增加一个字段, 用于存放姓名字段的音头码, 这样便于查询。
这个音头码字段的值在姓名字段值发生变化时要及时更新。”

你从哪里看出来这个实现办法会要求 "一个一个的输入 "啊?
[解决办法]
“建议在数据表中增加一个字段, 用于存放姓名字段的音头码, 这样便于查询。
这个音头码字段的值在姓名字段值发生变化时要及时更新。”

这个上面你没有说用第三方控件,如果不用第三空控件,你如何你实现数据表中存放姓名字段的音头码呢?可能是我理解错了!~
[解决办法]
弄一个拼音表可以吗,联合查询。
[解决办法]
GB2312-80信息交换编码表共收录了汉字和图形符号7445个,将这些汉字和图形符号排列在94行*94列的二维表中,表的行称为区,表的列称为位,区和位构成汉字的区位码。常用汉字位于16-55区,按汉字的拼音顺序排列,计算机处理汉字是以内码的形式表示的,内码和区位码的关系为:汉字内码=汉字区位码+A0A0H

第一个汉字为“啊”,位于16区1位,区位码为0001 0000 0000 0001,内码为1011 0000 1010 0001,以十六进制表示为B0A1H,拼音首字符为A的汉字内码为B0A1H-B0C4H。只要得到汉字的内码,就可以知道其拼音首字符。

下面给一段例子:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, DBCtrls, DB, DBTables, Grids, DBGrids;

type
TForm1 = class(TForm)
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Table1: TTable;
DBNavigator1: TDBNavigator;
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
function GetPY(hzchar:string):char;//返回汉字的拼音首字符
procedure LocatebyPY(t1:Ttable;Fieldname:string;PYstr:string);//检查符合条件的记录
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.GetPY(hzchar:string):char;
begin
case WORD(hzchar[1])shl(8)+WORD(hzchar[2]) of
$B0A1..$B0C4 : result:= 'A ';
$B0C5..$B2C0 : result:= 'B ';
$B2C1..$B4ED : result:= 'C ';
$B4EE..$B6E9 : result:= 'D ';
$B6EA..$B7A1 : result:= 'E ';
$B7A2..$B8C0 : result:= 'F ';
$B9C1..$B9FD : result:= 'G ';


$B9FE..$BBF6 : result:= 'H ';
$BBF7..$BFA5 : result:= 'J ';
$BFA6..$C0AB : result:= 'K ';
$C0AC..$C2E7 : result:= 'L ';
$C2E8..$C4C2 : result:= 'M ';
$C4C3..$C5B5 : result:= 'N ';
$C5B6..$C5BD : result:= 'O ';
$C5BE..$C6D9 : result:= 'P ';
$C6DA..$C8BA : result:= 'Q ';
$C8BB..$C8F5 : result:= 'R ';
$C8F6..$CBF9 : result:= 'S ';
$CBFA..$CDD9 : result:= 'T ';
$CDDA..$CEF3 : result:= 'W ';
$CEF4..$D188 : result:= 'X ';
$D189..$D4D0 : result:= 'Y ';
$D4D1..$D7F9 : result:= 'Z ';
else
result:=char(0);
end;
end;
procedure TForm1.LocatebyPY(t1:Ttable;Fieldname:string;PYstr:string);
label NotFound;
var
j:integer;
hzchar:string;
hzstr:array[0..100] of char;
begin
while not t1.eof do
begin
strcopy(hzstr,pchar(t1.fieldbyname(fieldname).asstring));
for j:=0 to length(PYstr)-1 do
begin
hzchar:=hzstr[2*j]+hzstr[2*j+1];
if (PYstr[j+1] <> '? ')and(uppercase(PYstr[j+1]) <> GetPY(hzchar))
then
goto NotFound;
end;
if messageDlg( '已经找到,继续查找? ',mtConfirmation,[mbYes,mbNo],0) <> mrYes then
exit;
NotFound:
t1.next;
end;
showmessage( '查找结束,没有找到! ');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
LocateByPY(table1, 'SZXB ',edit1.text);
end;

end.



[解决办法]
按区位码区间来查是不好的。只有一级字库是按拼音排序的。
[解决办法]
正如ahjoe(强哥)所言,二级字库只能用查表法来获取它们的拼音了。
[解决办法]
这个东西如果要实现你的二级字库查询,只能在数据表多建一个字段,然后才能实现你的功能,我不是给你拼音控件了吗?不会安装????????不会用????
[解决办法]
我见过一个模糊拼音查询的,就是:
比如有: 往下压;往下按;往上提 三个记录
你输入 WX
显示:
往下压
往下按
你输入:WXY 就可以准确定位到:
往下压

就是不知道是使用的数据库功能还是控件,等我回去用SPY++看看就知道了

读书人网 >.NET

热点推荐