DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: fiscan1
今日帖子: 1
在线用户: 3
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 kamura (宁静致远) ★☆☆☆☆ -
普通会员
2016/5/3 15:22:42
标题:
DelphiXE7读取SQLite数据库中文乱码,求教解决方法 浏览:7436
加入我的收藏
楼主: procedure TForm1.Button1Click(Sender: TObject);
var
  id,name: String;
  I: Integer;
begin
  FDConnection1.Params.Database := ExtractFilePath(Application.ExeName)+'data.db';
  Memo1.Clear;
  FDQuery1.Close;
  FDQuery1.SQL.Clear;
  FDQuery1.SQL.Add('SELECT * FROM tbl_Package');

  try
    FDQuery1.Open;
  except
    Application.MessageBox('无法查询数据库', '出错', MB_OK + MB_ICONSTOP);
  end;

  for I := 0 to FDQuery1.RecordCount - 1 do
  begin
    id := FDQuery1.FieldByName('PkgID').AsString;
    name := FDQuery1.FieldByName('PkgName').AsString;
    Memo1.Lines.Add(id + ':' + name);
    FDQuery1.Next;
  end;
end;



----------
我用SQLite Developer软件打开数据库时,Data Encoding设置为ANSI 中文可正常显示,设置为UNICODE则中文显示为乱码。
Delphi中用FireDAC控件,StringFormat设置为ANSI则读取的数据全是问号,StringFormat设置为Unicode则和SQLite Developer中的乱码一样。
代码和数据库都在附件中,还望各位大师为我解惑,万分感谢!!!
此帖子包含附件:kamura_201653152239.rar 大小:2.94M
----------------------------------------------
宁静致远
作者:
男 kamura (宁静致远) ★☆☆☆☆ -
普通会员
2016/5/3 15:25:16
1楼: 另外还有个疑惑,SELECT * FROM tbl_Package 只能查询出前50条数据,后面还有几千条数据怎么查询出来?
----------------------------------------------
宁静致远
作者:
男 blacktulip (blacktulip) ★☆☆☆☆ -
盒子活跃会员
2016/5/3 15:29:50
2楼: 替换成下面的.
在某个条件下 fdquery1.recordcount 这个取得并不是全部数据的记录总数
procedure TForm1.Button1Click(Sender: TObject);
var
  id,name: String;
  I: Integer;
begin
  FDConnection1.Params.Database := ExtractFilePath(Application.ExeName)+'data.db';
  Memo1.Clear;
  FDQuery1.Close;
  FDQuery1.SQL.Clear;
  FDQuery1.SQL.Add('SELECT * FROM tbl_Package');

  try
    FDQuery1.Open;
  except
    Application.MessageBox('无法查询数据库', '出错', MB_OK + MB_ICONSTOP);
  end;
  while not fdquery1.eof do 
  begin
    id := FDQuery1.FieldByName('PkgID').AsString;
    name := FDQuery1.FieldByName('PkgName').AsString;
    Memo1.Lines.Add(id + ':' + name);
    fdquery1.next;
  end;
end;
----------------------------------------------
-
作者:
男 kamura (宁静致远) ★☆☆☆☆ -
普通会员
2016/5/3 15:29:59
2楼: SQLite Developer中Data Encoding为ANSI
此帖子包含附件:
PNG 图像
大小:110.2K
----------------------------------------------
宁静致远
作者:
男 kamura (宁静致远) ★☆☆☆☆ -
普通会员
2016/5/3 15:31:07
3楼: Data Encoding设置为UNICODE
此帖子包含附件:
PNG 图像
大小:108.8K
----------------------------------------------
宁静致远
作者:
男 kamura (宁静致远) ★☆☆☆☆ -
普通会员
2016/5/3 15:32:47
4楼: delphi中FDConnection1控件的StringFormat设置为ANSI
此帖子包含附件:
PNG 图像
大小:21.8K
----------------------------------------------
宁静致远
作者:
男 kamura (宁静致远) ★☆☆☆☆ -
普通会员
2016/5/3 15:33:11
5楼: delphi中FDConnection1控件的StringFormat设置为Unicode
此帖子包含附件:
PNG 图像
大小:25.6K
----------------------------------------------
宁静致远
作者:
男 kamura (宁静致远) ★☆☆☆☆ -
普通会员
2016/5/3 15:40:18
6楼: 谢谢blacktulip,之前用adoquery都是用RecordCount来取记录总数,还以为fdquery也一样呢。
----------------------------------------------
宁静致远
作者:
男 kamura (宁静致远) ★☆☆☆☆ -
普通会员
2016/5/3 18:46:41
7楼: 怎么解决乱码问题?求大神支招啊(/ □ \)
----------------------------------------------
宁静致远
作者:
男 xuchuantao (暗黑天使) ★☆☆☆☆ -
普通会员
2016/5/3 20:25:16
8楼: 例子,aBytes := SysUtils.BytesOf(TgtPDString(LTitleObj).HexToString);
        Offset := TEncoding.GetBufferEncoding(aBytes, AEncoding);
        if Assigned(AEncoding) then
        begin
          aBytes := TEncoding.Convert(AEncoding, TEncoding.ANSI, aBytes, Offset,
          Length(aBytes) - Offset);
          LTitle := TEncoding.ANSI.GetString(aBytes);
        end;
你把代码全部发上来,要不没办法帮你.
你可以参考下我解决乱码问题的代码.
http://bbs.2ccc.com/topic.asp?topicid=505041
----------------------------------------------
按此在新窗口浏览图片
作者:
男 xuchuantao (暗黑天使) ★☆☆☆☆ -
普通会员
2016/5/3 23:26:18
9楼: 初步排查问题应该是FireDAC对中文不友好照成的.建议直接使用SQLlite
附件里有相关控件
例子
SQLiteDatabase := TSQLiteDatabase.Create(ExtractFilePath(Application.ExeName)
    + 'data.db');
    SQLiteTable := TSQLiteTable.Create(SQLiteDatabase, 'SELECT * FROM tbl_Package');
    while not SQLiteTable.eof do
    begin
    id := SQLiteTable.FieldByName['PkgID'];
    name := SQLiteTable.FieldByName['PkgName'];
    Memo1.Lines.Add(id + ':' + name);
    SQLiteTable.next;
    end;
    SQLiteDatabase.Free;
此帖子包含附件:xuchuantao_201653232618.zip 大小:298.6K
----------------------------------------------
按此在新窗口浏览图片
作者:
男 tianpanhaha (tianpanhaha) ▲▲▲▲△ -
普通会员
2016/5/4 0:54:54
10楼: 我sqlite字段,文本,全部用的中文,一点乱码没有阿
----------------------------------------------
 QQ群:325010556 欢迎加入。
作者:
男 tianpanhaha (tianpanhaha) ▲▲▲▲△ -
普通会员
2016/5/4 0:56:32
11楼: 你原数据全部导出,Delphi读了之后,用fdac写进去
----------------------------------------------
 QQ群:325010556 欢迎加入。
作者:
男 kamura (宁静致远) ★☆☆☆☆ -
普通会员
2016/5/4 11:09:23
12楼: 感谢xuchuantao大师!用sqlite解决了~ 谢谢~
----------------------------------------------
宁静致远
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行138.6719毫秒 RSS