query1:field 'qty' is of an unknown type.
表结构如下:
database : access
Table name: goodsdetails
Field Name Data Type
ID AutoNumber (Primary Key)
goods text (L:20)
qty number(double)
unit text (L:10)
程序代码如下:
query1.close;
query1.sql.clear;
query1.sql.add('insert into goodsdetails (goods,qty,Unit) values (:goods,:qty,:unit);
query1.ParamByName('goods').AsString := 'BOOK';
query1.ParamByName('qty').Asfloat := NULL; (注意这段代码!!)
query1.ParamByName('UNIT').AsString := ''; 注意这段代码!!,用了两种不同的方式表示空值)
query1.ExecSQL;
分析:DELPHI不能识别空值类型,但是数据库可接受空值,怎样才能脱离DELPHI的限制,使空值正常的保存在数据库中。请各位帮助怎样解决,谢谢!
12 个解决方案
#1
如果数据库中字段允许为 null,在插入时不要给它值就是null了.
像你要qty为null,insert时只插入(goods,Unit)就行了.
像你要qty为null,insert时只插入(goods,Unit)就行了.
#2
insert into goodsdetails (goods,Unit) values (:goods,:unit);
插入后qty就是null
插入后qty就是null
#3
你的方法不错,但是如果我的字段很长(20个以上),又是以批模式添加记录,每一行都会有空值,并且空值的字段每一次都不相同,这样的话,我需要为每一个空值去写一段代码,可想而知,程序会变得非常复杂。
#4
楼上的,感谢你们的答复
因为我需要一次添加几十上百行。需且字段有20多个,上面只是我简单代了的一个例子。根据你们的提示,程序可能会很复杂,请看下面的代码:
IF GOODS=''then
begin
insert into goodsdetails (qty,Unit) values (:qty,:unit);
end;
if qty='' then
begin
insert into goodsdetails (goods,Unit) values (:goods,:unit);
end;
.
.
.
因为我需要一次添加几十上百行。需且字段有20多个,上面只是我简单代了的一个例子。根据你们的提示,程序可能会很复杂,请看下面的代码:
IF GOODS=''then
begin
insert into goodsdetails (qty,Unit) values (:qty,:unit);
end;
if qty='' then
begin
insert into goodsdetails (goods,Unit) values (:goods,:unit);
end;
.
.
.
#5
为什么不生成insert 语句呢?
#6
如果数据库中字段允许为 null,
在插入时不要给它值自动就是null了啊.
所以这里你只需要插入(goods,Unit)就行了.
在插入时不要给它值自动就是null了啊.
所以这里你只需要插入(goods,Unit)就行了.
#7
如果数据库中字段允许为 null,
在插入时不要给它值自动就是null了啊.
所以这里你只需要插入(goods,Unit)就行了.
在插入时不要给它值自动就是null了啊.
所以这里你只需要插入(goods,Unit)就行了.
#8
总之一句话:数据库中的字段可以为空时,你在前台只不要给这个字段赋值就可以了,也就是设成空!
#9
insert into goodsdetails (qty,goods,Unit) values (:qty,:goodes,:unit);
parambyname('goods').value:=s1;(s1为空就空)
parambyname('goods').value:=s1;(s1为空就空)
#10
只要表设计好了,不用给这字段值,不就是空了
#11
query1.ParamByName('goods').AsString:= 'BOOK';
query1.ParamByName('qty').AsString:= 'NULL';
query1.ParamByName('UNIT').AsString:= 'NULL';
这样肯定行的,我就是这么用的。
query1.ParamByName('qty').AsString:= 'NULL';
query1.ParamByName('UNIT').AsString:= 'NULL';
这样肯定行的,我就是这么用的。
#12
楼主试试下面看看...
query1.ParamByName('qty').value:=nil;
or
query1.ParamByName('qty').value:=null;
query1.ParamByName('qty').value:=nil;
or
query1.ParamByName('qty').value:=null;
#1
如果数据库中字段允许为 null,在插入时不要给它值就是null了.
像你要qty为null,insert时只插入(goods,Unit)就行了.
像你要qty为null,insert时只插入(goods,Unit)就行了.
#2
insert into goodsdetails (goods,Unit) values (:goods,:unit);
插入后qty就是null
插入后qty就是null
#3
你的方法不错,但是如果我的字段很长(20个以上),又是以批模式添加记录,每一行都会有空值,并且空值的字段每一次都不相同,这样的话,我需要为每一个空值去写一段代码,可想而知,程序会变得非常复杂。
#4
楼上的,感谢你们的答复
因为我需要一次添加几十上百行。需且字段有20多个,上面只是我简单代了的一个例子。根据你们的提示,程序可能会很复杂,请看下面的代码:
IF GOODS=''then
begin
insert into goodsdetails (qty,Unit) values (:qty,:unit);
end;
if qty='' then
begin
insert into goodsdetails (goods,Unit) values (:goods,:unit);
end;
.
.
.
因为我需要一次添加几十上百行。需且字段有20多个,上面只是我简单代了的一个例子。根据你们的提示,程序可能会很复杂,请看下面的代码:
IF GOODS=''then
begin
insert into goodsdetails (qty,Unit) values (:qty,:unit);
end;
if qty='' then
begin
insert into goodsdetails (goods,Unit) values (:goods,:unit);
end;
.
.
.
#5
为什么不生成insert 语句呢?
#6
如果数据库中字段允许为 null,
在插入时不要给它值自动就是null了啊.
所以这里你只需要插入(goods,Unit)就行了.
在插入时不要给它值自动就是null了啊.
所以这里你只需要插入(goods,Unit)就行了.
#7
如果数据库中字段允许为 null,
在插入时不要给它值自动就是null了啊.
所以这里你只需要插入(goods,Unit)就行了.
在插入时不要给它值自动就是null了啊.
所以这里你只需要插入(goods,Unit)就行了.
#8
总之一句话:数据库中的字段可以为空时,你在前台只不要给这个字段赋值就可以了,也就是设成空!
#9
insert into goodsdetails (qty,goods,Unit) values (:qty,:goodes,:unit);
parambyname('goods').value:=s1;(s1为空就空)
parambyname('goods').value:=s1;(s1为空就空)
#10
只要表设计好了,不用给这字段值,不就是空了
#11
query1.ParamByName('goods').AsString:= 'BOOK';
query1.ParamByName('qty').AsString:= 'NULL';
query1.ParamByName('UNIT').AsString:= 'NULL';
这样肯定行的,我就是这么用的。
query1.ParamByName('qty').AsString:= 'NULL';
query1.ParamByName('UNIT').AsString:= 'NULL';
这样肯定行的,我就是这么用的。
#12
楼主试试下面看看...
query1.ParamByName('qty').value:=nil;
or
query1.ParamByName('qty').value:=null;
query1.ParamByName('qty').value:=nil;
or
query1.ParamByName('qty').value:=null;