DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: jeff_icyp
今日帖子: 20
在线用户: 2
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 ken_hsiao (ken) ▲▲▲▲▲ -
普通会员
2020/1/14 8:36:01
标题:
DELPHI 10.3.3 FDMemtable wideString 问题 浏览:601
加入我的收藏
楼主: 请教一下,我在 DELPHI 10.3.2 使用FDQuery 读取资料在放入FDMemtable 中,wideString 栏位可以正常显示UTF-8,但是升级到 10.3.3时,却发现wideString 的栏位变成不支援UTF-8,不知是那边需要调整呢?
此帖子包含附件:
JPEG 图像
大小:9.5K
----------------------------------------------
-
作者:
男 earthsbest (全能中间件) ▲▲△△△ -
注册会员
2020/1/14 8:49:59
1楼: 赋值和读取用XX.AsWideString
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 ken_hsiao (ken) ▲▲▲▲▲ -
普通会员
2020/1/14 9:05:34
2楼: 赋值我是用CopyDataSet的方法,
mt1.CopyDataSet(q0, [coAppend]);

读取改用AsWideString 结果一样,还是问号,我有试过用其他的memtable元件,结果是正常的,只有FDMemtable 升级到10.3.3时出现问题,也重新安装了一次DELPHI,再没安装其他第三方元件前测试,结果还是一样是错误的!
----------------------------------------------
-
作者:
男 wntee (wntee) ▲▲▲△△ -
注册会员
2020/1/14 9:09:38
3楼: 这种问题一般出现在fdconnection上面,找找属性
----------------------------------------------
当前后左右都没有路时,命运一定是鼓励你向上飞了...
作者:
男 ken_hsiao (ken) ▲▲▲▲▲ -
普通会员
2020/1/14 9:15:05
4楼: 问题是我用FDQuery 读取的结果是正确的!是放进FDMemtable 后才出错!
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2020/1/14 10:34:02
5楼: 字段类型一样吗?
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 ken_hsiao (ken) ▲▲▲▲▲ -
普通会员
2020/1/14 10:46:11
6楼: 都是一样的,原程式码在10.3.2是正常的,到了10.3.3才发现有这个问题!
----------------------------------------------
-
作者:
男 earthsbest (全能中间件) ▲▲△△△ -
注册会员
2020/1/14 10:52:50
7楼: 如果楼主能提供更多信息就好了,要是能提供少许代码片段就更好了。

下图中的RFDataSet就是继承的FDMemTable,接收服务端使用FDQuery查询返回的数据,并用DBGrid显示,数据库中用NVARCHAR类型存储Unicode的内容,一切正常。

我想知道楼主是哪些情况下会出现。
此帖子包含附件:
PNG 图像
大小:320.2K
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 ken_hsiao (ken) ▲▲▲▲▲ -
普通会员
2020/1/14 11:31:43
8楼: 我建立新的专案,测试结果,资料只要转到TFDMemtable WideString的栏位就会出问题!

procedure TForm1.Button1Click(Sender: TObject);
begin
  with q1 do begin
    Close;
    Connection := con1;
    with SQL do begin
      Clear;
      Add('SELECT EMP_CODE, EMP_NAME FROM PER_EMP');
      Add('WHERE EMP_CODE='+QuotedStr('010201'));
    end;
    Open;
  end;

  mt1.Close;
  mt1.CopyDataSet(q1, [coStructure, coAppend]);
end;
此帖子包含附件:
JPEG 图像
大小:23.1K
----------------------------------------------
-
作者:
男 earthsbest (全能中间件) ▲▲△△△ -
注册会员
2020/1/14 11:49:13
9楼: 找到问题了,在 FireDAC.Comp.DataSet.pas 5379 行的 TFDDataSet.CopyRecordBase 过程
此帖子包含附件:
PNG 图像
大小:128.1K
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 earthsbest (全能中间件) ▲▲△△△ -
注册会员
2020/1/14 12:04:18
10楼: 貌似 CopyDataSet 更多的是为 non-FireDAC 设计,如果两个 DataSet 都是 FireDAC dataset ,通过Data赋值速度更快。这样:

FDMemtable1.Data:=FDQuery1.Data

当然 CopyDataSet  还适合另外的场景,比如将多个Dataset或多次追加DataSet到另一个FireDAC dataSet。
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2020/1/14 12:16:47
11楼: 字段类型用WideString应该可以避免这个问题,即TField.DataType = ftWideString,如果DataType = ftString,则是针对AnsiString的。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 ken_hsiao (ken) ▲▲▲▲▲ -
普通会员
2020/1/14 12:18:31
11楼: 请教一下,拿掉之后,还要做什么动作吗?我修改后,结果还是一样!

procedure TFDDataSet.CopyRecordBase(ASource: TDataset; AExcludeNewEmptyValues: Boolean);
var
  i: Integer;
  oSrcField: TField;
  oDestField: TField;
begin
  for i := 0 to ASource.FieldCount - 1 do begin
    oSrcField := ASource.Fields[i];
    oDestField := FindField(oSrcField.FieldName);
    if (oDestField <> nil) and oDestField.CanModify and
       not (AExcludeNewEmptyValues and VarIsEmpty(oSrcField.NewValue)) then
//{$IFNDEF NEXTGEN}
//      if oDestField is TStringField then
//        oDestField.AsAnsiString := oSrcField.AsAnsiString
//      else
//{$ENDIF}
        oDestField.Assign(oSrcField);
  end;
end;
----------------------------------------------
-
作者:
男 earthsbest (全能中间件) ▲▲△△△ -
注册会员
2020/1/14 13:16:03
12楼: 通过菜单 Project —>Add to Project 选择 FireDAC.Comp.DataSet.pas ,然后重新编译工程。
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 ken_hsiao (ken) ▲▲▲▲▲ -
普通会员
2020/1/14 13:38:24
13楼: 可以了,实在是太感谢了!
----------------------------------------------
-
作者:
男 ken_hsiao (ken) ▲▲▲▲▲ -
普通会员
2020/1/14 13:43:07
14楼: 不过好像每一个专案都需要Project —>Add to Project 选择 FireDAC.Comp.DataSet.pas,不是只要改一次就好了!
----------------------------------------------
-
作者:
男 laimama_1 (苞谷) ★☆☆☆☆ -
盒子活跃会员
2020/1/14 15:41:55
15楼: 把FireDAC.Comp.DataSet.pas放到工程目录下就可以了,专案是台湾的说法?
----------------------------------------------
-
作者:
男 ken_hsiao (ken) ▲▲▲▲▲ -
普通会员
2020/1/14 16:37:04
16楼: 是的,謝謝幫忙!
----------------------------------------------
-
作者:
男 sun2grit (Asun) ★☆☆☆☆ -
盒子活跃会员
2020/1/16 17:20:09
17楼: EMB真让人不省心!
----------------------------------------------
家具安装 万师傅家具安装平台家电清洗 一键式测量仪
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行46.875毫秒 RSS