ACCESS数据库表中字段为“数字型”,如果其值为NULL时如何处理?

sxyid 2002-02-28 05:51:45
大家好,我碰到一个问题:
(1) temp表结构说明:dq--文本型,a_count、b_count、c_count、d_count均是数字型
(2) temp表中的数据说明:该表是一个临时表,其中有一些记录的a_count、b_count、c_count、d_count的值为Null(没有0至9的数字)
(3) 有以下几句代码
......
Set myred = mydb.OpenRecordset("temp")
myred.MoveFirst
Do Until myred.EOF
With myred
total1 = .Fields("a_count") + .Fields("b_count") + .Fields("c_count") + .Fields("d_count")
total2 = total2 + total1
strsql = "update temp set count1=" & total1 & " where dq=" & .Fields("dq")
mydb.Execute strsql
End With
myred.MoveNext
Loop
......
<1>当a_count、b_count、c_count、d_count之一有一个值为Null时,
运行total1 = .Fields("a_count") + .Fields("b_count") + .Fields("c_count") + .Fields("d_count")就出现错误:“实时错误94,无效使用Null”
<2>当a_count、b_count、c_count、d_count全部都是一个0至9的数字时,运行正常。
这是为什么?
另外,我想,在上述代码之前加入一些代码:即将temp表中a_count、b_count、c_count、d_count之一的值为Null的字段替换为0,这样代码如何写?(vfp中replace all a_count with 0 for ......这样的代码在VB中如何写?)

...全文
162 点赞 收藏 16
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
nikychen 2002-03-02
//在VB中解决 :)
定义公共的记录集对象
public rs as ADODB.Recordset

再定义一个转换的函数
Function myConvert(Bool As Boolean, Fieldname As String) As Long
If Bool = False Then
myConvert = rs(name).Value
Else
myConvert = 0
End If
End Function

调用:
set rs=myred
Do Until myred.EOF
total1 = myConvert(isnull(myred("a_count")),"a_count") + myConvert(isnull(myred("b_count")),"b_count") + .....
回复
heyijpn 2002-03-02
'如果字段值为NULL值或空串,则设其为0
Public Function ifZero(ByVal Var As Variant) As Variant
If IsNull(Var) Or Trim(Var) = "" Then
ifZero = 0
Else
ifZero = Var
End If
End Function
回复
heyijpn 2002-03-02
'如果字段值为NULL值或空串,则设其为0
Public Function ifZero(ByVal Var As Variant) As Variant
If IsNull(Var) Or Trim(Var) = "" Then
ifZero = 0
Else
ifZero = Var
End If
End Function
回复
heyijpn 2002-03-02
定义一个函数:
'如果字段值为NULL值或空串,则设其为0
Public Function ifZero(ByVal Var As Variant) As Variant
If IsNull(Var) Or Trim(Var) = "" Then
ifZero = 0
Else
ifZero = Var
End If
End Function
回复
ferrytang 2002-03-01
注:上面写的是蹩脚伪代码,不是有注释的代码!
total1 = val(.Fields("a_count")&"") + val(.Fields("b_count")&"") + val( .Fields("c_count")&"") + val( .Fields("d_count")&"")
换成这样你调试一下看看!
记住这一点,任何字符串&""都与它本身或"",所以利用val函数会将""转换成0这一特性,我们不用判断就可以将Null转换成 0,其他数值不变!你自己在立即窗体下试验一下如下代码
?val("")
?val("dhfhg67")
?val("123fghj565")
?val("35647.00")
看看是什么结果!


回复
sxyid 2002-02-28
c_c_(cc)你好,你的建议很好,我把字段的默认值设为0程序就通过了。
但是,我想知道在VB程序中如何将数字型字段的值为Null的字段一次性批量替换成0。
回复
sxyid 2002-02-28
ferrytang(ferry),你好,你这样写很难看,我建议你,在代码的地方就用英文,注释的地方用中文,代码写得完整一些。谢谢!!
回复
jett 2002-02-28
用variant存不就是了
回复
ferrytang 2002-02-28
Null &""=""
上面的看得懂吗??
那么 val(NUll&"")=0 看得懂吗?

那么现在处理数据库中会出现的问题
对于任何形态的字段,最怕的就是Null
string型
rst("aaa")&""
如果rst("aaa")=Null
那么rst("aaa")&""=""
否则
假设rst("aaa")="abc"
那么rst("aaa")="abc"没什么影响吧

数值型

val(rst("aaa")&"")
如果rst("aaa")=Null
那么rst("aaa")&""=""
val(rst("aaa")&"")=0

如果rst("aaa")=9
那么 val(rst("aaa")&"")=9没什么影响吧

所以,在获取数据库的字段的值的时候先 &""然后作类型转换就可以避免Null了
不用写什么方法去判断修改了
回复
EverySoft 2002-02-28
我也遇到过类似的问题,我觉得最好的解决办法,我认为是在设计数据库的时候就将这些数值型的字段的默认值设为0,还有一种方法就是在执行这些语句之前写一个UPDATE语句,把所有为NULL的记录置为0,具体做法如下
dim cmd as command
set cmd=new command
cmd.activeconnection=conn
cmd.execute "update temp set a_count=0 where a_count is null"
这几个语句我并没有调试,也许有的关键字会有错误的。
上面的一些方法也是可以的,不过我不主张把数值型的数据填为NULL,因为这样在统计的时候一定会出现问题,这个我是深有体会,我曾经做过一个纵向求和,也就是列求和,这是不能采取上面的方法的,这就只能用我的这种方法了。
回复
coowoo 2002-02-28
or
iif(isnull(rs("field")),0,rs("field") )
回复
setfocus 2002-02-28
给你提个变通的主意可以判断一下
当然是if条件句
if str=null then
str=0
end if
之类,如果觉得麻烦可以写成一个过程或函数!
回复
sxyid 2002-02-28
ferrytang(ferry),写全一些,行吗?
回复
forever_chang 2002-02-28
if isnull(rs("字段名")) then
'相关处理
end if
回复
ferrytang 2002-02-28
2.有上面的办法你就不用管了!
回复
ferrytang 2002-02-28
val(.Fields("a_count") &"")
回复
发动态
发帖子

1180

社区成员

VB 数据库(包含打印,安装,报表)
申请成为版主
社区公告
暂无公告