首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

VB 实时异常'94' 无效使用null 请高手赐教

2012-01-22 
VB 实时错误94 无效使用null 请高手赐教!我做的一个通过串口来接收单片机数据的程序,然后把数据写进数据

VB 实时错误'94' 无效使用null 请高手赐教!
我做的一个通过串口来接收单片机数据的程序,然后把数据写进数据库,然后能够动态的画出曲线来,可是在我调试的时候总是出现这一行的错误,实时错误'94' 无效使用null , Picture1.Circle ((64 - kccount) * 140, (100 - rst.Fields("Voltage").Value) * 25), 30
我把完整的代码贴出来,请高手赐教!
Private Sub Command1_Click()
If MSComm1.PortOpen = False Then
MSComm1.PortOpen = True '...打开串口
End If

End Sub

Private Sub Command2_Click()
MSComm1.PortOpen = False
End Sub

Private Sub Command3_Click()

MSComm1.CommPort = Combo2.Text '...使用选择的Com口

MSComm1.PortOpen = True '...打开串口

If MSComm1.PortOpen = True Then

MsgBox "串口已经打开", , "提示"

End If
End Sub
Private Sub Form_Load()

Combo1.Text = Combo1.List(0)
Combo2.Text = Combo2.List(0)
Combo3.Text = Combo3.List(0)

MSComm1.InputMode = 0 '以文本的形式读入,如果为1,就是二进制读取

MSComm1.InputLen = 0

MSComm1.InBufferCount = 0

MSComm1.RThreshold = 1

MSComm1.Settings = "115200,n,8,1" '...设置通讯参数


End Sub

Private Sub MSComm1_OnComm()

'...通讯事件发生

Select Case MSComm1.CommEvent

Case comEvReceive '...有接受事件发生

 '...接受显示数据
 
Text1.Text = Text1.Text + MSComm1.Input & Chr(10) & Chr(13) '换行显示,紧接着下一行显示

MSComm1.InBufferCount = 0 '...清空输入寄存器

'....从接收的文本中提取数据
'用vbscript正则表达式提取字符串中的数字,工程-引用-Microsoft VBScript RegularExpressions 5.5打钩-确定
Dim str As String, num() As Single 'str用来存储待处理的字符串,num()用来存储提取的数字
str = Text1.Text '为str赋值
Set re = New RegExp '初始化re为RegExp正则匹配模式
re.Global = True '设置匹配时搜索str的整个字符串,若为false,只搜索str里符合条件的第一项
re.Pattern = "[0-9\-]+(?:\.[0-9]+)?" '定义正则表达式,这里为数字
Set mc = re.Execute(str) '返回符合正则表达式匹配对象,并存储在mc中,mc为MatchCollection对象,其count属性返回匹配对象的总数
ReDim num(1 To mc.Count) '重新定义num数组,下限为1,上限为由str提取到的数字个数即mc.count
i = 1 '初始化数组sum脚标
For Each ma In mc '循环读取mc中的每一匹配对象,并存储在ma中,ma为Match对象,其value属性返回匹配对象所匹配的值,即str里的数字。
num(i) = ma.Value '将数字存储在数组sum中
i = i + 1
Next
For i = 1 To UBound(num) '打印数组
'Print num(i)
Next

'把数据写进数据库
sql = "select * from table1"
 Set rst = run_SQL(sql)
  rst.AddNew
  rst.Fields("channel").Value = num(1) '这个数字是通道号
  rst.Fields("voltage").Value = num(2) * 0.001 '这个数据为电压值,电压单位为伏
  If num(2) = 0 Then  
  rst.Fields("resistance").Value = 0
  Else: '此公式为计算电阻值的公式
  rst.Fields("resistance").Value = (2.5 - num(2) * 0.001) * Val(Combo3.Text) / (num(2) * 0.001) '这是电阻的计算公式  
 End If
  rst.Fields("datetime").Value = Now()
  rst.Update
  Set rst = Nothing

'从数据库中把数据读出来并且画出来

List1.Clear
Picture1.Cls

If Combo1.Text = "第一通道" Then ch = 1
If Combo1.Text = "第二通道" Then ch = 2
If Combo1.Text = "第三通道" Then ch = 3
If Combo1.Text = "第四通道" Then ch = 4

sql = "select * from table1 where channel=" & ch & " order by datetime desc"
  Set rst = run_SQL(sql)
  kccount = 0
  List1.AddItem " "
  If Not rst Is Nothing Then
  Do While Not rst.EOF And kccount < 65
  List1.AddItem "通道号:" & rst.Fields("channel").Value & " 电阻:" & Left(rst.Fields("resistance").Value & "欧姆 ", 8) & " 采集时间:" & rst.Fields("datetime").Value


   
  Picture1.Circle ((64 - kccount) * 140, (100 - rst.Fields("Voltage").Value) * 25), 30
 
  If kccount > 0 Then
  Picture1.Line ((64 - (kccount - 1)) * 140, (100 - dianya) * 25)-((64 - kccount) * 140, (100 - rst.Fields("Voltage").Value) * 25), RGB(255, 0, 0)
  End If
  dianya = rst.Fields("Voltage").Value
  kccount = kccount + 1
  rst.MoveNext
  Loop
  Set rst = Nothing
  End If
End Sub 
问题补充:前面写进数据库的这一句很奇怪,rst.Fields("voltage").Value = num(2) * 0.001 '电压单位为伏
,这一句我的num(2)不是零的时候,我调试也会看到等式左边提示我为null,当右边num(2)为零的时候,左边也会提示我是null,我之前没有出现这个问题,请高手赐教!




[解决办法]
读出来的时候 rst.Fields("Voltage").Value & vbnullstring
[解决办法]
rst.Fields("Voltage").Value & ""

[解决办法]
参考此帖:
http://topic.csdn.net/u/20100227/21/bd3a0139-8570-45f1-bc8c-09bbd08c6981.html
送分100分:text1.text = rst1.fields("姓名") 时出现无效使用NULL的提示

[解决办法]

VB code
Picture1.Circle ((64 - kccount) * 140, (100 - IIf(IsNull(rst.Fields("Voltage").Value), 0, rst.Fields("Voltage").Value)) * 25), 30
[解决办法]
if not isnull(rst.Fields("Voltage").Value) then
....
end if

[解决办法]
VB code
'Picture1.Circle ((64 - kccount) * 140, (100 - rst.Fields("Voltage").Value) * 25), 30Picture1.Circle ((64 - kccount) * 140, (100 - val(rst.Fields("Voltage").Value & vbnullstring)) * 25), 30
[解决办法]
如果rst.Fields("Voltage").Value 为 null 这个表达式就会出错...
解决方法就是上面大家的方法,把rst.Fields("Voltage").Value转换为字符串:
rst.Fields("Voltage").Value & vbnullstring
在Picture1.Circle 方法中,都是数值运算,转换为字符串的结果必须的还原为数字,否则当然是类型不匹配,所以还要用一下val:
val(rst.Fields("Voltage").Value & vbnullstring)
这样null就转换为0...


[解决办法]
7楼的方法是如果为null就不执行Picture1.Circle...
你要根据程序需求决定怎么做....
[解决办法]
0是一个数值
null可以简单的理解为什么都没有...
[解决办法]
只有variant类型才可以赋值null,其它类型赋值null都出错是....
[解决办法]
你可以检查一下数据库的数据....

热点排行