您现在的位置: 中国男护士网 >> 考试频道 >> 计算机等级 >> 二级辅导 >> VFP >> 辅导 >> 正文    
  在VFP上使用DM数据库 【注册男护士专用博客】          

在VFP上使用DM数据库

www.nanhushi.com     佚名   不详 

  数据库是表的集合。要建立一个数据库,首先要确定数据库包含哪些表以及每个表的结构,然后需要确定表之间的联系。关于数据库的设计,是数据库应用系统开发中一个十分重要的问题。人们也总结出了数据库设计的一些方法和规范,如关系数据库规范化理论、E—R图设计方法等。关于这些知识,将在本书最后一章介绍。本节以第一章介绍的学生管理数据库为基础,从Visual Foxfr0操作的角度介绍建立数据库的方法 。

  5.1.1建立数据库文件

  在Visual FoxPro中,建立数据库文件可以采用菜单和命令两种操作方式。

  1.菜单操作方式

  选择“文件”菜单项中的“新建”命令,将出现“新建”对话框。在“新建”对话框中选择“数据库”单选按钮,再单击“新建文件”按钮,出现“创建”对话框。在“创建”对话框中输入数据库文件名和保存位置。选择“保存”按钮,系统将打开数据库设计器(如图5.1所示)。

  在数据库设计器上有一个浮动的数据库设计器工具栏,可以利用数据库设计器工具栏快速访问与数据库相关的选项。在菜单栏中有“数据库”菜单项,其中包含了各种可用的数据库命令。此外,在数据库设计器中任意空白区域单击鼠标右键,会弹出一个快捷菜单,其中也包含了可用的数据库命令。

  单击数据库设计器的“关闭”按钮可以关闭数据库设计器。至此,已经建立了一个数据库文件,不过由于还没有添加任何表和其他对象,所以只是建立了一个空的数据库。

  在建立Visual FoxPro数据库时,除扩展名是.dhc的数据库文件之外,还会自动建立一个扩展名是.dot的数据库备注文件和扩展名是.dcx的数据库索引文件。也即建立数据库文件后,用户可以在磁盘上看见文件名相同,但扩展名分别为.dbc、.dCt,和.dcx的3个文件,这3个文件是供Visual FoxFro管理数据库使用的,用户一般不能直接使用这些文件。

