Vfp com+ASP.Net(c#)结合开发示例

andylauxing 2009-03-24 02:53:48
如题,哪位狐友有VFP com +ASP.Net(C#)开发的示例.
个人认为VFP在数据库处理方面是比较优秀的,如果两能结合起来就比较完美了.

重点关注:
1.vfp Com生成的XML文件如何被 ASP.Net(C#)引用,并正确显示出来
2.COM中生成的结果集(cursor),如何被ASP.Net(C#)引用显示在GridView控件上.

TKS.
...全文
420 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
aabiao 2009-09-24
  • 打赏
  • 举报
回复
xml的标准就是没标准,任何配对的标签都可以算是标准的XML,所以VFP生成的XML没什么不对的。
andylauxing 2009-09-23
  • 打赏
  • 举报
回复
过了这么久,此贴还有人跟,那本人再补充一下:
的确,VFP生成的Xml可以被Asp.net识别,本人已成功测试过了,但vfp中的XmlToCursor()转换效率实在是太低,故这个方案还是放弃了.
LUJUN 2009-09-23
  • 打赏
  • 举报
回复
VFP生成的XML 是标准的XML,ado.net可直接读取使用。
mdsorphen 2009-09-22
  • 打赏
  • 举报
回复
Mark 学习了。
xplong 2009-05-12
  • 打赏
  • 举报
回复
*本人第一次用com是参照这个代码学习的,由于非常赞同楼主的观点,所以多说了几句。
*本没没用过asp.net,不过给你的例子应该够用了。
*ox=CREATEOBJECT("myTest.FoxService")
*xml= ox.comExecute('select * from custom') &&此处 已获得 xml (此xml的格式 由生成它的CURSORTOXML()参数决定)
**********************************************************************
*Creating a Simple Visual FoxPro COM Server
*You create a PRG file, which will be called MYCLASS.PRG, with the following code:

*This entirely self-contained program will build a COM server
* called "myserver.myclass"
* It will unregister a prior instance, if any
IF PROGRAM() != "MYCLASS"
?"this file MUST BE NAMED 'myclass.prg'"
return
ENDIF
IF FILE("myclass.dll")
DECLARE integer DllUnregisterServer IN myclass.dll
DllUnregisterServer()
CLEAR DLLS
ENDIF
BUILD PROJECT myserver FROM myclass
BUILD DLL myserver from myserver recomp
*now test this COM server:
ox = CreateObject("myserver.myclass") && create the server object
ox.mydocmd("USE home(1)+'samples\data\customer'") && use a table
?ox.myeval("RECCOUNT()") && get the record count

DEFINE CLASS myclass AS session OLEPUBLIC
PROCEDURE MyDoCmd(cCmd as String) as Variant ;
helpstring "Execute a VFP cmd"
&cCmd && just execute parm as if it were a fox command
FUNCTION MyEval(cExpr as String) ;
helpstring "Evaluate a VFP expression"
RETURN &cExpr && evaluate parm as if it were a fox expr
FUNCTION Error(nError, cMethod, nLine)
COMreturnerror(cMethod+' err#='+str(nError,5)+;
' line='+str(nline,6)+' '+message(),_VFP.ServerName)
&& this line is never executed
ENDDEFINE
xplong 2009-05-12
  • 打赏
  • 举报
回复
这是一个典型的 xml 用法。
foxpro 的 xml 并不像1楼所说的,不标准,而是CURSORTOXML()函数有太多的参数,相信microsoft不会再搞出一个新的xml,况且microsoft也认为vfp 是最有效的database处理环境,不然它不会让它支持.net的。
xplong 2009-05-12
  • 打赏
  • 举报
回复
** 第一步 制作 COM (.dll)

DEFINE CLASS FoxService AS FoxBaseClass OLEPUBLIC

FUNCTION comExecute(cmdStr AS STRING ) &&,retType as String)
LOCAL earr[1]
LOCAL cXML
IF SQLEXEC(THIS.lnConnHandle, m.cmdStr,[rusltCursot])>0
CURSORTOXML("rusltCursot","cXML",3,32,0,"1") && CURSORTOXML() 有很多的参数,根据你的需要选用
USE IN rusltCursot
RETURN cXML
ELSE
AERROR(earr)
CREATE CURSOR errTB (err_no i,err_mess c(200))
INSERT INTO errTB (err_no,err_mess) VALUES (earr[1],earr[2])
CURSORTOXML("errTB","cXML",3,32,0,"1")
USE IN errTB
RETURN cXML
ENDIF

ENDFUNC


ENDDEFINE
#define CL CHR(13)+CHR(10)
DEFINE CLASS FoxBaseClass AS SESSION
sysvarDir=''
* connstring=[DRIVER=SQL Server;SERVER=server;uid=userId;pwd=password;Trusted_Connection=Yes;database=databaseName]
connstring=''
DATASESSION=2
lnConnHandle = 0

PROCEDURE INIT()
SET DATE ANSI
SET CENTURY on
SET HOURS TO 24
SET SAFETY OFF

LOCAL cText AS STRING, tmpStr as string

tmpStr = SYS(16)
this.sysvarDir=SUBSTR(tmpStr,AT('\',tmpStr)-2,RAT('\',tmpStr)-AT('\',tmpStr)+2)
SET PATH TO (this.sysvarDir) && 重要

this.connstring=[DRIVER=SQL Server;SERVER=server;uid=userId;pwd=password;Trusted_Connection=Yes;database=databaseName]

this.lnConnHandle = SQLSTRINGCONNECT(this.connstring)


cText="开启时间"+TRANSFORM(DATETIME())+CL
STRTOFILE(cText,this.sysvarDir+'\FoxService.txt',.T.)

IF this.lnConnHandle <1
m.cText = 'connect failure'+CHR(13)+CHR(10)
strtofile(cText,this.sysvarDir+'\FoxService.txt',.t.)
ELSE
m.cText = 'connect succeed'+CHR(13)+CHR(10)
strtofile(cText,this.sysvarDir+'\FoxService.txt',.t.)
ENDIF

ENDPROC

PROCEDURE DESTROY
SQLDISCONNECT(this.lnConnHandle)
LOCAL cText AS STRING
cText="关闭时间"+TRANSFORM(DATETIME())+CL+CL
STRTOFILE(cText,this.sysvarDir+'\FoxService.txt',.T.)
ENDPROC

PROCEDURE ERROR(nError AS INTEGER,cMethod AS STRING, nLine AS INTEGER)
LOCAL cText AS STRING
cText=;
'出错时间:'+TRANSFORM(DATETIME())+CL+;
'错误代码:'+STR(nError,4)+CL+;
'错误提示:'+MESSAGE()+CL+;
'错误方法:'+cMethod+CL+;
'错误行号:'+TRANSFORM(nLine)+CL+CL
STRTOFILE(cText,this.sysvarDir+'\FoxService.txt',.T.)
COMRETURNERROR("Fox Web Service",cText)
ENDPROC

ENDDEFINE
** 建立.dll
** 建立一个 MyTest 的 project
** 编译成 myTest.dll

**调用 com
IF used('test')
USE IN test
ENDIF
ox=CREATEOBJECT("myTest.FoxService")

xml= ox.comExecute('select * from custom') &&此处 已获得 xml

XMLTOCURSOR(xml,"test")


rele ox
SELECT test
BROWSE
USE
andylauxing 2009-03-26
  • 打赏
  • 举报
回复
谢谢十豆三大侠回贴,不过你误解我的本意.
我只是想用VFP写com作三层架构方面的应用,其实MS当初的定位是把VFP当作开发COM组件的利器的,可惜国内论坛在这方面讲得很少,想必这方面的现实应用就更少了.

1.本人认为用COM组件是很有好处的,业务逻辑写在COM组件中,客户端只负责调用组件的相应功能对象及界面布局,这更符合OOP思想.
2.虽然,ASP.net+SQL server 可以B/S, 但此方式对服务器资源消耗严重,也非常依赖后台SQL server存储过程.
而ASP.net+VFP com+SQL Server 三层架构可以充分发挥VFP在数据处理方面的优势(cursor)以及资源整合(分布式),以提高系统的整体性能.(老外这方面做得比较好,他们更强调的是各语言之间的整合,发挥各自所长.)

VFP生成的XML不是标准的XML,但加工一下是可以被其他语言识别的,希望国内这方面的应用多起来.
十豆三 2009-03-24
  • 打赏
  • 举报
回复
VFP生成的XML不是标准的XML,只有VFP能识别,不能很容易被其他语言识别。

所以还是改用VFP+SQL Server,C#再+SQL Server

2,727

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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