再见西城 发表于 2015-1-16 22:37:02

MYSQL编程:VFP与SQL远程异构数据库

DBaaS向客户提供了许多与其他云服务相类似的优势:一个灵活的、可扩展的MySQL学习教程、按需服务的平台,它以自助服务和便捷管理为导向,可以对环境中的资源进行调配。数据|数据库<P></P>熟习VFP的伴侣都晓得,在VFP里我们可使用远程视图(RemoteView)和SPT(SQLPassThrough)手艺把持远程异构数据库。这些手艺实际上是VFP对ODBC的API的封装,以是关于用户来讲会见远程数据库就像操纵传统的DBF一样复杂。关于这两种手艺的利用,完整能够味同嚼蜡地写下一本书,鉴于本文主题及篇幅,这里仅列举SPT手艺会见远程数据的使用。<P>  良多人以为有了远程视图如许直不雅、复杂的工具,为何还必要SPT呢?的确SPT较远程视图难以把握,但细细体味你会发明:远程视图实际上是对SPT的可视化工具!SPT较远程视图更具能力,远程视图供应的功效只是SPT的一个子集。其上风和优势次要表现在以下几个方面:
  l、SPT的上风
  1)一次失掉多个Cursor;
  2)实行除Select之外的其他SQL语句,如Insert、Update、Delete等;
  3)实行远程数据库的存储历程;
  4)实行远程数据库的特别函数、命令等;
  5)事件办理。
  2、SPT的优势
  1)没有图形用户界面;
  2)必需野生保护毗连;
  3)失掉的Cursor默许是“可读写”Cursor,要使它成为“可更新”Cursor必需经由设置才行。
  上面就顺着我们对SPT的熟悉,来扫瞄一下这个巨大的工具吧!(注重:本文一切例程均利用SQLServer的NorthWind数据库演示)。

  办理毗连

  l、创建毗连
  注重:本文一切示例的代码若用到毗连的,默许接纳“创建毗连”代码中发生的毗连句柄“CON”。
  WAIT毗连到SQLServer上往NOWAITNOCLEARWINDOW
  SQLSETPROP(0,"DispLogin",3)&&&&设置情况为“从不显现ODBC登录对话框”。
  CON=SQLSTRINGCONNECT("driver=SQLServer;Server=BOE;Uid=sa;pwd=;database=northwind")
  *假定SQLServer服务器名为BOE,用户ID是sa,口令是空串
  *假如你的SQLServer的服务器名,用户ID,口令与上分歧,请修正以上代码中的相干部分以切合你体系中的设置
  WAITclear
  IFcon<=0
  MESSAGEBOX(毗连失利,64,毗连到SQLServer上往)
  ELSE
  MESSAGEBOX(毗连乐成,64,毗连到SQLServer上往)
  ENDIF
  2、断开毗连
  SQLDISCONNECT(CON)

  一次失掉多个Cursor

  我们能够用一次SPT传回多个Cursor,以下:
  cSQL="SELECT*FROMEMPLOYEES"+CHR(10)+"SELECT*FROMCUSTOMERS"+CHR(10)+"SELECT*FROMPRODUCTS"
  ?SQLEXEC(con,cSQL,"TEMP")
  SQLEXEC()的前往值暗示Cursor的数目,这里前往3。这三个Cursor分离以TEMP、TEMP1和TEMP2定名。

  实行其他SQL语句

  上面我们实验实行SQLServer之外的SQL语句:
  cSQL="IFEXISTS(SELECT*FROMCUSTOMERSswheresCUSTOMERID=TEST)"
  cSQL=cSQL+"DELETEFROMCUSTOMERSswheresCUSTOMERID=TEST"cSQL=cSQL+"ELSEINSERTCUSTOMERS(CUSTOMERID,COMPANYNAME)VALUES(TEST,这是一个测试!)"
  IFSQLEXEC(CON,cSQL)<=0
  MESSAGEBOX(实行失利,64,发送语句到SQLServer上往)
  ELSE
  MESSAGEBOX(实行乐成,64,发送语句到SQLServer上往)
  ENDIF
  行文至此,大概有伴侣会问:假如SQL语句中CUSTOMERID是一个变量怎样办呢?实在我们能够经由过程两个经常使用的办理计划来办理:
  1、拼接字符串
  CUSTID=TEST
  cSQL="IFEXISTS(SELECT*FROMCUSTOMERSswheresCUSTOMERID="+CUSTID+")"
  cSQL=cSQL+"DELETEFROMCUSTOMERSswheresCUSTOMERID="+CUSTID+""
  cSQL=cSQL+"ELSEINSERTCUSTOMERS(CUSTOMERID,COMPANYNAME)VALUES("+CUSTID+",这是一个测试!)"
  ?SQLEXEC(CON,cSQL)
  2、SPT尺度变量传送法
  CUSTID=TEST
  cSQL="IFEXISTS(SELECT*FROMCUSTOMERSswheresCUSTOMERID=?CUSTID)"
  cSQL=cSQL+"DELETEFROMCUSTOMERSswheresCUSTOMERID=?CUSTID"
  cSQL=cSQL+"ELSEINSERTCUSTOMERS(CUSTOMERID,COMPANYNAME)VALUES(?CUSTID,这是一个测试!)"
  ?SQLEXEC(CON,cSQL)

  特别函数和命令

  假如在SQLServer中你有充足的权限,经由过程SPT利用远程数据库的特别函数和命令,你能够完整把持SQLServer,这里我们就演示“如何获得数据库服务器的工夫”:
  ?SQLEXEC(con,"selectgetdate()asserverdatetime","temp1")
  ?temp1.serverdatetime
  USEIN("temp1")

  事件办理

  在一些庞大的使用中,常常会有一项操纵影响几个表的情形。就客户端来讲,发送到远程数据库的数据变化大概来历良多:表缓冲的多行纪录的变化,行缓冲的单行纪录变更,和前文我们演示的间接用SQL语句传送的数据保护,各式各样……如何把这些更新举动把持在一个事件中呢!要末一同乐成,要末一同回滚。
  cSQL="DELETEFROMCUSTOMERSswheresCUSTOMERID=BLAUS"+CHR(10)
  cSQL=cSQL+"INSERTCUSTOMERS(CUSTOMERID,COMPANYNAME)VALUES(TEST1,这是一个测试!)"
  SQLSETPROP(CON,"Transactions",2)&&&&入手下手一个事件
  IRETURN=SQLEXEC(CON,cSQL)
  IFIRETURN=1
  SQLCOMMIT(CON)&&&&事件托付
  ELSE
  SQLROLLBACK(CON)&&&&事件回滚
  ENDIF
  SQLSETPROP(CON,"Transactions",1)&&&&从头回到主动事件处置形态
  &&&&就本例而言,“DELETEFROMCUSTOMERSswheresCUSTOMERID=BLAUS”老是不克不及实行的,SQLServer会前往堕落展现:
  &&&&DELETEstatementconflictedwithCOLUMNREFERENCEconstraintFK_Orders_Customers.
  &&&&TheconflictoccurredindatabaseNorthwind,tableOrders,columnCustomerID.
  &&&&以是这笔事件老是被回滚的!!
  从例程中能够看到,我们开启的事件实际上是针对“毗连”的,也就是说经由过程该“毗连”的一切数据更新都包括于事件中,直到事件被回滚或托付。
  SQLSETPROP(CON,"Transactions",2),实际上是开启了野生事件处置,也就是说必需由用户明白地给出托付大概回滚指令,事件才会停止。以是笔者觉得:完成一笔事件今后,应实行SQLSETPROP(CON,"Transactions",1)将“毗连”的事件形式设为默许的“主动”,如许能够避免用户堕入未知的事件中往。
  SPT的基础操纵还不止这些,今后我们还会为读者伴侣先容其他一些基础操纵。假如伴侣们能把握这些基础操纵,就可以编写不错的C/S程序了。固然本文是用SQLServer作为远程数据库,可是假如你利用DB2和Oracle等,在VFP中也能够举行一样的处置。
  本文入手下手已提到VFP在这方面的内容很普遍,寥寥千言固然不克不及尽言,有乐趣的伴侣能够往会见www.boeworks.com,以便查阅更多的内容。OK,但愿无机会与人人一同会商这方面的成绩。
你不用花费很多时间和金钱来培训现有的职工,或者去花大价钱雇用那些拥有各种证书的开发者。因为MySQL的维护和管理在很大程度上是“傻瓜型”的。

爱飞 发表于 2015-1-19 18:52:23

多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油

若天明 发表于 2015-1-25 21:00:41

其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。

兰色精灵 发表于 2015-2-4 01:42:36

数据库物理框架没有变动undo和redo都放在数据库得transaction中,个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个数据库,可能能在一定程度上避免I/O效率问题。

柔情似水 发表于 2015-2-9 09:15:22

另一个是把SQL语句写到服务器端,就是所谓的SP(存储过程);

小女巫 发表于 2015-2-27 05:10:25

另一个是把SQL语句写到服务器端,就是所谓的SP(存储过程);

愤怒的大鸟 发表于 2015-3-8 21:52:56

一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。

飘灵儿 发表于 2015-3-16 15:23:29

习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQLServerManagementStudio的朋友使用。

海妖 发表于 2015-3-22 23:24:51

而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。
页: [1]
查看完整版本: MYSQL编程:VFP与SQL远程异构数据库