从vb6.0访问visualfoxprocom服务器

从vb6.0访问visualfoxprocom服务器,com,visual-foxpro,Com,Visual Foxpro,该问题与使用Visual basic 6.0(SP 6)中的VFP COM服务器有关 代码(相关) 在小组中: Dim oRec As f_vfpsvr.VFPRecord Set oRec = moVFPServer.NewRecord("LoanMstr") With oRec .SetField "ssn", sSSN .SetField "awdyr", sAwardYear .SetField "tran_date", Format(Now

该问题与使用Visual basic 6.0(SP 6)中的VFP COM服务器有关

代码(相关)

在小组中:

Dim oRec As f_vfpsvr.VFPRecord 
Set oRec = moVFPServer.NewRecord("LoanMstr")    
With oRec    
  .SetField "ssn", sSSN    
  .SetField "awdyr", sAwardYear    
  .SetField "tran_date", Format(Now, "mm/dd/yyyy")    
  .Commit    
End With
来自moVFPServer的方法“NewRecord”返回一个对象,该对象表示VFP表“LoanMstr”中的一个新的空记录

下面的代码填充属性/字段并保存数据

如果VFP COM服务器是使用VFP 8.0构建的,而在使用VFP 9.0构建时不工作,那么所有这些都可以工作

具体来说,VB应用程序错误出现在代码行:

Set oRec = moVFPServer.NewRecord("StdMstr")
COM服务器引发异常:自动化错误-2147417851


这是在同一台机器上发生的。

VFP构建的COM对象有时会表现得有点奇怪,特别是当涉及到将错误滴入堆栈时

但这似乎非常奇怪,因为只有在VFP9中构建时才会显示。我相信在8点到9点之间,数据库的内容发生了一些突破性的变化,有些可能是你击中了其中一个

在VFP代码中是否有错误函数?如果没有,请尝试在其中设置一些错误属性,并在收到错误时在VB中查询它们

例如,我们有

FUNCTION ERROR(nError, cMethod, nLine)
    THIS.cErrDesc = "Error Number: " + TRANSFORM(nError) + CRLF + "Message: " + MESSAGE() + CRLF  + "Method: " + cMethod + CRLF  + "Line #: " + TRANSFORM(nLine)

    COMRETURNERROR(cMethod, THIS.cErrDesc)

ENDFUNC

当从VFP 9调用COM对象时,COM对象是否工作?-2147417851=0x80010105=“服务器引发了异常”。你的foxpro代码崩溃了。Tamar,我检查过了,它在VFP8或VFP9的VFP开发环境中不工作。Hans,确切地说,它崩溃了。关键是,代码是由COM服务器中的方法执行的,当对象返回到调用VB程序时,代码正好崩溃。顺便说一句,VFPServer中的方法NewRecord调用另一个方法,该方法反过来基于位于同一DLL中的类VFPRecord实例化对象。如果有人想知道NewRecord方法到底是如何工作的,我将通过电子邮件发送包含类的程序。它很短,很清晰。我将尝试实现错误函数。我使用日志跟踪程序(COM服务器)中发生崩溃的一个点。实际上,COM服务器方法中的所有代码行都正确执行,直到对象返回调用程序时的点。@保罗,在不知道结果记录结构的情况下,我会考虑查看正在返回的数据类型。您是否有任何常规、备注、货币或其他列可能是VFP8和VFP9中的问题,如果有,请尝试一次删除一种类型,或全部删除,然后逐渐向返回集添加列。最简单的测试,尝试只返回单个列的对象作为char或int。如果崩溃,那么其他列是什么都不重要。谢谢DRapp的想法。实际上,所有字段都是字符串或日期类型。
FUNCTION ERROR(nError, cMethod, nLine)
    THIS.cErrDesc = "Error Number: " + TRANSFORM(nError) + CRLF + "Message: " + MESSAGE() + CRLF  + "Method: " + cMethod + CRLF  + "Line #: " + TRANSFORM(nLine)

    COMRETURNERROR(cMethod, THIS.cErrDesc)

ENDFUNC