注册 登录
编程论坛 VFP论坛

建立中间层服务器

cjtang 发布于 2025-04-15 13:42, 882 次点击
请教各位大佬,不知道能不能实现(VFP)
环境:局域网中有一台数据库(SQL SERVER)服务器,一台中间层服务器(架设了IIS)
需求:外网通过VFP客户端访问数据库服务器时,通过中间层获取数据
类似于在中间层服务器运行一个服务程序,然后外网的VFP客户端的所有数据请求都通过这个服务程序来得到
这个服务程序各位大佬有没有解决办法,或者有没有好的思路(主要是不允许路由器映射数据库服务器)
17 回复
#2
kangss2025-04-15 13:48
以下是引用cjtang在2025-4-15 13:42:19的发言:

请教各位大佬,不知道能不能实现(VFP)
环境:局域网中有一台数据库(SQL SERVER)服务器,一台中间层服务器(架设了IIS)
需求:外网通过VFP客户端访问数据库服务器时,通过中间层获取数据
类似于在中间层服务器运行一个服务程序,然后外网的VFP客户端的所有数据请求都通过这个服务程序来得到
这个服务程序各位大佬有没有解决办法,或者有没有好的思路(主要是不允许路由器映射数据库服务器)

用王子的fll可以:https://bbs.bc-cn.net/thread-509467-1-1.html
王子的fll有2个版本:多进程、多线程
帖子32楼有“FLL、test.prg源码、测试说明”,你可以看看
#3
kangss2025-04-15 13:53
客户端 ≒ 中间层 ≒ SQL SERVER
使用 FLL 制作的 web server,无需配置、开启 windows 的 IIS
该 FLL 就是中间层,相当于你说的“IIS + 服务程序”

多进程版:服务程序是VFP编译的exe
多线程版:服务程序是VFP编译的dll
#4
sam_jiang2025-04-15 19:31
可以用foxweb+iis+mysql
#5
my23182025-04-16 07:06
可以使用winsock控件实现客户端与中间层的通讯,客户端发送指令到中间层,中间层访问服务器然后返回数据给客户端,但这种方法每次传送数据大小不能超过64k大小,客户端和中间层都运行vfp程序,示例可在下载频道搜电子文档管理系统v3.0使用手册,里面有通过中间层进行数据传递的介绍

[此贴子已经被作者于2025-4-16 07:29编辑过]

#6
iswith2025-04-16 18:44
WebService
以下是引用cjtang在2025-4-15 13:42:19的发言:

请教各位大佬,不知道能不能实现(VFP)
环境:局域网中有一台数据库(SQL SERVER)服务器,一台中间层服务器(架设了IIS)
需求:外网通过VFP客户端访问数据库服务器时,通过中间层获取数据
类似于在中间层服务器运行一个服务程序,然后外网的VFP客户端的所有数据请求都通过这个服务程序来得到
这个服务程序各位大佬有没有解决办法,或者有没有好的思路(主要是不允许路由器映射数据库服务器)



将VFP包装成为WebService发布在IIS,其它VFP客户端调用IIS的WebService执行如:
Spt(,[Select * From ....])

Webs.Spt( [Select * From ....] ) , 'cursor' )

Sql语句继承原来的,成本最小的方法。
#7
csyx2025-04-16 20:10
以下是引用iswith在2025-4-16 18:44:12的发言:
将VFP包装成为WebService发布在IIS,其它VFP客户端调用IIS的WebService
Sql语句继承原来的,成本最小的方法。

Web Service 确实是 vfp 提供中间层服务的官方推荐方法
但是使用 vfp 发布 Web Service 会有少许坑,好在提供了源代码,有一定水平的可以修复好
#8
iswith2025-04-16 22:39
稍微学习一下C#包装一个Web Service 给VFP使用,这很容易的!c#是现代语言,VFP是过去时,但VFP在很多方面很出色,特别在数据库这块还是王牌
#9
easyppt2025-04-17 08:54
C#我也不是很懂 ,它与数据库互动主要是 吧:
SqlConnection
SqlCommand
SqlDataReader
DataSet
SqlDataAdapter

VFP的方便之处在于本地化可以通过sql语句方便快捷的创建临时cursor,C#不知道能不能生成本地化的临时表并对其执行SQL操作
#10
iswith2025-04-17 09:35
何必紧紧局限于VFP的Cursor认知!狭隘了!
#11
kiff2025-04-30 10:17
*中间层服务 WebService,编译DLL发布到IIS
DEFINE CLASS mywebbaseclass as Session
    DataSession=2
    databasename='mydatabase'
    PROCEDURE Init()
        SET ESCAPE OFF
        set carr off
        set mark to /
        set century on
        set date ymd
        set hours to 24
        set delete on
        set talk off
        set exact on
        set status bar off
        set safety off
        set conf on
        SET SYSMENU OFF
    ENDPROC

    PROCEDURE Destroy
    ENDPROC

    FUNCTION ConnectSQLServer() as Integer
        LOCAL iConn as Integer
        LOCAL connect_tmp as String
        LOCAL cText as String
        =SQLSETPROP(0,"DispLogin" ,3)
        connect_tmp="Driver={SQL Server};Server=192.168.1.200;Address=192.168.1.200,1433;Network=dbmssocn;Uid=sa;Pwd=密码;" &&连接数据库服务器,假设数据库服务器IP 192.168.1.200
        iConn=SQLSTRINGCONNECT(connect_tmp)
        IF iConn=-1
            cText='连接数据库失败'+chr(13)+chr(10)
            strtofile(cText,'error.txt',.t.)
        ELSE
            = SQLSETPROP(iConn, 'Transactions', 2)
            =SQLSETPROP(iConn, 'DisconnectRollback',.t.)
            = SQLEXEC(iConn,"USE "+THIS.databasename)
        ENDIF
        RETURN iConn
    ENDFUNC

    PROCEDURE DisConnectSQLServer(iConn as Integer)
        SQLDISCONNECT(iConn)
    ENDPROC

    PROCEDURE Error(nError as Integer,cMethod as String, nLine as Integer)
        CLOSE DATABASES
        =SQLDISCONNECT(0)
        =SYS(1104)
        LOCAL cText as String
        cText=;
        '出错时间:'+transform(datetime())+chr(13)+chr(10)+;
        '错误代码:'+str(nError,4)+chr(13)+chr(10)+;
        '错误提示:'+message()+chr(13)+chr(10)+;
        '错误方法:'+cMethod+chr(13)+chr(10)+;
        '错误行号:'+transform(nLine)+chr(13)+chr(10)
        strtofile(cText,'error.txt',.t.)
        comreturnerror("Fox Web Service",cText)
        CLEAR ALL
    ENDPROC
