回 帖 发 新 帖 刷新版面

主题:[求助]为什么换一台机就报错?

[size=4][size=3]  一个程序, 在几台机上运行,都能正常地执行,但就是有那么几台机,总是报错误码为52(当前工作区没有表打开)的错误,这是为什么?

  PS:每次报错的行数都不一样,也就是说这一次是这个工作区没有数据表打开,而下一次可能就是另一个工作区没有数据表打开。
  [/size][/size]

回复列表 (共8个回复)

沙发

也许是使用了数据环境,
也许是共享冲突,
又也许是无意中关闭了表.
也许是使用了千篇一律的错误处理.

但,为什么不在使用表的前面加一句表是否已打开的检测呢?
要使用哪个表,是不是应该先指定工作区?
这是检测不到错误时,最好的解决办法.

板凳

谢谢MOZ的回复!
  关于第一点---数据环境在整个程序的运行当中都不曾使用,全部是在代码中需要时才打开。
  关于第二点---整个数据架构确实是以共享的形式打开的,但都只是共享打开,如果网络其它用户独占打开,有专门的除错程序处理,在程序中会自行中断执行(只有在删除时和系统员维护时有独占打开,且拥有删除权限的人就几个,系统维护周期很长)
  关于第三点---这个就是最大的嫌疑,因为在表单的ACTIVATE中及一些自动执行的计时钟上都有关闭表的代码。但我也查了也改了这些可能导致意外关闭表的代码。但是还是出问题。最要命的是在一个事件的代码中,明明上一行有打开表的代码,下一行就报52的错,而且每次报错的行数都不一样。目前出现这种情况的就只有一台机。
  关于第四点---错误处理程序都是在ERROR事件中执行,但只是在程序中的某一个特定的地方会返回(因为程序的设计就知道环境的变化会导致出错,但不会出错的地方就没有加变量返回),象现在的这个错误都是打开的本地自由表,所以从理论上讲,根本就不会有错误发生的。而且在那么多的电脑中,也确实没有报错。

  我对每一个表都有分配固定的工作区,如果程序发生物理性的错误,应该返回的错误行是固定的,但现在不是,所以非常头大。

  还有一个情况要说一下,就是,我的程序是在繁体中文开发在简体中文中使用(出错的这台在繁体中文中使用),但这台电脑在起初安装运用程序时没有留意,所以也安装了WINDOWS的APPLOCALE。我不知道是不是这个会影响程序的执行,因为发生过移除运用程序后再重新安装时,竟然不能成功执行,只有再把APPLOCALE移除时,才可以顺利执行运用程序。同时,这台电脑中装了一大堆的开发软件,象C++,VC等,不知是不是也会影响?

  PS:我在繁体系统上开发的,在繁体上运行,为什么运回的错误信息反而是“火星文”?

  希望你能再给我予帮助!

  谢谢!

3 楼

1.我没有用过繁体系统,不曾接触过其中的问题,也不知道APPLOCALE.
2.我给客户机安装的时候,都是以"绿色"办法,建一个程序目录,把应用程序,运行时库文件放进去,必要的本地数据文件,然后桌面建快捷方式.(检查主机数据库目录是否有新版本程序来更新)
3.我的出错处理:
[quote]ON ERROR STRTOFILE(TTOC(DATETIME())+"  /  "+SYS(16)+"  /  "+STR(ERROR())+"  /  "+MESSAGE()+"  /  "+MESSAGE(1)+CHR(13)+CHR(10),I_Path+"出错记录.TXT",1)[/quote]
把出错的信息保存到主机目录去,然后直接忽略错误,以免显示到用户界面,因为对于他们来说,出错信息毫无用处.

我一般会定时去检查出错信息,至于你说的,唯独是某一台机器的出错,我倒是没有遇到过.
不过我曾经为追错而疲于奔命,有几个情形不知道对你有没有帮助.
对临时表排序,重查询(VFP6好像有次数限制),或是绑定控件数据源的时候,有时候会被某个不清楚的原因被关闭,或被忽略.
当一个表在前面出错后,在后面的语句里出错,出错的位置和出错的信息都是不定的,这要追寻到前面的错误去.
还有一些本以为不会出错的情形:
语句太长,宏代换不够精确,某些符号不配对

