调试运行与编译运行有什么区别?

zymfy 2003-09-10 06:24:29
我现在遇到了二个难题,都是调试运行与编译运行不同造成的.

第一个是
出库单记帐时,有时出错,有时不出错。比如说01出库单,对它进行记帐时,有时出错,有时不出错,提示BOF。EOF 。我调试的时候根本就调不出来。我都调了好几天了。

第二个问题是
我写了一个VB在线升级程序。调试的时候不出错。编译运行的时候就出错。
更奇怪的是,我在LOAD事件中加了一个MSGBOX,编译后运行时,有时这个MSGBOX不出来提示。你说怪不怪?

这是我第一次遇到这么难的问题。
为什么调试的时候就不出错
...全文
603 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ranma_True 2003-09-13
  • 打赏
  • 举报
回复
编译运行会检查所有的语法错误
zymfy 2003-09-13
  • 打赏
  • 举报
回复
第一个问题,由于本窗体上我用到了TDBGRID。我在TDBGRID的行和列改变的时候也写了代码并且没有判断是不是EOF 或BOF 。所以我运行以上代码时出错。
虽然找出错误来了但我不明白。为什么在调试运行的时候就不出错,而编译运行后就出错呢?

zhouqi66 2003-09-12
  • 打赏
  • 举报
回复
第一个问题应该是在记录集移动造成的,找rs.movenext 之类的语句好好检查。
第二个问题应该是你已经加载了这个窗体了,找一下你在这个窗体的show方法前是否有引用过这个窗体的任何控件的代码。
fraser01 2003-09-12
  • 打赏
  • 举报
回复
第一个问题的发生可能是数据类型,或者范围错。但是编译的时候确实不能发现这种错误的。
最好的方法是在程序里写
ON ERROR RESUME NEXT
然后在你认为可能错误的地方判断
IF ERR,
如果出现错误,就将该错误的描述用MSG显示出来看。否则很难发现的

第二个我也不知道,你可以把MSGBOX设一个简单的显示,如MSGBOX "aaa"什么的。看看情况。
估计是程序跳转的时候有问题,你不应该查本窗体,而是应该查父窗体的调用情况。最好是全程序搜索你的窗体名。
WQ771211 2003-09-12
  • 打赏
  • 举报
回复
调试的时候,有的函数是没有被运行的,VB只检查运行到的语句(即runtime error)
编译执行时,VB要检查所有语句(包括从来不会被调用的“死”函数)

如果对某个window进行了hook,一定要编译执行,否则,一个小小的错误都会使VB垮掉
lihonggen0 2003-09-12
  • 打赏
  • 举报
回复
1.
Rs.Open "select * from employees", CN, adOpenDynamic, adLockOptimistic

加上这个判断:
If Not (Rs.BOF Or Rs.EOF) Then
........
End If

2、你按ctrl+F5 全编辑执行看看
Cooly 2003-09-12
  • 打赏
  • 举报
回复
1.BOF是结果集的头,EOF是结果集的尾,在对数据库进行操作的时候注意对BOF,EOF的判断

2.在Msgbox前面加上Me.Show试试看
wishare 2003-09-12
  • 打赏
  • 举报
回复
调试运行是伪码,编译运行是机器码。
不知道是不是这样的,都有点忘了,伪码解释执行,所以速度慢。
tanyx 2003-09-12
  • 打赏
  • 举报
回复
确切地说,在FORM_LOAD过程中,不允许MSGBOX。
EOF,BOF是你自己程序造成的。
其他事件会有影响,比如有时钟,有通讯,外部事件如果处理不好可能会互相影响。
Fearfulness 2003-09-12
  • 打赏
  • 举报
回复
对了,既然调试运行和编译运行不同造成,加个DoEvents试试啊!(瞎猜的).是不是程序反应比较迟钝造成的啊?
minajo21 2003-09-12
  • 打赏
  • 举报
回复
1.BOF。EOF是不是表为空的时候做了类似.movenext的操作
2.最好具体看看代码
Fearfulness 2003-09-12
  • 打赏
  • 举报
回复
可能有些关系你搞混了吧,建议你将所有的代码按功能都写成过程(函数),每个过程(函数)的条件都是独立的,不要有交叉,然后,再看哪里出错.
提示BOF.EOF应该是查询时没有将记录查出来吧.一种应该是查询语句出错了(有时候对,可能是碰巧错过了漏洞).一种可能是数据库里面的设计有问题吧.
代码贴出来看看.

planetike 2003-09-12
  • 打赏
  • 举报
回复
说是一种什么技术,忘了,还说VB以前的成功之处就在此,好像记得VB在调试时运行与编译后运行本质是不同的,我去找找,找到了再帖上来.
Kivic 2003-09-12
  • 打赏
  • 举报
回复
没遇到过,水平有限,帮你up
zymfy 2003-09-12
  • 打赏
  • 举报
回复
老天,我把所有代码全避了去。
只要
do until adodc1.recordset.eof
adodc1.recordset.movenext
loop

也出错。
zymfy 2003-09-12
  • 打赏
  • 举报
回复
现贴出代码
qd = MsgBox("请确认是否记帐", vbYesNo + 48 + vbDefaultButton2, "提示")
If qd = 7 Then Exit Sub
'------------------
'===========================
dbsje = 0 '--求实际金额
dbjhe = 0 '--计划额
'--------------------------
conn.Execute ("update ckd_mx set sjje=round(sjdj*sfsl,2),jhje=round(jhdj*sfsl,2) where lldh='" & Trim(Label4.Caption) & "'")
Adodc1.Recordset.MoveFirst
'--------------------------
Do Until Adodc1.Recordset.EOF
'-------先判断单价是否为0---------
If Adodc1.Recordset.Fields("sfsl") <> 0 Then
If Adodc1.Recordset.Fields("sjdj") = 0 Then
MsgBox "『" & Adodc1.Recordset.Fields("clmc") & "』" + "无单价", 48, "提示"
TDBGrid1.Col = 4
TDBGrid1.SetFocus
Exit Sub
End If
End If
'---------------当为假退库时,判断实发数量小于等于0
If frmfhcl.strjzlb = "假退库记帐" Then
If Adodc1.Recordset.Fields("sfsl") > 0 Then
MsgBox ("假退库时数量为负数"), 48, "提示"
TDBGrid1.Col = 6
TDBGrid1.SetFocus
Exit Sub
End If
End If
dbjhe = CDbl(dbjhe + Adodc1.Recordset.Fields("jhje"))
dbsje = CDbl(dbsje + Adodc1.Recordset.Fields("sjje"))
Adodc1.Recordset.MoveNext‘-------------此处出现错误
Loop
我每一句话前都加了一个MSGBOX试了一下发现Adodc1.Recordset.MoveNext时出错.

7,789

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