在VFP上使用DM数据库.docx
《在VFP上使用DM数据库.docx》由会员分享,可在线阅读,更多相关《在VFP上使用DM数据库.docx(12页珍藏版)》请在冰豆网上搜索。
在VFP上使用DM数据库
在VFP上使用DM数据库
VFP是一种直接面向数据的快速开发工具,在信息系统中有着广泛的应用。
由于VFP命令本身就是为操纵数据设计的语言,所以在操作数据方面显得非常高效和轻松。
但是VFP缺点和它的优点一样明显,VFP本身安全性不高,且不支持其他远程的VFP数据库。
所以现在越来越多的VFP开发者开始使用SPT接口,通过SPT接口,可以利用其他数据库的安全和性能优势,再结合VFP自身的操纵数据的优势,来快速进行C/S应用程序的开发。
SPT是SQLPassThrough的简写,是VFP访问远程数据库的主要方法。
在VisualFoxPro中内置了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数据库
连接数据库有两种方式
1) 使用SqlConnect()函数。
使用这个函数,你需要首先在创建一个ODBC数据源。
打开[控制面板]->[管理工具],打开
可以看到
如果你已经正确安装了DM数据库,那么点击[添加]按钮可以看到,DM的ODBC驱动,选择该驱动
点击[完成]按钮,可以看到
DSN取名为VFP2DM,密码为默认SYSDBA。
保证DM服务器运行的情况下,点击[测试]->[测试数据源]
测试成功,那么OK,点击[确定],这个DSN就建立成功了。
下面要做的事情就很简单了。
使用函数
SQLCONNECT("VFP2DM","SYSDBA","SYSDBA")就可以连接到DM数据库了
第一个参数是DNS名字,第二个参数是用户名,第三个参数是密码。
2) 使用SqlStringConnect()函数
实际上,使用SQLCONNECT()函数,需要手动创建DSN,这是一件非常麻烦的事情,而且使用起来也不够灵活。
所以SPT提供了另一个函数,SqlStringConnect(),使用它可以直接连接到DM数据库,省去了很多的麻烦。
SqlStringConnect()函数的用法
SQLSTRINGCONNECT(
“Driver=DMODBCDriver;
SERVER=localhost;TCP_PORT=12345;DATABASE=SYSTEM;UID=SYSDBA;PWD=SYSDBA”)
SqlStringConnect()函数,使用连接字符串参数直接连接到DM数据库。
我们解释一下参数字符串的意义,driver指明了使用哪一个ODBC驱动程序,这里是DMODBCDriver;Server是指DMServer的服务器名称,我们使用本地服务器就是localhost;TCP_PORTS是DMServer的监听端口,UID是在DMServer的用户名,这里使用默认的SYSDBA;PWD是用户密码,这里使用默认值SYSDBA;
调用SqlConnect()或是SqlStringConnect()的返回值得如果是正整数,就表示连接成功,得到的正整数很重要——就是连接句柄!
2.访问数据库
我们首先创建连接
Localhdl_conn
hdl_conn=SQLSTRINGCONNECT(“Driver=DMODBCDriver;
SERVER=localhost;TCP_PORT=12345;DATABASE=SYSTEM;UID=SYSDBA;PWD=SYSDBA”)
得到连接句柄hdl_conn
1) 使用SQLEXEC()函数
函数原型
SQLEXEC(nConnectionHandle,[cSQLCommand,[cCursorName]])
先来解释一下SQLEXEC()函数:
参数nConnectionHandle表示连接句柄;参数cSQLCommand表示要传送的语句,注意此语句一定是DM数据库定义的SQL语法, 而不是VisualFoxPro的SQL语法。
回想一下SQLPassThough这个名字,顾名思义,VisualFoxPro只不过是是将别人的语言传送给别人,这一点现在完全体现在 SQLEXEC()函数上。
参数cCursorName表示得到的结果集的名字,如果省略,返回的结果集将以Sqlresult命名。
如果返回1表示,执行成功;如果返回0表示正在执行;如果返回负数表示执行失败。
这里最重要的就是cSQLCommand参数,它就是一个DM数据库可以识别的SQL字符串。
正如你所想,你可以直接传送SQL字符串,或者你也可以用拼接字符串的方法,构造动态SQL语句,来使用DM数据库。
例如:
1. SQLEXEC(hdl_conn,"CREATETABLETBL_VFP_DM(C1INTEGER,C2
VARCHAR(10),C3VARCHAR(50))")
2. SQLEXEC(hdl_conn,"INSERTINTOTBL_VFP_DM
VALUES(1,'ANDY','ANDYISNO1')")
3. Localid,name,info,sqlstr
Id=id
Name=”ROCK”
Info=”ROCKistest”
Sqlstr=”insertintoTBL_VFP_DM
VALUES(”+val(id)+”,’”+name+”’,’”+info+””’)
SQLEXEC(hdl_conn,Sqlstr)
4.SQLEXEC(hdl_conn,"SELECTC1ASID,C2ASNAME,C3ASCONTENTFROMTBL_VFP_DM","mycursor")
2) 使用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,"SELECTC1ASID,C2ASNAME,C3ASCONTENTFROMTBL_VFP_DM","mycursor")
这里为了更好的标明字段的意思,我们对C1,C2,C3字段分别使用了别名ID,NAME,CONTENT
VisualFoxPro的游标有三种:
只读游标、可读写游标、可更新游标。
1.只读游标是那种不能被修改的游标。
2.可读写游标是那种可以进行读写操作,但游标上的数据变更不被反映到数据源。
3.可更新游标是那种可以进行读写操作,并且任何数据变动都会反映到数据源。
也就是说,我们想要通过游标在VFP更新DM数据库中的表,需要的是一个可更新游标。
很遗憾,上述通过SQLEXEC()函数直接取得的游标,是一个可读写游标,也就是说如果我们修改mycursor中的值,VFP不会将修改同时更新到DM上。
这样可达不到我们使用DM的目的,所以在使用mycursor之前,我们还需要将游标mycursor设置为可更新游标。
VFP提供了设置游标属性的函数,使用方法如下:
设置可更新游标共有5步
A.CURSORSETPROP("TABLES",数据源表名,可更新光标名)
此步骤设定的是数据源里(SQLServer)待更新的表名,如果涉及多个表就这样写:
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","IDTBL_VFP_DM.C1,NAME
TBL_VFP_DM.C2,CONTENTTBL_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
1) 用户界面
2) 代码
1. Connect按钮
PUBLICip&&数据库服务器IP
ip=thisform.txt_ip.Value&&从控件取得服务器IP
*生成连接字符串
conn_str="Driver=DMODBCDriver;SERVER="+ip+";TCP_PORT=12345;DATABASE=SYSTEM;UID=SYSDBA;PWD=SYSDBA"
*设置连接属性为"连接失败时不弹出ODBC连接对话框"
SQLSETPROP(0,"DispLogin",3)
*使用连接字符串连接数据库
hdl_conn=SQLSTRINGCONNECT(conn_str)
*创建测试用表
SQLEXEC(hdl_conn,"DROPTABLETBL_VFP_DM")
SQLEXEC(hdl_conn,"CREATETABLETBL_VFP_DM(C1INTEGER,C2VARCHAR(10),C3VARCHAR(50))")
*添加测试数据
SQLEXEC(hdl_conn,"INSERTINTOTBL_VFP_DMVALUES(1,'ANDY','ANDYISNO1')")
SQLEXEC(hdl_conn,"INSERTINTOTBL_VFP_DMVALUES(2,'KYO','KYOISNO2')")
SQLEXEC(hdl_conn,"INSERTINTOTBL_VFP_DMVALUES(3,'RALPH','RALPHISNO3')")
*生成SPT游标
SQLEXEC(hdl_conn,"SELECTC1ASID,C2ASNAME,C3ASCONTENTFROMTBL_VFP_DM","mycursor")
SELECTmycursor
*设置SPT游标为可更新游标
CURSORSETPROP("Tables","TBL_VFP_DM","mycursor")
CURSORSETPROP("KeyFieldList","ID,NAME,CONTENT","mycursor")
CURSORSETPROP("UpdatableFieldList","ID,NAME,CONTENT","mycursor")
CURSORSETPROP("UpdateNameList","IDTBL_VFP_DM.C1,NAMETBL_VFP_DM.C2,CONTENTTBL_VFP_DM.C3","mycursor")
CURSORSETPROP("SendUpdates",.t.,"mycursor")
*显示游标内容
SELECTmycursor
Browse
2. ADD按钮
LOCALsql_insert
LOCALid_add
LOCALname_add
LOCALcont_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))
insertINTOmycursor(ID,NAME,CONTENT)VALUES(id_add,name_add,cont_add)
browse
3. DEL按纽
LOCALid_del &&取得文本框输入的ID
LOCALname_del&&取得文本框输入的NAME
LOCALcont_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))
*设置删除有效
SETDELETEDON
*根据输入ID为条件进行删除
DELETEFROM mycursorWHEREID=id_del
*显示删除结果
Browse
4. UPDATE按纽
LOCALid_upd
LOCALname_upd
LOCALcont_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))
*根据输入的参数更新表
UPDATEmycursorSETNAME=name_upd,CONTENT=cont_updWHEREid=id_upd
Browse
5. SELECT按纽
LOCALid_slc
LOCALname_slc
LOCALcont_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为条件对表做查询
IFid_slc<>0
select*frommycursorWHEREID=id_slc
endif
browse