打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Sqlite TASqlite3 xe 中文
TDBGrid  TASqlite3Table  AsString 使用unicode正常.
DataModule1.TTasKTable.FieldByName('title').AsString:=title;

乱码
  sl.Append('INSERT INTO CAT VALUES(1,0,''中文'',null,1)');
  for i := 0 to sl.Count - 1 do
  begin
    ibsInit.SQL.Text := sl[i];
    ibsInit.ExecSQL;
end;

  TASqlite3Query 使用unicode. AsAnsiString正常,使用AsString乱码
 params.CreateParam(ftString, 'NAME', ptInput);
  params.ParamByName('NAME').AsAnsiString := cat.name;


将中文保存到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字段正常.

http://2ccc.com/search.asp?KeyWord=asqlite
修改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');
测试正常

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
http://2ccc.com/article.asp?articleid=5700
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}部份。


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Unidac如何调用Oracle12c包和存储过程
嵌入式数据库比较(SQLite Birkeley DB Firebird)
SQL /数据库 使用蓝皮书 大富翁论坛-富翁笔记-
用infix读入不完整?用import delimited试试吧
SQLite的使用--SQLite语句
FireDAC 获取 INSERT 记录的自增 ID
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服