回 帖 发 新 帖 刷新版面

主题:[讨论]单机程序如何升级到客户/服务器程序?

我已有一个单机程序,里面有数据库表也有自由表。现在想实现多机操作功能,不知该做哪些处理?希有经验的前辈们告之。谢谢!

回复列表 (共53个回复)

21 楼

远程视图    ODBC

22 楼

[quote]Visual FoxPro 事务处理只能用于数据库中的表和视图。
使用远程表中存储的数据时,事务处理命令控件只更新视图临时表的本地副本中的数据;对远程基表的更新不起作用。若要对远程表启用人工事务处理,请使用SQLSETPROP( ),然后用 SQLCOMMIT( ) 和 SQLROLLBACK( ) 控制事务处理。

    上面的文字是vfp60help.chm中的一段copy。通过这些文字,我大致清楚了在网络中vfp如何更新数据,知道了视图是存放于数据库中的一种可产生查询结果集的数据查询定义。可我也有不少疑问。“视图临时表”、“视图临时表的本地副本”,还有打开缓存时的“缓冲区”,这三者占有不同的内存块吗?对视图进行编辑时,修改的到底是“视图临时表”呢还是“缓冲区”?提交(tableupdate())时,修改的又是哪个部份?如果打开的是本地表,但使用了缓存,情形又如何?在所有的情形中,oldval()与curval()两个函数返回的又是哪个部份的值?这些问题我老觉得帮助文件说得不太清楚。我很希望有人给我把这些问题说清楚点。
    另外,我现在希望以文件共享方式把单机程序修改为多机使用程序。我觉得,只要安装程序的目录设置为共享,在局域网内的其他机器就可以运行被设为共享的vfp应用程序。但这种应用程序中打开表的语句该如何写呢?在未安装程序的机器上运行程序,打开的表在哪个位置呢?在这种程序中,能不能用copy to data\filename、create table fileneme一类语句呢?如果用这种语句,filename.dbf又会保存到何处呢?(本地机或远程机[安装程序的机器])如果希望将filename保存到安装程序的机器的安装目录的data子目录中,语句该如何写呢?我认为,这是将单机程序改为多机使用程序应该清楚的问题。可我对此很不清楚。我也很希望有人给我讲讲这些问题。
 



[/quote]我正在用虚拟局域网探索在16楼(见引用)提出的疑问,希望能得到前辈的指教。

23 楼


    我在16楼提出的关于文件路径的问题(见上楼的引用)已解决。
    在要共享的程序里不能用copy to data\filename、create table fileneme一类语句。如果希望将filename保存到安装程序的机器的安装目录的data$子目录中,上面的语句应写为copy to gcdataLj+"filename"。如果希望将filename保存到本地机的临时目录下,可用语句copy to sys(2023)+"filename"。上面的gcdataLj是在主程序中通过后面所附的语句赋值的公共变量。设计程序时,应用程序要设置两个子目录,一个放置应用程序,一个放置数据(该目录我用的名称为data$)。使用时要提醒用户将第一个子目录设置为只读的共享目录,将第二个子目录设置为可读写的共享目录。

附:主程序中gcdataLj的赋值语句
case AT("\\", lcSys16)>0
    lcProgram =left(lcSys16, AT("\", lcSys16,3)-1)
    lcjsjname =SUBSTR(lcProgram, AT("\", lcProgram,2)+1)
    gcdataLj="\\"+lcjsjname+"\data$\"

24 楼

我看到过别人的代码,估计能用得上:

mypath=left(sys(16),rat("\",sys(16)))
set defa to (mypath)

我也有一个问题,我不知道VFP里的函数调用是怎么使用的:这两行能合并吗?

25 楼

路径问题的代码为
lcSys16 = SYS(16)
lcjsjname=left(sys(0),(at(" ",sys(0))-1))
on error llerror=.T.
do case
case AT(":", lcSys16)>0
    gcdataLj="\\"+lcjsjname+"\data$\"
    cd &gcdataLj
    if llerror
        on error
        =MESSAGEBOX("还没有将应用程序数据所在的目录设置为共享目录。请将它设为共享。(设置时要以原目录名作为共享名,并要允写操作。)",48,"出错提示")
        RELEASE ALL EXTENDED
        CLEAR ALL
        retu
    endi
    cd "\\"+lcjsjname+"\pzzhgl\"
    on error
    if llerror
        =MESSAGEBOX("还没有将应用程序所在的目录设置为共享目录。为方便其他计算机访问,请将程序所在目录设为共享。(设置时要以原目录名作为共享名,并只能设为只读。)",48,"友情提示")
    endi
    lcProgram =SUBSTR(lcSys16, AT(":", lcSys16)-1)
    cd LEFT(lcProgram, RAT("\", lcProgram))
case AT("\\", lcSys16)>0
    lcProgram =left(lcSys16, AT("\", lcSys16,3)-1)
    lcjsjname =SUBSTR(lcProgram, AT("\", lcProgram,2)+1)
    gcdataLj="\\"+lcjsjname+"\data$\"
    cd &gcdatalj
    on error
    if llerror
        =MESSAGEBOX("管理员在程序所在的计算机上对数据所在目录进行共享设置后才能运行该程序。",48,"出错提示")
        RELEASE ALL EXTENDED
        CLEAR ALL
        retu
    endi
    cd left(lcSys16, AT("\", lcSys16,4)-1)
endc

26 楼

这里有人提到张洪举的名字,
我才发觉我买的两本书都是人民邮电出版张洪举编的书.
在此,还要严重鄙视清华大学出版社出版的书籍.坚决反对.

27 楼

单机程序升级到客户/服务器程序?
由于单机程序与客户/服务器程序根本的不同,代码的更改量很大,几乎是不可能的!
举个例子:

                    单机程序            客户/服务器程序
获得数据      USE ......          SQLEXEC(连接句柄,SQL语句,返回的结果集)


     最可能的是通过视图来编写的单机版程序,将本地视图更改成远程视图,就可以勉强运行了,但当你了解了C/S系统后,你就不会提这种问题了!

28 楼

改写可能比重写还是要省点事吧。

29 楼

[quote]改写可能比重写还是要省点事吧。[/quote]
不!
单机版程序在设计时的根本思路都同:
1\ 必须解决网络冲突问题
2\必须解决多用户下的网络效率即少占用网络
3\代码必须高效,否则海量的数据将带来意想不到的问题
4\SQL SERVER 做后台,你必须会SQL SERVER 
................

30 楼

顶一帖,静静的期待结果

我来回复

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