ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

修改ASQLite3D2010 支持中文显示

2022-09-06 00:01:32  阅读:232  来源: 互联网

标签:中文 ASQLite 修改 正常 vt SQLite3 ASQLite3D2010 DEFINE


使用ASQLite3组件时:

将中文保存到ansichar 字段.有些情况正常,有些情况不正常.建议将中文保存到unicode 字段.
使用tdbgrid+TASqlite3Table保存,显示正常.
使用TASqlite3Query SQl语句直接插入values('中文'),在tdbgrid中显示乱码.
使用params.ParamByName('memo').AsAnsiString := '中文';在tdbgrid中显示正常
或Params[0].AsAnsiString :='中文';在tdbgrid中显示正常
模糊查询中的ansi字段,直接写like "汉字%",测试无结果
like :v1
Params[0].AsAnsiString :="汉字%";测试无结果
结论:不支持模糊查询中的ansi字段

Update ansiString 字段正常.
with ASQLite3Query2 do begin
Close;
SQL.Clear;
SQL.text:=('update animal set memo= :v1 where id = 3');
Params[0].AsAnsiString := '中文德育';
ExecSql;
end

where子句中包含ansiString 字段 无结果
with ASQLite3Query1 do begin
Close;
SQL.Clear;
SQL.text:=('select * from animal where memo = :v1');
Params[0].AsAnsiString := '中文德育';
Open;
end;

将中文保存到unicode字段正常.


修改ASQLite3D2010 支持中文显示
ftp://download:CXf0yACUFZY5@2ccc.com/vcl/database/ASqlite3Delphi2010.rar

TASqlite3Query 使用unicode. AsString正常, 2009.12
呵呵,修改ASQLite一下支持中文,就改一个函数进去。
在TASQLite3DB.SQLite3_GetNextResult 对ftString类型处理,其它的没做处理,谁有空可以去处理ftMemo及其他数据类型,还有SQLite3_Column_text16我也没处理。

//pData := PAnsiChar(SQLite3_Column_text(TheStatement, I));
pData := PAnsiChar(WideStringToString(UTF8Decode(SQLite3_Column_text(TheStatement, I)),CP_ACP));//936));

评论上述修改没有太大意义,而且TAsqlite3Table 使用unicode. AsString仍不正常.
即使不改SQLite3_GetNextResult ,按照下面的来也可以.关键在于

类型
procedure GetFieldInfo(FieldInfo: string; var FieldType: TFieldType;

if (vt = 'varchar') or (vt = 'ansichar') or(vt='varAnsiChar') or (vt = 'AnsiChar') or (vt = 'varAnsiChar2') then begin
FieldType := ftString;
FieldLen := StrToInt(Copy(FieldInfo, p1 + 1, p2 - p1 - 1));
end else if (vt = 'nvarchar') or (vt = 'widechar') or (vt = 'nvarAnsiChar') or (vt = 'nAnsiChar') or (vt = 'nvarAnsiChar2') then begin

设置数据
procedure TASQLite3BaseQuery.SetFieldData(Field: TField; Buffer: Pointer);
..................
if Field.DataType = ftWideString then
begin
MyWBuf := PWideChar(Buffer);
//MyBuf :=PAnsiChar(UTF8Encode(StringToWideString(CP_ACP,PAnsiChar(Buffer)))) ;
Move(MyWBuf[1], (DestBuffer + GetFieldOffset(Field.FieldNo))^, Length(MyWBuf)*2+2) // GPA - Warning UTF-8 length can be potentially > length
end
........................

function TASQLite3DB.SQLite3_ExecSQL(TheStatement: string; Fields : TFields): integer;
..........
else if MyField.DataType = ftWideString then
SQLite3_Bind_Text16(p, b, PWideChar(MyField.Text), Length(MyField.AsString)*2, SQLITE_TRENT)

修改后 TAsqlite3Table 使用unicode. AsString正常.

TAsqliteDB.CharacterEncode:=STANDARD;
将数据类型设置为nvarchar.

with ASQLite3Query2 do begin
Close;
SQL.Clear;
SQL.Add('insert into animal (id, desc) values (61, "中文")');
ExecSQL;
测试正常


中文的模糊查询:
select * from 表名 where 字段名 like "汉字%"
select * from 表名 where 字段名 like "%字%"
select * from 表名 where 字段名 like "汉%"
测试正常

中文路径
DB1.Database :=('中文.sqb');
测试正常

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

TASqlite3Query 使用unicode. AsString仍不正常, 2009.02
现把改动细节列出来给大家参考:
1、asqlite_def文件中增加D2010和D2009支持
{$IFDEF VER210}
{$DEFINE ASQLite_D2PLUS}
{$DEFINE ASQLite_D3PLUS}
{$DEFINE ASQLite_D4PLUS}
{$DEFINE ASQLite_D5PLUS}
{$DEFINE ASQLite_D6PLUS}
{$DEFINE ASQLite_D7PLUS}
{$DEFINE ASQLite_D2005PLUS}
{$DEFINE ASQLite_D2006PLUS}
{$DEFINE ASQLite_D2009PLUS}
{$DEFINE ASQLite_D2010PLUS}
{DELPHI10}
{$B-}{$X+}{$T-}{$H+}
{$DEFINE ASQLite_DYNARRAY}
{$ENDIF}
{$IFDEF VER200}
{$DEFINE ASQLite_D2PLUS}
{$DEFINE ASQLite_D3PLUS}
{$DEFINE ASQLite_D4PLUS}
{$DEFINE ASQLite_D5PLUS}
{$DEFINE ASQLite_D6PLUS}
{$DEFINE ASQLite_D7PLUS}
{$DEFINE ASQLite_D2005PLUS}
{$DEFINE ASQLite_D2006PLUS}
{$DEFINE ASQLite_D2009PLUS}
{DELPHI10}
{$B-}{$X+}{$T-}{$H+}
{$DEFINE ASQLite_DYNARRAY}
{$ENDIF}
2、PAS文件修改(ASGSQLite3.pas)
主要是因为D2010中的一些变动:
数据类型变动
string类型:在D2010中string类型相当于WideString而不是原有的AnsiString类型
PChar类型:D2010中Char类型相当于WideChar而不是AnsiChar,所以PChar类型也变动了
父类TDataSet中类型定义变动:
Bookmark:Bookmark原为Pointer类型,在D2010中改为了TBookmark类型,这是一个Byte类型的数组,估计是为了解决内存泻漏问题而作的改动。
Record Buffer:Buffer原为PAnsiChar,在D2010中改为TRecordBuffer,这个一个PByte类型。
具体改动位置大家可以查看代码中{$IFDEF ASQLite_D2010PLUS}{$ELSE}{$ENDIF}部份。

标签:中文,ASQLite,修改,正常,vt,SQLite3,ASQLite3D2010,DEFINE
来源: https://www.cnblogs.com/tang-delphi/p/16660140.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有