DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: hcwong1993
今日帖子: 33
在线用户: 9
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 cenunus (cenunus) ★☆☆☆☆ -
普通会员
2023/7/10 14:37:39
标题:
字段取值能否为空的问题 浏览:1240
加入我的收藏
楼主: 请问用TFDQuery时如何判断返回的字段能否为空?
----------------------------------------------
作者:
男 cxg417 (cxg417) ★☆☆☆☆ -
盒子活跃会员
2023/7/10 16:17:31
1楼: FieldByName('XXX').IsNull
----------------------------------------------
-
作者:
男 cenunus (cenunus) ★☆☆☆☆ -
普通会员
2023/7/10 16:56:38
2楼: FieldByName('XXX').IsNull是判断是否为空,而不是判断能不能为空。
----------------------------------------------
作者:
男 cxg417 (cxg417) ★☆☆☆☆ -
盒子活跃会员
2023/7/10 18:56:54
3楼: FieldByName('XXX').Required
----------------------------------------------
-
作者:
男 cenunus (cenunus) ★☆☆☆☆ -
普通会员
2023/7/10 19:24:47
4楼: FieldByName('XXX').Required这个值恒定为false,没有用
----------------------------------------------
作者:
男 cxg417 (cxg417) ★☆☆☆☆ -
盒子活跃会员
2023/7/10 20:21:34
5楼: 可以说说你的目的是什么,看看有没有别的办法
----------------------------------------------
-
作者:
男 ybj316 (ybj) ★☆☆☆☆ -
盒子活跃会员
2023/7/10 20:40:22
6楼: 这是数据库的字段定义问题,和TFDQuery没关系吧,可以通过查该数据库的系统表可了解字段是否为空的情况
----------------------------------------------
-
作者:
男 cenunus (cenunus) ★☆☆☆☆ -
普通会员
2023/7/10 22:39:58
7楼: 我在模仿Navicat写设计表的界面,最后两列不知道怎么办,请看图
此帖子包含附件:
PNG 图像
大小:55.0K
----------------------------------------------
作者:
男 tuesdays (Tuesday) ▲▲▲▲△ -
普通会员
2023/7/11 9:06:36
8楼: 不要请允许空值null,  null在语言界就是一bug, 
数据库做表规范: 1: 不允许空值,  2:默认值:0
看你的表, 怎么没有默认值? 后期只需要判断默认值即可.
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
男 kenliaoliao (ben) ★☆☆☆☆ -
普通会员
2023/7/11 11:36:32
9楼: 一个表是否允许为空需要查数据库的字典来获取
如Oracle 查询user_tab_columns表中的Nullable字段获取
此帖子包含附件:
JPEG 图像
大小:22.7K
----------------------------------------------
-
作者:
男 yhhe (yhhe) ★☆☆☆☆ -
盒子活跃会员
2023/7/11 13:05:02
10楼: @tuesdays

请教一下,不用null而用默认值0的情况下如何判断该字段是用户还未填写还是填写了,确实实际就应该填0?
----------------------------------------------
网络记事本 http://hi.baidu.com/luckyhhe
作者:
男 tuesdays (Tuesday) ▲▲▲▲△ -
普通会员
2023/7/11 14:37:57
11楼: @yhhe
默认值啊.用户未提交 (都属于默认值) 
比如看到了 '' 空值, 用户这是提交了空值? 那也是提交了数据, 空值也是值, 空值不等于null. 

 强烈建议不要玩null,  ''=null 在mysql你根本解释不了.
保持规范: 直接默认值0, 其它的值全部是用户提交的.没有例外.
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
男 tuesdays (Tuesday) ▲▲▲▲△ -
普通会员
2023/7/11 14:41:45
12楼:  
 以前有个笑话, 老师说写代码if, 如果他今天生日, 变量就为true, 如果他是女生变量也为true, 如果他是学生, 变量也为true,  条件为true, 就给他送礼物. 

 下面的同学回答, 那要是所有if都没进去呢? 
 楼主, 请回答.
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
男 myid (林锋) ★☆☆☆☆ -
盒子活跃会员
2023/7/11 16:19:03
13楼: 我有强迫症,任何列不允许有null,默认是0 或者‘’,省很多麻烦
----------------------------------------------
-
作者:
男 tuesdays (Tuesday) ▲▲▲▲△ -
普通会员
2023/7/11 16:26:51
14楼: @myid 
尽可能不要''空, 如果查出来判断  = '' 那跟null是冲突的, null的字段查出来也是''  null 是否等于 '' 好像没人解释得通.  
 如js, php代码, 基本上不会写null.
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
男 cxg417 (cxg417) ★☆☆☆☆ -
盒子活跃会员
2023/7/11 17:48:03
15楼: 楼主是做表结构设计器,不是设计表结构。所以争论字段允许为空好,还是不允许为空好,和他做的产品没有关系。当然我自己设计表结构时,除了日期字段,其他类型的字段都是不允许为Null的。
----------------------------------------------
-
作者:
男 cenunus (cenunus) ★☆☆☆☆ -
普通会员
2023/7/11 20:04:49
16楼: 楼上说对了,我是在试着做个表设计器
----------------------------------------------
作者:
男 cenunus (cenunus) ★☆☆☆☆ -
普通会员
2023/7/11 20:28:47
17楼: 看来只能从information_schema.COLUMNS中读取信息了,对了,数据库是mysql的
----------------------------------------------
作者:
男 cenunus (cenunus) ★☆☆☆☆ -
普通会员
2023/7/11 20:38:19
18楼: information_schema.COLUMNS中的IS_NULLABLE字段存储的就是字段的值能否为空
----------------------------------------------
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2023/7/12 5:51:48
19楼: Testing if ISnull or not using a FDMemTable or FDQuery