2.命令操作方式

  建立数据库文件也可以采用命令操作方式,命令格式是:

  cREATE DATABASE[(数据库文件名>l?]

  其中(数据库文件名>指定生成的数据库文件,若省略扩展名,则默认为.dbc。如果未指定数据库文件名或用“?’’代替数据库文件名,Visual FoxPro会弹出“创建”对话框,以便用户选择数据库存放的位置和输入数据库名。保存后该数据库文件被建立,并且自动,以独占方式打开该数据库。

  使用该命令建立数据库后并不打开数据库设计器,只是建立一个新的数据库文件并打开此数据库。

  VFP是一种直接面向数据的快速开发工具,在信息系统中有着广泛的应用。

  由于VFP命令本身就是为操纵数据设计的语言,所以在操作数据方面显得非常高效和轻松。

  但是VFP缺点和它的优点一样明显,VFP本身安全性不高,且不支持其他远程的VFP数据库。所以现在越来越多的VFP开发者开始使用SPT接口,通过SPT接口,可以利用其他数据库的安全和性能优势,再结合VFP自身的操纵数据的优势,来快速进行C/S应用程序的开发。

  SPT是SQL Pass Through的简写,是VFP访问远程数据库的主要方法。

  在Visual FoxPro 中内置了13个 SPT函数。

  连接建立函数:SqlConnect(),SqlStringConnect()

  连接的断开函数:SqlDisconnect()

  SQL语句传输及执行函数:SqlExec(),SqlPrapare()

  批次模式下更多数据集的取得函数:SqlMoreResults()

  异步模式下撤销正在执行的SPT的函数:SqlCancel()

  事务处理函数:SqlCommit(),SqlRollBack()

  连接通道属性函数:SqlGetProp(),SqlSetProp()

  数据源的信息截取函数:SqlTables(),SqlColumns()

  这些函数名是不是看上去很眼熟?如果你熟悉ODBC接口,那么我相信你花5分钟看完本文,你就会用SPT开发VFP程序了。

  下面将用一个简单的实例来说明,如何在VFP通过SPT接口使用DM数据库

  1.连接到DM数据库

  连接数据库有两种方式

  <!--[if !supportLists]-->1) <!--[endif]-->使用SqlConnect() 函数。

  使用这个函数,你需要首先在创建一个ODBC数据源。

  打开[控制面板]->[管理工具],打开<!--[if !vml]--><!--[endif]-->

  可以看到

  <!--[if !vml]--><!--[endif]-->

如果你已经正确安装了DM数据库,那么点击[添加]按钮可以看到,DM 的ODBC驱动,选择该驱动

点击[完成]按钮,可以看到

  DSN取名为VFP2DM,密码为默认SYSDBA。

  保证DM服务器运行的情况下,点击[测试]->[测试数据源] 测试成功,那么OK,点击[确定],这个DSN就建立成功了。

  下面要做的事情就很简单了。

  使用函数

  SQLCONNECT("VFP2DM","SYSDBA","SYSDBA")就可以连接到DM数据库了

  第一个参数是 DNS 名字,第二个参数是 用户名,第三个参数是 密码。

  <!--[if !supportLists]--> 2) <!--[endif]-->使用SqlStringConnect()函数

  实际上,使用SQLCONNECT()函数,需要手动创建DSN,这是一件非常麻烦的事情,而且使用起来也不够灵活。

  所以SPT提供了另一个函数,SqlStringConnect(),使用它可以直接连接到DM数据库,省去了很多的麻烦。

  SqlStringConnect()函数的用法

  SQLSTRINGCONNECT(

  “Driver=DM ODBC Driver;

  SERVER=localhost;TCP_PORT=12345;DATABASE=SYSTEM;UID=SYSDBA;PWD=SYSDBA”)

  SqlStringConnect()函数,使用连接字符串参数直接连接到DM数据库。

  我们解释一下参数字符串的意义,driver指明了使用哪一个ODBC驱动程序,这里是DM ODBC Driver;Server是指DM Server的服务器名称,我们使用本地服务器就是localhost;TCP_PORTS是DM Server的监听端口,UID是在DM Server的用户名,这里使用默认的SYSDBA;PWD是用户密码,这里使用默认值SYSDBA;

  调用SqlConnect()或是SqlStringConnect()的返回值得如果是正整数,就表示连接成功,得到的正整数很重要——就是连接句柄!

  2.访问数据库

  我们首先创建连接

  Local hdl_conn

  hdl_conn = SQLSTRINGCONNECT(“Driver=DM ODBC Driver;

  SERVER=localhost;TCP_PORT=12345;DATABASE=SYSTEM;UID=SYSDBA;PWD=SYSDBA”)

  得到连接句柄hdl_conn

  <!--[if !supportLists]-->1) <!--[endif]-->使用SQLEXEC()函数

  函数原型

  SQLEXEC(nConnectionHandle, [cSQLCommand, [cCursorName]])

  先来解释一下SQLEXEC()函数:参数nConnectionHandle表示连接句柄;参数cSQLCommand表示要传送的语句,注意此语句一定是DM数据库定义的SQL语法,而不是Visual FoxPro的SQL语法。回想一下SQL Pass Though这个名字,顾名思义,Visual FoxPro只不过是是将别人的语言传送给别人,这一点现在完全体现在SQLEXEC()函数上。参数cCursorName表示得到的结果集的名字,如果省略,返回的结果集将以Sqlresult命名。

  如果返回1表示,执行成功;如果返回0表示正在执行;如果返回负数表示执行失败。

  这里最重要的就是cSQLCommand参数,它就是一个DM数据库可以识别的SQL字符串。正如你所想,你可以直接传送SQL字符串,或者你也可以用拼接字符串的方法,构造动态SQL语句,来使用DM数据库。

  例如:

  <!--[if !supportLists]-->1. <!--[endif]-->SQLEXEC(hdl_conn,"CREATE TABLE TBL_VFP_DM (C1 INTEGER,C2

  VARCHAR(10),C3 VARCHAR(50))")

  <!--[if !supportLists]-->2. <!--[endif]-->SQLEXEC(hdl_conn,"INSERT INTO TBL_VFP_DM

  VALUES(1,’ANDY’,’ANDY IS NO1’)")

  <!--[if !supportLists]-->3. <!--[endif]-->Local id,name,info,sqlstr

  Id=id

  Name=”ROCK”

  Info=”ROCK is test”

  Sqlstr=”insert into TBL_VFP_DM

  VALUES(”+val(id)+”,’”+name+”’,’”+info+””’)

  SQLEXEC(hdl_conn, Sqlstr)

  4. SQLEXEC(hdl_conn,"SELECT C1 AS ID,C2 AS NAME,C3 AS CONTENT FROM TBL_VFP_DM", "mycursor")

  <!--[if !supportLists]-->2) <!--[endif]-->使用VFP的SQL访问DM数据库

  使用上述方法已经可以访问,并且使用DM数据库了,但是,这样的话并没有体现出VFP的强项----操纵数据,实际上,我们可以有更好的方法,来让VFP使用DM。

  再看一下SQLEXEC()函数原型

  SQLEXEC(nConnectionHandle, [cSQLCommand, [cCursorName]])

  在cSQLCommand参数为SELECT语句的时候DM数据库会返回给用户一个结果集,我们可以使用函数的第三个参数 cCursorName,给这个结果集命名,它在VFP中被称为游标,其实就是相当于DM数据库的表映射为VFP里的一张虚拟表。有了它,我们就可以直接使用VFP的语法对这张虚拟表进行操作,就像操作VFP自己的表一样,而且以上进行的操作都会如实的反映到真实的DM数据库中。

  所以我们可以这样获得游标

  SQLEXEC(hdl_conn,"SELECT C1 AS ID,C2 AS NAME,C3 AS CONTENT FROM TBL_VFP_DM", "mycursor")

  这里为了更好的标明字段的意思,我们对C1,C2,C3字段分别使用了别名ID,NAME,CONTENT

  Visual FoxPro的游标有三种:只读游标、可读写游标、可更新游标。

  1.只读游标是那种不能被修改的游标。

  2.可读写游标是那种可以进行读写操作,但游标上的数据变更不被反映到数据源。

  3.可更新游标是那种可以进行读写操作,并且任何数据变动都会反映到数据源。

  也就是说,我们想要通过游标在VFP更新DM数据库中的表,需要的是一个可更新游标。

  很遗憾,上述通过SQLEXEC()函数直接取得的游标,是一个可读写游标,也就是说如果我们修改mycursor中的值,VFP不会将修改同时更新到DM上。

  这样可达不到我们使用DM的目的,所以在使用mycursor之前,我们还需要将游标mycursor设置为可更新游标。

  VFP提供了设置游标属性的函数,使用方法如下:

  设置可更新游标共有5步

  A.CURSORSETPROP("TABLES",数据源表名,可更新光标名)

  此步骤设定的是数据源里(SQL Server)待更新的表名,如果涉及多个表就这样写:CURSORSETPROP("TABLES","T1,T2","MyCursor")。

  B.CURSORSETPROP("KEYFIELDLIST",关键字段,可更新光标名)

  此步骤是设定关键字段的,这个关键字段是这可更新光标的字段,而不是数据源里字段。

  C.CURSORSETPROP("UPDATABLEFIELDLIST",可更新字段列表,可更新光标名)

  此步骤设定的是在可更新光标里哪些字段的变动要被反映到数据源,即哪些字段时可更新的。

  D.CURSORSETPROP("UPDATENAMELIST",前后段字段对应关系列表,可更新光标名)

  此步骤设定前后端字段的对应关系。

  E.CURSORSETPROP("SENDUPDATES",.T.,可更新光标名)

  按上述步骤,设置游标为可更新游标:

  CURSORSETPROP("Tables","TBL_VFP_DM","mycursor")

  CURSORSETPROP("KeyFieldList","ID,NAME,CONTENT","mycursor")

  CURSORSETPROP("UpdatableFieldList","ID,NAME,CONTENT","mycursor")

  CURSORSETPROP("UpdateNameList","ID TBL_VFP_DM.C1,NAME

  TBL_VFP_DM.C2,CONTENT TBL_VFP_DM.C3","mycursor")

  CURSORSETPROP("SendUpdates" ,.t.,"mycursor")

  3.断开与DM数据库的连接

  使用完数据库,需要端开连接释放资源。

  这时可使用SqlDisConnect()函数。

  这个函数的使用非常简单。

  SQLDISCONNECT(hdl_conn) &&返回1表示连接断开成功

  如果想一下子断开所有的连接,您可以使用这样的方法:

  SQLDISCONNECT(0)

  4.一点说明

  利用上面所讲的方法,你已经可以在DM上完成绝大部分的工作了,还有其他一些SPT函数的使用,请参考VFP的帮助文档。

  上面的例子中为了简便和说明问题,并没有对函数的返回值做异常处理,如果你是在做应用程序开发,请一定要注意处理函数返回的错误。

  5.一个实例

  一个使用SPT完成DM数据库增、删、改、查操作的实例。

  编程环境 VFP8.0

  DM数据库版本 5.6

  <!--[if !supportLists]-->1) <!--[endif]-->用户界面

  <!--[if !supportLists]-->1) <!--[endif]-->代码

  <!--[if !supportLists]-->1. <!--[endif]-->Connect 按钮

  PUBLIC ip &&数据库服务器IP

  ip = thisform.txt_ip.Value &&从控件取得服务器IP

  *生成连接字符串

  conn_str = "Driver=DM ODBC Driver;SERVER=" + ip +";TCP_PORT=12345;DATABASE=SYSTEM;UID=SYSDBA;PWD=SYSDBA"

  *设置连接属性为"连接失败时不弹出ODBC连接对话框"

  SQLSETPROP(0,"DispLogin" ,3)

  *使用连接字符串连接数据库

  hdl_conn = SQLSTRINGCONNECT(conn_str)

  *创建测试用表

  SQLEXEC(hdl_conn,"DROP TABLE TBL_VFP_DM")

  SQLEXEC(hdl_conn,"CREATE TABLE TBL_VFP_DM (C1 INTEGER,C2 VARCHAR(10),C3 VARCHAR(50))")

  *添加测试数据

  SQLEXEC(hdl_conn,"INSERT INTO TBL_VFP_DM VALUES(1,’ANDY’,’ANDY IS NO1’)")

  SQLEXEC(hdl_conn,"INSERT INTO TBL_VFP_DM VALUES(2,’KYO’,’KYO IS NO2’)")

  SQLEXEC(hdl_conn,"INSERT INTO TBL_VFP_DM VALUES(3,’RALPH’,’RALPH IS NO3’)")

  *生成SPT游标

  SQLEXEC(hdl_conn,"SELECT C1 AS ID,C2 AS NAME,C3 AS CONTENT FROM TBL_VFP_DM", "mycursor")

  SELECT mycursor

  *设置SPT游标为可更新游标

  CURSORSETPROP("Tables","TBL_VFP_DM","mycursor")

  CURSORSETPROP("KeyFieldList","ID,NAME,CONTENT","mycursor")

  CURSORSETPROP("UpdatableFieldList" ,"ID,NAME,CONTENT","mycursor")

  CURSORSETPROP("UpdateNameList","ID TBL_VFP_DM.C1,NAME TBL_VFP_DM.C2,CONTENT TBL_VFP_DM.C3","mycursor")

  CURSORSETPROP("SendUpdates" ,.t.,"mycursor")

  *显示游标内容

  SELECT mycursor

  Browse

  <!--[if !supportLists]-->2. <!--[endif]-->ADD按钮

  LOCAL sql_insert

  LOCAL id_add

  LOCAL name_add

  LOCAL cont_add

  id_add=VAL((TRIM(thisform.txt_id.Text)))

  name_add=TRANSFORM(TRIM(thisform.txt_name.Text))

  cont_add=TRANSFORM(TRIM(thisform.txt_cont.Text))

  insert INTO mycursor (ID,NAME,CONTENT) VALUES(id_add, name_add, cont_add)

  browse

  <!--[if !supportLists]-->3. <!--[endif]-->DEL按纽

  LOCAL id_del &&取得文本框输入的ID

  LOCAL name_del &&取得文本框输入的NAME

  LOCAL cont_del &&取得文本框输入的CONTENT

  id_del=CEILING(VAL((TRIM(thisform.txt_id.Text))))

  name_del=TRANSFORM(TRIM(thisform.txt_name.Text))

  cont_del=TRANSFORM(TRIM(thisform.txt_cont.Text))

  *设置删除有效

  SET DELETED ON

  *根据输入ID为条件进行删除

  DELETE FROM mycursor WHERE ID=id_del

  *显示删除结果

  Browse

  <!--[if !supportLists]-->4. <!--[endif]-->UPDATE按纽

  LOCAL id_upd

  LOCAL name_upd

  LOCAL cont_upd

  id_upd=CEILING(VAL((TRIM(thisform.txt_id.Text))))

  name_upd=TRANSFORM(TRIM(thisform.txt_name.Text))

  cont_upd=TRANSFORM(TRIM(thisform.txt_cont.Text))

  *根据输入的参数更新表

  UPDATE mycursor SET NAME=name_upd,CONTENT=cont_upd WHERE id=id_upd

  Browse

  <!--[if !supportLists]-->5. <!--[endif]-->SELECT按纽

  LOCAL id_slc

  LOCAL name_slc

  LOCAL cont_slc

  id_slc=VAL((TRIM(thisform.txt_id.Text)))

  name_slc=TRANSFORM(TRIM(thisform.txt_name.Text))

  cont_slc=TRANSFORM(TRIM(thisform.txt_cont.Text))

  *以ID为条件对表做查询

  IF id_slc<>0

  select * from mycursor WHERE ID = id_slc

  endif

  browse

 

文章录入:杜斌    责任编辑:杜斌 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     

    联 系 信 息
    QQ:88236621
    电话:15853773350
    E-Mail:malenurse@163.com
    免费发布招聘信息
    做中国最专业男护士门户网站
    最 新 热 门
    最 新 推 荐
    相 关 文 章
    没有相关文章
    专 题 栏 目

      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)                            【进男护士社区逛逛】
    姓 名:
    * 游客填写  ·注册用户 ·忘记密码
    主 页:

    评 分:
    1分 2分 3分 4分 5分
    评论内容:
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。