手把手教你学vfp+sql2000的cs系统吧!

本文介绍了一个具体的客户机/服务器(C/S)应用案例,通过Visual FoxPro(VFP)连接到SQL Server数据库,实现数据同步及前端操作。文章详细展示了从环境搭建、数据表创建到开发具体功能模块的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

一、基本准备 1、安装SQL个人版+SP4 2、安装VFP9+SP1+汉化。(看自己中意汉化否) 3、会做一点单机版的项目。 二、准备实施 1、启动SQL企业管理器,选择当前服务器,新建一数据库,命名 cj,在该库下建一表,字段为    字段名   类型   宽度    编号      C      6    姓名      C      8    职务      C      10    股室      C      10    电话      C   11    将编号设为主键,保存,命名为 人员表;   2、建一ODBC,指向人员表。 ODBC所在位置:开始-设置-控制面板-管理工具-数据源ODBC   添加。   选择SQL,完成。   输入想要的名称、描述,服务器要选对,下一步   输入用户ID和密码,下一下。   更改数据库,下一步。   完成。   测试一下数据源。   至此,准备工作已完成。 三、实施过程 1新建一项目,名自己定 2(建立ODBC连接)新建一程序,用来连接服务器,并将服务器上的数据下载到客户端。(因为用到的表比较小,可以整个下载下来,如果表比较大,最好是有选择地下载需要用到的记录)
程序思路如下: 先定义一个连接串nhandle,并使用用户名密码连接相应的数据库,测试连接是否成功。如果成功,则下载表到本地临时表(好象是视图?弄不明白,先当它是表),命名为gh,如果不成功,则提示连接失败,并提示再次连接否。 连接成功并下载好表后,设置表与服务器表的相应更新。(此设置可以为另一种形式,等做好这种形式后可试试另一种)             

 

程序如下:   public nhandle  &&&定义连接串名   nhandle=sqlstringconnect("driver=sql server;server=192.168.9.10;uid=sa;pwd=aa;database=cj")  &&&我的连接类型是 SQL SERVER,服务器是192.168.9.10,用户名是sa,密码是aa,数据库是cj if nhandle>0   MESSAGEBOX('连接成功!!!')   sqlexec(nhandle,"select 编号,姓名,职务,股室,电话 from 人员表 order by 编号","gh") &&将服务器中的‘人员表’表中的数据读到 gh 表中    sele gh   cursorsetprop("tables","人员表","gh") &&设置临时表的更新目标表   cursorsetprop("keyfieldlist",'编号',"gh") &&设置临时表的关键字   cursorsetprop("updatablefieldlist","编号,姓名,职务,股室,电话","gh")&&设置临时表的更新字段   cursorsetprop("updatenamelist","编号 人员表.编号,姓名 人员表.姓名,职务 人员表.职务,股室 人员表.股室,电话 人员表.电话","gh") &&&gh中的相应字段更新人员表   cursorsetprop("sendupdates",.t.,"gh")&&设置为可更新   cursorsetprop("wheretype",2)   cursorsetprop("buffering",5)&&设置表缓冲 *  do form 表单1 else   if messagebox("数据库连接失败,是否继续连接?",48+4,"连接失败提示")=6 &&回答""      return   else     quit   endif endif    3(远程视图)建一表单,用来操作下载到本地的临时表gh并更新服务器表。 A、在表单中放一表格grid1 B、在表单的init里写上 SELECT gh thisform.grid1.RecordSource='gh'  &&&将表格的数据源设置为表gh **********如果想表格好看点,最好能定义一下表格各列的宽度 *thisform.grid1.column1.width=40 C、在表单中放新增,删除,保存到服务器,清空服务器数据四个按钮 新增按钮:反正是临时表,直接在表格里新增,以图快。你可以用文本框,这样可以控制是否有重复记录,输入是否符合要求等。至于如何才能达到你的要求,就看你自己的了。 新增按钮的click 过程代码: SELECT gh APPEND BLANK thisform.grid1.SetFocus 删除按钮:在C/S里,删除只能打上删除号,不能pack,否则,死得很难看的。Pack要写在表单的退出中。因为不能使用pack,就用了set filter to !dele().这个东东在临时表中好象要移动一下记录指针才生效的。 删除按钮click代码: sele gh bh=alltrim(编号) xm=alltrim(姓名) set filter to !dele() if messagebox(bh+xm+"的数据删除,将不能恢复,真的要删除吗?",48+4,"信息提示")=6 &&回答""    sqlexec(nhandle,"delete from 人员表 where 编号=?bh")&&&删除服务器上相应的记录    DELETE  &&&&删除临时表中的相应记录,注意不能在这使用pack ENDIF **************以下是移动指针 if delete() if !eof()    skip else   if recn()>1         &&没有这个函数,查不到     skip -1   endif endif endif thisform.grid1.setfocus 保存按钮:因为临时表直接绑到了表格中,在录入时就保存了,这里主要是指将临时表中的数据更新到服务器的表中,代码很简单。 保存按钮的click代码: select gh TABLEUPDATE(.t.) 清空服务器相应数据表按钮:相当于本地表的zap Click代码如下: select gh if messagebox("你正在执行的操作是清空服务器的数据,真的要清空吗?",48+4,"信息提示")=6 &&回答""    sqlexec(nhandle,"truncate table 人员表") &&清空服务器数据表 ENDIF 至此,已基本完工。在程序中加上一句 Do form 表单 运行程序试一试?应该早就试了,我至此已运行很多次试了的。 4、完善一些功能。 A、表格的afterrowcolchange:我是不想每增加一个记录都去按一次新增按钮,于是就采用allowaddnew SELECT gh thisform.command2.Caption='删除 '+ALLTRIM(编号)+ALLTRIM(姓名) IF !EMPTY(ALLTRIM(编号))   thisform.grid1.allowaddnew= .T.   ELSE   thisform.grid1.allowaddnew=.f. ENDIF B、表单的init:为了让刚才的allowaddnew生效,我先判断gh是否有记录,如果没有就先加个空记录。然后定义一下表格各列的宽度。 SELECT gh if recc()=0    appe blan endif with thisform.grid1    .recordsource='gh'    .columncount=5    .column1.controlsource='gh.编号'    .column1.width=30    .column2.controlsource='gh.姓名'    .column2.width=60    .column3.controlsource='gh.职务'    .column3.width=60    .column4.controlsource='gh.股室'    .column4.width=60    .column5.controlsource='gh.电话'    .column5.width=90 ENDWITH
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值