您现在的位置: 中国男护士网 >> 考试频道 >> 计算机等级 >> 二级辅导 >> VFP >> 辅导 >> 正文    
  VFP配合SQLSERVER开发C/S系统(下) 【注册男护士专用博客】          

VFP配合SQLSERVER开发C/S系统(下)

www.nanhushi.com     佚名   不详 

EndScan

*** 要得到SQL SERVER上某个表的结构,有两种办法,一是运行SQL SERVER自带的系统存储过程。一是运行一个Select命令。

比如要从SQL SERVER得到EMP表的结构

lnReturn=SQLEXEC(连接句柄,"Select Top 0 * From Emp","TmpEmp")

返回的结果都是临时表,是只读的,要想变成可读写的,需要做点小变化:

Select 0
Use DBF("TmpEmp") Again Alias Emp
Use In TmpEmp

现在得到的EMP临时表就是可读写的了。

*注 "Select Top 0 From Emp" 命令在VFP里是错误命令,但SQL SERVER里可以执行.

SPT和使用视图相比,优点是每一步你都清楚自己在做什么,知道为什么命令会出错。缺点是你需要多写命令,多了解SQL SERVER的语法。

***************
谈谈VFP和SQL SERVER搭配做C/S系统 (五) --从VFP控制SQL SERVER事务处理和加锁

**建立与SQL SERVER的连接
lnHandle=SQLConnect("ODBC数据源","用户名","密码")

If lnHandle>0

&& 设置成手工事务处理模式,由代码来控制
= SQLSETPROP(lnSQL_Hand, ’Transactions’, 2)

**下面的命令从EMPPAY里选取记录,并给该表加上独占锁(TABLELOCKX),一直到该事务结束(HOLDLOCK)

ln1=SQLEXEC(lnHandle, "Select * FROM EmppayWITH (TABLOCKX, HOLDLOCK)","Emppay")

**执行其它命令,比如更新数据
ln2=SQLEXEC(lnHandle,"Update PayTotal Set ......")
...
...

**如果所有命令都正确执行了,则
=SQLCOMMIT(lnHandle)

***如果要放弃整个事务处理,用
=SQLROLLBACK(lnHandle)

***关闭连接,事务自动结束,锁也解开
=SQLDISCONNECT(lnHandle)

Else
****连接失败
EndIf

*** SQLSETPROP()函数
这个VFP函数是用来设置当前连接的属性的。 比如上边的手工事务处理。
还有一个比较常用的属性是DISPLOGIN,该属性控制是否显示SQL SERVER的登录表单

第3个参数: 1 - 显示登录表单,如果登录信息(用户名,密码)不完全2 - 总显示登录表单3 - 不显示登录表单

例如:
=SQLSETPROP(lnHandle, "DISPLOGIN",1)

当使用SPT技术时,为节约连接数减少负担,需要经常连接和断开SQL SERVER,有时候你并不希望每次连接都让用户登录,当用户首次登录后,可以把名字和密码存起来,以后的连接可以自动登录了。

***************
谈谈VFP和SQL SERVER搭配做C/S系统 (六) -- SQL SERVER的索引

作为VFP程序员,我们深知索引对表的重要性,好的索引可以大大缩短程序读取数据的时间。
索引对于SQL SERVER数据表来说,同样是很重要的。你可以做个简单的测试。

1. 索引测试

从SQL SERVER程序组里或者ENTERPRISE MANAGER的TOOLS菜单上打开QUERY ANALYZER工具.
连接到你的SERVER后, 选择QUERY菜单上的CURRENT CONNECTION OPTIONS(当前连接选项).

  把SHOW STATS TIME 和SHOW STATS I/O两个选项打勾,然后点OK. 这两个选项将会告诉你命令的运行时间和读写次数.

  如果你的SQL命令里用到多个表,还可以选上QUERY菜单上的SHOW EXECUTION PLAN, 它会告诉你的命令在各各表上所花费的时间.

  选一个没有索引的大小适当的表,然后执行一条Select命令,你会看到运行时间. 比如我用了表CHQ,有将近40万条记录, 执行下面的命令,返回5000多个记录

  select * from Chq where date >=’02/01/2001’ and date<=’02/28/2001’ 

  显示的时间和读写情况: 
  Table ’chq’. Scan count 1, logical reads 13145, physical reads 0, read-ahead reads 13152. 
  SQL Server Execution Times: CPU time = 5781 ms, elapsed time = 23526 ms. 

  然后我在CHQ表上对DATE字段建立索引,再运行相同的Select, 得到如下结果: 
  Table ’chq’. Scan count 1, logical reads 3965, physical reads 14, read-ahead reads 0. 
  SQL Server Execution Times: CPU time = 704 ms, elapsed time = 6432 ms. 

  比较两个结果可以看出, 建立索引后,逻辑读写和预读写次数大大减少, 占用CPU时间从5.781秒减少到了0.704秒, 总运行时间从23.526秒减少到6.432秒 
