主题:[回答]单机程序如何升级到客户/服务器程序?和VFP程序如何运行于服务器?的老问题!
这个问题在本论坛讨论了尽两年还没结帖,还有人问,真是不可理解!所以发一新帖回答大家!
答:masachik 的问题
我来从ABC开始说起起吧...因为我有同样的经历..(曾经成功用VFP开发过80个网络工作站的商业运用系统)...
A:指定一台电脑SERVER做文件服务器,设定一盘符下的目录存放“数据库表”和“自由表”。并设成共享。
(例如:D:\USER\USER\ 下面的文件为 *.DBF *.CDX *.DBC 等等)
B:另外几台USER1、USER2、USER3、USERx...电脑为工作站,并影射同盘符一路径到文件服务器的共享。
(例如:F:----> \\SERVER\USER 这样 USER1...x的F:盘就是F:\USER\ 下面的文件为 *.DBF *.CDX *.DBC 等等)
C:将单机版程序中所有和数据库相关的路径都批量改为网络路径。
(例如:F:\USER\)
D:如对库没有“追加”“修改”“物理删除”等操作的可修改设为“共享”打开即可,否则操作前必须增加锁库处理程序,或要设为“独占”打开。对记录“修改”的可只锁记录。
E:对多个工作站同时突发修改同一条记录时,由于“数据库表”和“自由表”不同于SQL,没有突发请求修改的自动缓冲列队存储功能,所以你只能设时间周期循环锁定记录才能实现“修改”等操作。
F:所有对库和记录的操作必须设定“状态”返回码以校验操作是否成功,处理好数据的一致性。并给或者告知用户相应的处理提示!
如果你做到以上几点,那么恭喜你的单机版软件就已升级为网络版了。。。(另外你还没有用到SQL数据库 所以没有楼上那些说的那么难。。只要你去多试。。。)。。。你如要做得更好。。那你就多与我联系!。。。。
答:nhcherry 的问题(在数据库文件夹不共享的情况下能否指定服务器IP取存数据呢?)
在数据库文件夹不共享的情况下,不能访问到数据文件,要设为共享才行,可以用IP地址影
射,(例如:F:----> \\192.168.1.123\USER 这样 USER1...x的F:盘就是F:\USER\ 下面的文件为 *.DBF *.CDX *.DBC 等等)如果你一定要“不共享”又要存取及共用数据库的话,我也有一个办法,那就是“用Winsock控件在VFP中进行编程”给个“示范代码”你参考,如你感兴趣我可进一步。。。
实现代码
1.客户端
■表单的 Init 事件:
public strData
strData = ""
thisform.tcpClient.RemoteHost = "192.168.1.123"
thisform.tcpClient.RemotePort = 1001
■“连接”按钮.Click 事件
thisform.tcpClient.object.Connect("192.168.1.123",1001)
this.Enabled = .f.
■TcpClient.DataArrive 事件
*** ActiveX Control Event ***
LPARAMETERS bytestotal
thisform.tcpClient.Object.GetData(@strData)
thisform.txtOutput1.Value = strData
■TxtSend1.InteractiveChange 事件
thisform.tcpClient.Object.SendData(this.Value)
2.服务端
■表单的 Init 事件:
public strData
strData = ""
thisform.tcpServer.Object.LocalPort = 1001
thisform.tcpServer.Object.Listen
■TcpServer.ConnectionRequest 事件
*** ActiveX Control Event ***
LPARAMETERS requestID
If thisform.tcpServer.OBJECT.State <> 0
thisform.tcpServer.OBJECT.Close
endif
thisform.tcpServer.OBJECT.Accept(requestID) 常数 值 说明
sckClosed 0 关闭(默认)
sckOpen 1 打开
sckListening 2 侦听
sckConnected 7 已连接
sckError 9 发生了错误
■TcpServer.DataArrive 事件
*** ActiveX Control Event ***
LPARAMETERS bytestotal
thisform.tcpClient.Object.GetData(@strData)
thisform.txtOutput1.Value = strData
■TxtSendData.InteractiveChange 事件
thisform.tcpServer.Object.SendData(this.Value)
答:masachik 的问题
我来从ABC开始说起起吧...因为我有同样的经历..(曾经成功用VFP开发过80个网络工作站的商业运用系统)...
A:指定一台电脑SERVER做文件服务器,设定一盘符下的目录存放“数据库表”和“自由表”。并设成共享。
(例如:D:\USER\USER\ 下面的文件为 *.DBF *.CDX *.DBC 等等)
B:另外几台USER1、USER2、USER3、USERx...电脑为工作站,并影射同盘符一路径到文件服务器的共享。
(例如:F:----> \\SERVER\USER 这样 USER1...x的F:盘就是F:\USER\ 下面的文件为 *.DBF *.CDX *.DBC 等等)
C:将单机版程序中所有和数据库相关的路径都批量改为网络路径。
(例如:F:\USER\)
D:如对库没有“追加”“修改”“物理删除”等操作的可修改设为“共享”打开即可,否则操作前必须增加锁库处理程序,或要设为“独占”打开。对记录“修改”的可只锁记录。
E:对多个工作站同时突发修改同一条记录时,由于“数据库表”和“自由表”不同于SQL,没有突发请求修改的自动缓冲列队存储功能,所以你只能设时间周期循环锁定记录才能实现“修改”等操作。
F:所有对库和记录的操作必须设定“状态”返回码以校验操作是否成功,处理好数据的一致性。并给或者告知用户相应的处理提示!
如果你做到以上几点,那么恭喜你的单机版软件就已升级为网络版了。。。(另外你还没有用到SQL数据库 所以没有楼上那些说的那么难。。只要你去多试。。。)。。。你如要做得更好。。那你就多与我联系!。。。。
答:nhcherry 的问题(在数据库文件夹不共享的情况下能否指定服务器IP取存数据呢?)
在数据库文件夹不共享的情况下,不能访问到数据文件,要设为共享才行,可以用IP地址影
射,(例如:F:----> \\192.168.1.123\USER 这样 USER1...x的F:盘就是F:\USER\ 下面的文件为 *.DBF *.CDX *.DBC 等等)如果你一定要“不共享”又要存取及共用数据库的话,我也有一个办法,那就是“用Winsock控件在VFP中进行编程”给个“示范代码”你参考,如你感兴趣我可进一步。。。
实现代码
1.客户端
■表单的 Init 事件:
public strData
strData = ""
thisform.tcpClient.RemoteHost = "192.168.1.123"
thisform.tcpClient.RemotePort = 1001
■“连接”按钮.Click 事件
thisform.tcpClient.object.Connect("192.168.1.123",1001)
this.Enabled = .f.
■TcpClient.DataArrive 事件
*** ActiveX Control Event ***
LPARAMETERS bytestotal
thisform.tcpClient.Object.GetData(@strData)
thisform.txtOutput1.Value = strData
■TxtSend1.InteractiveChange 事件
thisform.tcpClient.Object.SendData(this.Value)
2.服务端
■表单的 Init 事件:
public strData
strData = ""
thisform.tcpServer.Object.LocalPort = 1001
thisform.tcpServer.Object.Listen
■TcpServer.ConnectionRequest 事件
*** ActiveX Control Event ***
LPARAMETERS requestID
If thisform.tcpServer.OBJECT.State <> 0
thisform.tcpServer.OBJECT.Close
endif
thisform.tcpServer.OBJECT.Accept(requestID) 常数 值 说明
sckClosed 0 关闭(默认)
sckOpen 1 打开
sckListening 2 侦听
sckConnected 7 已连接
sckError 9 发生了错误
■TcpServer.DataArrive 事件
*** ActiveX Control Event ***
LPARAMETERS bytestotal
thisform.tcpClient.Object.GetData(@strData)
thisform.txtOutput1.Value = strData
■TxtSendData.InteractiveChange 事件
thisform.tcpServer.Object.SendData(this.Value)