DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: a12315
今日帖子: 53
在线用户: 8
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 abcjingtong (jingtong) ★☆☆☆☆ -
普通会员
2018/2/7 15:25:00
标题:
FDMemTable加载数据出错的问题,请大家帮忙看看 浏览:1574
加入我的收藏
楼主: 服务端获取数据
FDQuery.Close;
FDQuery.SQL.Text := vBLLSql;  // 多表关联查询
FDQuery.Open;
FDQuery.SaveToStream(vMemStream, TFDStorageFormat.sfBinary);

客户端显示数据
vMemStream.Position := 0;
FDMemTable.LoadFromStream(vMemStream, TFDStorageFormat.sfBinary);  // 出错,提示class EVariantTypeCastError with message 'Could not convert variant of type (Null) into type (Integer)'.

应该是FDQuery的数据中有为NULL的数据造成的,请问有什么办法解决吗?
----------------------------------------------
18114532@qq.com
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/2/7 15:33:04
1楼: 如果你用的是 DataSnap,请 must uses midaslib both c and s
----------------------------------------------
(C)(P)Flying Wang
作者:
男 abcjingtong (jingtong) ★☆☆☆☆ -
普通会员
2018/2/7 15:43:06
2楼: 谢谢楼上,可惜不是DataSnap,是用的DIOCP传输的。
----------------------------------------------
18114532@qq.com
作者:
男 ksrsoft (cb168) ★☆☆☆☆ -
普通会员
2018/2/7 15:51:25
3楼: save  json或者xml试试,字节丢失了?
----------------------------------------------
-
作者:
男 abcjingtong (jingtong) ★☆☆☆☆ -
普通会员
2018/2/7 15:54:20
4楼: 用的是sfBinary,流的方式保存读取的
----------------------------------------------
18114532@qq.com
作者:
男 744840146 (744840146) ▲▲▲▲▲ -
普通会员
2018/2/7 16:05:48
5楼: 数字类型有空值,更新一下数据库不就成了,数字字段默认应该有值的
----------------------------------------------
-
作者:
男 abcjingtong (jingtong) ★☆☆☆☆ -
普通会员
2018/2/7 16:27:18
6楼: 数据库字段设置的是允许为空的,后来把语句改了一下把空的排除了一下可以了。
----------------------------------------------
18114532@qq.com
作者:
男 stlont (龙头老大) ★☆☆☆☆ -
盒子活跃会员
2018/2/8 2:09:24
7楼: 把字段默认值设置为0,
可以避免一些null转换的问题
----------------------------------------------
-
作者:
男 abcjingtong (jingtong) ★☆☆☆☆ -
普通会员
2018/2/8 8:54:41
8楼: 嗯,谢谢老大,长知识了
----------------------------------------------
18114532@qq.com
作者:
男 wanlgrm (么么) ▲▲▲▲▲ -
普通会员
2018/2/11 8:29:48
9楼: 第一: firedac 操作数据库 跟midaslib 毛关系,不需要引用。
第二: sfBinary 二进制传输,占用空间最小。
第三:一般字符串类型可以用null,其他的类型最好有个默认值,要么写nvl or Isnull
----------------------------------------------
-只会复制粘贴!
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2018/6/4 13:58:29
10楼: 楼主应该是用了自增字段,多表查询时,某一行的自增字段为Null导致。

应该是个BUG,在 FireDAC.DatS.pas 找到 DoFixAutoIncs,修改为:

procedure DoFixAutoIncs;
var
  I: Integer;
begin
  for I := 0 to Count - 1 do
    if ItemsI[I].AutoIncrement then
      if not VarIsNull(ARow.GetData(I)) then
        if ItemsI[I].AutoIncrementStep > 0 then
        begin
          if FAutoIncs[I] < ARow.GetData(I) then
          FAutoIncs[I] := ARow.GetData(I);
        end
        else
        begin
          if FAutoIncs[I] > ARow.GetData(I) then
          FAutoIncs[I] := ARow.GetData(I);
        end;
end;
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2018/6/4 14:21:37
11楼: 测试数据库为MSSQL:
CREATE DATABASE testdb;
GO
USE testdb;
GO
CREATE TABLE t1
(
    [id] [INT] IDENTITY(1, 1) NOT NULL,
    [name] [VARCHAR](50)
);
CREATE TABLE t2
(
    [id] [INT] IDENTITY(1, 1) NOT NULL,
    [name] [VARCHAR](50)
);

INSERT INTO t1([name])VALUES('t1name1');
INSERT INTO t1([name])VALUES('t1name2');

INSERT INTO t2([name])VALUES('t2name1');

SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id;

如果用 ClientDataset.LoadFromStream 则正常。
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2018/6/4 16:44:48
12楼: 如果是datasnap rest,要尽量避免使用流传数据。emb推荐TFDJSONDataSets交互数据。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行70.3125毫秒 RSS