uses
  System.StrUtils;

procedure TForm1.Button1Click(Sender: TObject);
var
  LText: string;
begin
  Memo1.Clear;
  //
  FDMemTable1.First;
  //
  while not(FDMemTable1.Eof) do
    begin
      for var i: integer := 0 to FDMemTable1.Fields.Count - 1 do
        begin
          LText := LText + ' -> ' +          { }
          FDMemTable1.Fields[i].DisplayName +          { }
          IfThen(FDMemTable1.Fields[i].IsNull, ' is Null', ' NOT is Null') + ' => ' + { }
          FDMemTable1.Fields[i].AsString;
        end;
      //
      Memo1.Lines.Add(LText);
      LText := '';
      //
      FDMemTable1.Next;
    end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  FDMemTable1.Edit;
  FDMemTable1.FieldByName('MyName').Clear;  // MyName = string(20)
  FDMemTable1.FieldByName('MyValue').Clear; // MyValue = integer
  FDMemTable1.Post;
end;

"NULL" is a state, not a value!

That is, if a field has never received a value before, then its state is null (never changed state)

If a field has already received any value, then its state is "not null".

To force a field back to its null status, you can use the "CLEAR" procedure of the TField class.

myTable.FieldByName('xxx').CLEAR or any other way to access "CLEAR"

When you define a field with the value "EMPTY", it is not null!!! he is "empty"

Now test the DBGrid with some values and use Button1 and Button2
此帖子包含附件:
PNG 图像
大小:12.2K
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 yhhe (yhhe) ★☆☆☆☆ -
盒子活跃会员
2023/7/12 8:39:32
20楼: @tuesdays

可能我没说明白,比如有一栏金额

当允许null时,null表示用户还没填该金额,0表示已填,确实实际发生就是0

那么,当不允许null时且默认值设置为0时,如何判断这个0到底是用户填的0还是没有填默认值的0?
----------------------------------------------
网络记事本 http://hi.baidu.com/luckyhhe
作者:
男 pp0123 (pp0123) ★☆☆☆☆ -
普通会员
2023/7/12 9:17:47
21楼: 尽可能别以 null 判断用戶的资料, null 祇该予程序员除错时提供线索.
若使用时修改/删除了数目, 那数据库会改成 null 吗? 
金额若不为负值, 那就用负值来表示特定意义吧.
其实0已经是不正常的金额数, 用户填上0就是不正当.
----------------------------------------------
-
作者:
男 cenunus (cenunus) ★☆☆☆☆ -
普通会员
2023/7/12 12:11:11
22楼: 楼上二位,我说的是判断字段能否为null,而不是判断字段的值是不是null
----------------------------------------------
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
2023/7/13 9:29:44
23楼: 我测试了一下,FDQuery1.FieldsByName('UserCode').IsRequired是能判断数据库表的UserCode字段能否为空的. 不存在这个值一直是false的问题.
----------------------------------------------
-
作者:
男 chickenben (chickenben) ★☆☆☆☆ -
盒子活跃会员
2023/7/13 9:31:30
23楼: 楼主这个想法有点钻尖的感觉。。。可以尝试一下这样的想法。假设如你所说的金额栏,你可以在控件中写死了,不填是不允许保存,而且默认值就是0。这样就不会有所谓的null或者允不允许的问题。
if text1.text= '' then 
begin
messagebox('不填打死不给你保存,不填也变0')
text1.text=0
end;
----------------------------------------------
-
作者:
男 tuesdays (Tuesday) ▲▲▲▲△ -
普通会员
2023/7/13 14:22:51
24楼: @cenunus 
能否null, 要从表结构语句中查看: 
CREATE TABLE `aria2` (
  `kid` int unsigned NOT NULL AUTO_INCREMENT,
  `kmd5` char(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  `title` varchar(1024) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0',
  `url` varchar(1024) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0',

判断是否有NOT NULL字眼.
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
男 cenunus (cenunus) ★☆☆☆☆ -
普通会员
2023/7/13 15:09:30
25楼: 谢谢大家,我用information_schema.COLUMNS解决了表设计器的几乎所有问题。
----------------------------------------------
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2023/7/31 19:53:34
26楼: 试试FD的TFDMetaInfoQuery,也可以找出表、字段等的信息,这样就不会局限MySQL数据库了,而且可以统一到DELPHI的数据类型。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行101.5625毫秒 RSS