资源描述:
《VFP+SQLSERVER实例讲解4》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、VFP+SQLSERVER实例讲解4[日期:2007-06-21]来源: 作者:[字体:大中小]"KeyField", .T.)DBSETPROP("VCustomers.CompanyName", "Field", "Updatable", .T.)DBSETPROP("VCustomers.Phone", "Field", "Updatable", .T.)DBSETPROP("VCustomers", "View", "SendUpdates", .T.)DBSETPROP("VCustomers", "View",
2、 "WhereType", 3)*设定更新冲突解决方案为“关键字和已更新字段”DBSETPROP("VCustomers", "View", "UpdateType", 1)*进程一USE VCustomersBROWSE*将指针停留在第一条记录上,即:CustomerID='ALFKI'REPLACE Phone with '123456'*离开Visual foxpro,千万别移动记录指针进程二使用 sql Server 的 Enterprise Manager 打开 Customers表,把指针停在第一条记录上,修改
3、Phone的值为'00000',移动指针到下一条记录。回到Visual FoxPro,移动指针,您会看到图9:图 9.更新冲突按“还原”按钮。试验结束。仔细想想,您就会明白什么是更新冲突了。上例中,如果我们设定“关键字”方式检测更新冲突:DBSETPROP("VCustomers", "View", "WhereType", 1)其他均按原先步骤进行,您会发现没有更新冲突产生。因为Visual FoxPro仅检测关键字是否变化,这里进程一、二都没有修改关键字,当然不会有更新冲突。上例中,如果我们设定“关键字和可更新字段”方
4、式检测更新冲突:DBSETPROP("VCustomers", "View", "WhereType", 2)其他均按原先步骤进行,这时会有更新冲突产生。因为Visual FoxPro不仅检测关键字是否变化,还要检测所有的可更新字段字段(本例是所有字段)是否发生变化,这里进程二先进程一修改了可更新字段 Phone,进程一当然会有更新冲突发生。如果使用 SQL Server 的 Profiler 程序您能更好的了解以上内容:图 10。 SQL Server 的 Profiler 程序1.使用“关键字段”冲突检测方式,发送更新
5、时,Visual FoxPro 自动生成以下语句在 SQL Server 中执行:sp_executesql N'UPDATE dbo.Customers SET Phone=@P1 WHERE CustomerID=@P2', N'@P1 nvarchar(24),@P2 varchar(50)', N'123456 ', 'ALFKI' 可见,UPDATE 的 WHERE 子句只包括关键字段:CustomerID。在Visual FoxPro 缓冲中 CustomerID='ALFKI',Visual FoxPro 就
6、以这个值作为数据源是否发生改变的依据。如果 SQL Server执行这条UPDATE语句时找不到CustomerID='ALFKI'的记录(我们认为是其它用户先期修改了CustomerID)——SQL Server 告诉 Visual FoxPro 更新冲突发生了。 2.使用“关键字和可更新字段”冲突检测方式,发送更新时,Visual FoxPro 自动生成以下语句在 SQL Server 中执行:sp_executesql N'UPDATE dbo.Customers SET Phone=@P1 WHERE Custom
7、erID=@P2 AND CompanyName=@P3 AND Phone=@P4', N'@P1 nvarchar(24),@P2 varchar(50),@P3 nvarchar(40),@P4 nvarchar(24)', N'123456 ', 'ALFKI', N'Alfreds Futterkiste ', N'030-0074321 ' 可见,UPDATE 的 WHERE 子句包括关键字段:CustomerID,和所有可更新字段:CompanyName、Phone。Visual FoxPro 缓冲中Cust
8、omerID='ALFKI'、CompanyName='Alfreds Futterkiste'、Phone='030-0074321',如果 SQL Server执行这条UPDATE语句时找不到(CustomerID='ALFKI' AND CompanyName='Alfreds Futterkis