如果运行更复杂的命令,效果会更加明显. 

  2. 了解SQL SERVER的索引 

  SQL SERVER的数据文件和索引文件都是以页为单位存放的,每页是8K. 相当于把磁盘划分成8K大小的块,以块为单位存放数据.  了解这一点是非常重要的, 它能帮助你理解下面的内容. 

  SQL SERVER的索引有2大类, 

  一类是CLUSTERED(物理索引),每个表只能有一个, 记录在磁盘上存放时完全按照物理索引的顺序. 

  另一类是NONCLUSTERED(逻辑索引), 记录顺序存放在索引表里. 

  不管是哪类索引,只要能到达目的,索引表达式(包含的字段)越简单越有效. 

  什么字段作为物理索引最合适? 

  有两个原则: 一是在根据范围来选择记录时,哪个字段最有效, 二是在往磁盘上写记录是不会引起热点(HOT SPOT).  热点是指,大量读写发生在磁盘的同一区域,引起I/O瓶颈效应,降低运行速度. 

  我们用例子来看看这些原则怎么用.  假如有个单据表, 包含这些字段: 单据号,单据日期,金额,销售地点,已经其它数据.  哪个适合作为物理索引呢? 一般的想法是用没有重复值的字段(相当于VFP里的主键). 

  a. 用单据号, 其实这不是恰当的选择. 因为很少有根据单据的范围来选择记录的, 比如你很少用命令来查询单据号大于或者小于某个值的记录. 而且在输入时,也比较容易产生热点, 因为插入的记录一般都加在表尾,当有大量用户同时输入时,会产生热点. 单据号不符合上面的2条原则.

  b. 用单据日期, 似乎是个比较适当的选择. 因为经常需要用日期范围来选择记录, 但同样会因为大量用户同时输入最新单据而在磁盘上引起热点. 

  c. 用销售地点, 这应该是最恰当的物理索引人选了. 因为我们会经常根据地点来选择记录, 而在同一时刻插入的记录也不太可能来自同一个销售地点,避免了热点. 

  当然,不同的环境下,你的选择可能不同,比如你没有成千上万的用户,就不太需要考虑热点问题. 但要记住, 有唯一值的字段并不是物理索引的最佳选择. 

  3. 选择适当的FillFactor 

  在SQL-Create INDEX命令里,有个FILLFACTOR选项, 这个选项对索引的效率是有很大作用的. 
  FILLFACTOR是指建立索引时, 每一页存放数据的填满程度, 比如100%,表示把索引文件每一页都填满,隐含值是0 (100%). 

  如果你的表经常需要插入记录, 选择适当的FILLFACTOR就很重要了. 如果总是用100%, 当你插入一个新记录时, 由于每页都是满的, 就需要进行分页操作(把当前页分成2页),频繁的分页操作会占用服务器的资源和时间,也降低索引文件的效率. 而如果你的FILLFACTOR不是100%,比如设为80%, 在插入新记录时,由于当前页还有空间, 可以直接加入不需要分页. 当然, FILLFACTOR太低也会降低效率,因为那样的话,页数就多了,搜索数据用的时间长,占用空间也多. 

  如果是只读表,或者插入记录很少的表,用100% FILLFACTOR最好. 

  对于经常插入新记录的表,需要定期重建索引, 因为索引文件随着页数的增加, 效率会越来越低. 因为索引都是树状结构, 当下面的页加得没有规律时, 连接就会变乱, 重建索引可以重新整理树状结构. 

  4. 索引分析工具 

  在QUERY ANALYZER的QUERY菜单里,还有个选项PERFORM INDEX ANALYSIS. 
  在输入你的命令后,选择这一项, SQL SERVER会对你的命令进行分析,然后告诉你建立什么样的索引对当前命令最有利. 
  可以把你程序里常用的命令放到这里进行分析,找出最恰当的索引。

 

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

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

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

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

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