ENDDEFINE

DEFINE CLASS mywebservice as mywebbaseclass olepublic
    FUNCTION EXECUTE_SQL (SQL_STR as string) as string  &&执行客户端的SQL
        IF EMPTY(SQL_STR)
            RETURN ''
        ENDIF
        LOCAL cXML as String
        LOCAL SQL_ERR AS Integer
        LOCAL SQL_iConn AS Integer
        LOCAL OUT_filename as String
        cXML=''
        SQL_iConn=THIS.ConnectSQLServer()
        IF SQL_iConn<>-1
            SQL_ERR=SQLEXEC(SQL_iConn,SQL_STR,'cursor_TMP')
            IF SQL_ERR<>-1 AND USED('cursor_TMP')
                CURSORTOXML('cursor_TMP','cXML')
                cXML=STRCONV(cXML,13)
            ENDIF
            IF USED('cursor_TMP')
                USE IN cursor_TMP
            ENDIF
        ENDIF
        =this.DisConnectSQLServer(SQL_iConn)
        RETURN cXML  &&返回查询结果
    ENDFUNC
ENDDEFINE

**************************************************************


*客户端
*关联中间层
loWS = NEWOBJECT("WSHandler","_ws3client.vcx")
oweb =loWS.SetupClient("http://192.168.1.244:8080/myseb/mywebservice.WSDL", "", "")  &&假设中间层服务器IP: 192.168.1.244 IIS端口:8080

*执行SQL
xml_tmp=oweb.EXECUTE_SQL("select * from 表 where 查询条件") &&调用中间层的 EXECUTE_SQL() 执行SQL
xml_tmp=STRCONV(xml_tmp,14)
XMLTOCURSOR(xml_tmp,'cursor_TMP')
SELECT cursor_TMP
BROWSE


#12
schtg2025-04-30 12:07
回复 11楼 kiff
试一试,谢谢!
#13
easyppt2025-04-30 14:39
回复 11楼 kiff

客户端对象: oweb 创建的类 代码能分享吗,另外服务器端IIS 发布的DLL 是怎么调用的 ,是 myseb/mywebservice.WSDL 这个文件吗,这个文件的代码是怎样的  

#14
kangss2025-04-30 15:49
以下是引用easyppt在2025-4-30 14:39:10的发言:

回复 11楼 kiff

客户端对象: oweb 创建的类 代码能分享吗,另外服务器端IIS 发布的DLL 是怎么调用的 ,是 myseb/mywebservice.WSDL 这个文件吗,这个文件的代码是怎样的  


_ws3client.vcx 在“C:\Program Files (x86)\Microsoft Visual FoxPro 9\Ffc”
是VFP9自带的

#15
wcx_cc2025-04-30 20:27
kiff版主出现啦!
#16
kiff2025-05-07 11:38
以下是引用easyppt在2025-4-30 14:39:10的发言:

回复 11楼 kiff

客户端对象: oweb 创建的类 代码能分享吗,另外服务器端IIS 发布的DLL 是怎么调用的 ,是 myseb/mywebservice.WSDL 这个文件吗,这个文件的代码是怎样的  

*客户端
*关联中间层
loWS = NEWOBJECT("WSHandler","_ws3client.vcx")
oweb =loWS.SetupClient("http://192.168.1.244:8080/myseb/mywebservice.WSDL", "", "")  &&假设中间层服务器IP: 192.168.1.244 IIS端口:8080

*执行SQL
xml_tmp=oweb.EXECUTE_SQL("select * from 表 where 查询条件") &&调用中间层的 EXECUTE_SQL() 执行SQL
xml_tmp=STRCONV(xml_tmp,14)
XMLTOCURSOR(xml_tmp,'cursor_TMP')
SELECT cursor_TMP
BROWSE
**************************
这就是客户端代码,_ws3client.vcx是VFP9.0自带的类,服务器端IIS 发布的DLL,在IIS服务器端上安装VFP9.0 ,vfp工具菜单TOOLS->向导Wizards->web services 发布dll,并生成 .WSDL文件,客户端就是关联这.WSDL文件。
客户端和服务器都要安装soapsdk.msi,客户端要加入类"_ws3client.vcx。注意:服务器端发布dll时的服务器端IP地址要与客户端设用的IP相同 (如:oweb =loWS.SetupClient("http://192.168.1.244:8080/myseb/mywebservice.WSDL", "", "")
只有本站会员才能查看附件,请 登录


#17
hsfisher2025-05-24 00:00
学习
#18
jsddx2025-05-31 15:39
谢谢,学习了

1