4.对于某一台机子的问题,
   A.是不是这个功能只有这台机子在用,其他机子用这个功能的时候有没有出错?
   B.检查这台机子的系统盘,容量,临时文件夹路径及权限,是否启用还原.
   C.这台机子有没有杀毒软件,(在这里,请原谅我无限次严重的对国产杀软的鄙夷)
   D.上面说过,把程序和运行库单独目录,以与系统不同版本的库独立开来

5.火星文问题,如果你习惯了看中文原码,其实也是有迹可寻的,如果是编码问题,有可能会有很多空白分隔,有可能是大部份的方块.
  如果也是中文,但词不达意,或符号奇怪用字混乱,多半是因为丢失了半个字而引起的.

6.52号错误是当前工作区中没有打开的表,应该暗中检查当前还有没有其他表,有没有可能没有选中工作区?是不是前面所有表都被关闭了?即使意外断网,也不应该出现这种情况.我在使用过程中一般不管工作区,只对表名进行使用.

4 楼

再次感谢你大篇幅的回复!

  关于防毒软件我也有想到,但在出错时,我调出所有的windows运行程序,都没有防毒软件在运行.相反,我在有防毒软件的机子上用,认为我的一个类库myfll.fll有问题时,程序都不会出错.

  关于applocale只是windows为多语言提供的一个临时处理方案,就是因为我的程序是在繁体中文中开发,但使用又可能是简体中文也有可能是繁体中文,所以,当程序在简体中文的系统中使用时,就必须借助这个方案来进行临时转换,否则所有界面的中文部分都会是"火星文".(当然也可以在控制台上改语言环境来实现,但会需要重新开机).

  之前有计时钟在客户端的一个固定界面上在定期运行,我以为会是这个原因会关闭表,但我把这部分加上变量来控制经过追踪,这个顾虑已经消除.

  然后我设置断点,用messagebox来返回断点结果,但就在我用正确返回messagebox的一下行用clos table,然后retu,竟然又弹出52的错误,所以,我程序应该是没有问题,应该是机器的设置或相关的软件影响.可是我没有这方面的数据和资料.(这台机上装太多乱七八糟的东西,但是又不能移掉这些客户的东西,就算是他不用的,也不方便移除,所以也不能验证猜想)

  这个问题严重影响了事情的进度,也真的不知道要如何排除,曾经为这个都把程序架构给改了,但还是不能解决.如果可能,我可以把我的源代码发给您,你看是什么问题.

  qq:108088690

  谢谢!

  


5 楼

1、诚如moz所言,在对表操作时,根本就不必指明具体的工作区号。比如打开一个表:
select 0
use atable 
或者
use atable in 0
 
以后切换工作区时,
select atable
 就可以了。

2、注意你打开表时和你操作表时是否是同一数据工作期,检查一下表单的DataSession属性设置。

6 楼

呵呵,不错

7 楼

呵呵,不错

8 楼

[quote]1、诚如moz所言,在对表操作时,根本就不必指明具体的工作区号。比如打开一个表:
select 0
use atable 
或者
use atable in 0
 
以后切换工作区时,
select atable
 就可以了。

2、注意你打开表时和你操作表时是否是同一数据工作期,检查一下表单的DataSession属性设置。[/quote]


  謝謝你的回復!

  SELE 0
  USE ATABLE
  和 USE ATABLE IN 0  
 以上雖然都可以起到在0工作區時打開ATABLE表的作用,但是且沒有選擇當前工作區的作用,因為有同名表(遠程和本地),所以用表的別名引用還是比較麻煩,所以才用工作區引用.

  我都不用數據環境,全是在事件中打開,關閉和引用的.

  直到現在,問題也沒有找出來,可能還是系統平台的原因,因為有時報錯,有時又不報錯,但報錯的機器只有那一臺.我的開發平臺是繁體版的WIN XP PACK2,出錯的也是繁體中文版,但是WIN XP PACK3.

  PS:他的機器很怪,放在桌面上的捷徑竟然都沒有"箭頭"標識,就象放在桌面的文件一樣.

我来回复

您尚未登录,请登录后再回复。点此登录或注册