导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
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
作者:
2018/2/7 15:33:04
1楼:
如果你用的是 DataSnap,请 must uses midaslib both c and s
----------------------------------------------
(C)(P)Flying Wang
作者:
2018/2/7 15:43:06
2楼:
谢谢楼上,可惜不是DataSnap,是用的DIOCP传输的。
----------------------------------------------
18114532@qq.com
作者:
2018/2/7 15:51:25
3楼:
save json或者xml试试,字节丢失了?
----------------------------------------------
-
作者:
2018/2/7 15:54:20
4楼:
用的是sfBinary,流的方式保存读取的
----------------------------------------------
18114532@qq.com
作者:
2018/2/7 16:05:48
5楼:
数字类型有空值,更新一下数据库不就成了,数字字段默认应该有值的
----------------------------------------------
-
作者:
2018/2/7 16:27:18
6楼:
数据库字段设置的是允许为空的,后来把语句改了一下把空的排除了一下可以了。
----------------------------------------------
18114532@qq.com
作者:
2018/2/8 2:09:24
7楼:
把字段默认值设置为0, 可以避免一些null转换的问题
----------------------------------------------
-
作者:
2018/2/8 8:54:41
8楼:
嗯,谢谢老大,长知识了
----------------------------------------------
18114532@qq.com
作者:
2018/2/11 8:29:48
9楼:
第一: firedac 操作数据库 跟midaslib 毛关系,不需要引用。 第二: sfBinary 二进制传输,占用空间最小。 第三:一般字符串类型可以用null,其他的类型最好有个默认值,要么写nvl or Isnull
----------------------------------------------
-只会复制粘贴!
作者:
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
作者:
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
作者:
2018/6/4 16:44:48
12楼:
如果是datasnap rest,要尽量避免使用流传数据。emb推荐TFDJSONDataSets交互数据。
----------------------------------------------
-