将VFP数据库表升迁为SQL Server数据库表后,以SQL远程视图为数据源,运行VFP表单时遇到的问题如何解决?

时间:2021-01-17 13:26:00
    我用VFP8.0为商店设计了商品进销存运行软件,但在实际操作中,经常会出现由于突然停电或死机等原因而造成表损坏,有的表损坏后很难修复,因此决定将原VFP数据库表升迁为SQL Server数据库表,再以SQL Server数据库表为数据源在VFP中建立远程视图,再运行VFP表单。但在运行VFP表单时遇到了以下问题:
    1、dbf表升迁为SQL表后,原日期型字段被转变为日期时间型(datetime),如何在SQL表中仍然设置为日期型?
    2、在VFP8.0中可以为所运行的dbf表设置数据工作期(vue文件),但却不能为以SQL数据库表为数据源的远程视图设计数据工作期(vue文件),是否可以在VFP8.0中设置以SQL远程视图为数据源的数据工作期?
    3、在以SQL远程视图为数据源运行VFP表单时,可以阅读数据,也可以对远程视图表中的原有数据进行修改、删除行操作,但对远程视图表增添空白行记录或删除所增添的空白行记录时却不能操作,出现了出错提示:“更新冲突”或“不能从视图中插入一个空行到其基表”。(说明:已在SQL表中将所有字段设置为允许null值,并增设了一个递增值为1的“序号”标识列,并在远程视图的“更新条件”中将该列设置为关键字段。)如何在以SQL远程视图为数据源运行VFP表单时正确进行增添行、删除行操作?
    敬请电脑专家帮助解决以上问题,不胜感激!

34 个解决方案

#1


1、dbf表升迁为SQL表后,原日期型字段被转变为日期时间型(datetime),如何在SQL表中仍然设置为日期型?

根据习惯,一般用日期型好一些,也有人喜欢用字符型

    2、在VFP8.0中可以为所运行的dbf表设置数据工作期(vue文件),
但却不能为以SQL数据库表为数据源的远程视图设计数据工作期(vue文件),是否可以在VFP8.0中设置以SQL远程视图为数据源的数据工作期?
 为什么要这样设计?直接用远程视图不行?

    3、在以SQL远程视图为数据源运行VFP表单时,可以阅读数据,也可以对远程视图表中的原有数据进行修改、删除行操作,但对远程视图表增添空白行记录或删除所增添的空白行记录时却不能操作,出现了出错提示:“更新冲突”或“不能从视图中插入一个空行到其基表”。(说明:已在SQL表中将所有字段设置为允许null值,并增设了一个递增值为1的“序号”标识列,并在远程视图的“更新条件”中将该列设置为关键字段。)如何在以SQL远程视图为数据源运行 VFP表单时正确进行增添行、删除行操作?

SQLSERVER表要有主键,即将自增字段设为主键

#2


1、改为字符型或取出临时表后再Ttod(日期时间型字段)。

2、3、
请参考:

http://topic.csdn.net/u/20081023/20/357912ac-3a16-42f9-8fd0-030c2a148ec0.html?seed=484906614

#3


为什么在SQL表中设置有默认值或具有递增值标识列的字段,在VFP8.0远程视图上,当增添一行空白记录时,有关字段不能显示默认值而只显示空值,(只有当关闭远程视图后再次打开远程视图时有关字段才显示默认值),而在远程视图中增添二行空白记录时,立即显示“不能从视图中插入一个空行到其基表”的出错信息?敬向电脑专家请教,如何解决这一问题?

#4


在VFP8.0远程视图上,当增添一行空白记录时,有关字段不能显示默认值而只显示空值:
在GRID中还是程序中?

#5


引用 3 楼 ZJM4862915 的回复:
为什么在SQL表中设置有默认值或具有递增值标识列的字段,在VFP8.0远程视图上,当增添一行空白记录时,有关字段不能显示默认值而只显示空值,(只有当关闭远程视图后再次打开远程视图时有关字段才显示默认值),而在远程视图中增添二行空白记录时,立即显示“不能从视图中插入一个空行到其基表”的出错信息?敬向电脑专家请教,如何解决这一问题?


你在VFP添加一行,更新后,SQL端自动生成标识,然后你再重新取回数据(或叫刷新视图 Requery("视图名"))才能看到。

#6


是在VFP8.0的表单GRID中,当按表单中的命令“增添纪录”(该命令框的click事件编程为:APPEND BLANK),在表单中能显示空白行,但有关字段不能显示默认值而只显示空值。

#7


在VFP8.0远程视图上,当增添一行空白记录时,有关字段不能显示默认值而只显示空值: 
应该是VFP将数据在本地操作,而不是对SQLSERVER表进行操作,只有更新后,将数据才存入SQLSERVER表中。

#8


测试了一下,确实是这样,感觉是VFP将数据从SQLSERVER中取出,
当作CURSOR操作,因为不是本地的物理表,有一些属性不支持,
如默认值、自增等等,待存入SQLSERVER表后,SQLSERVER表
自动生成默认值、自增等等,这里VFP再取出数据就OK了。

#9


在ACCESS中用链接表测试了一下,同样的问题,要关闭后,再打开链接表,
数据才正确。

#10


呵呵,自己的表与别人的表的差别

#11


这个问题就是这样

只有增加记录时,除了这个标识字段外,都写入数据,然后更新到后台,最后再Requery()取回数据,并将记录行定位到新增的记录上。

#12


更新到后台后,由SQLSERVER处理,生成自增、默认值、检验字段的
有效性、主键、外键等等,如没有问题,则生成数据,否则提示
有问题。

#13


apple_8180十豆三专家:
十分感谢您的热心指导,您的渊博的知识、真诚的帮助、无私的奉献让我深受感动,值得我们大家学习。
很不好意思又要麻烦您,向您请教几个问题:
1、以SQL数据库远程视图运行VFP8.0表单,会不会也发生因突然停电、死机等原因坏表?我自2004年就开始钻研VFP编程,并为商店设计了商品进销存管理软件,在部分商店安装该软件后,运行总体还好,但总会经常发生有的商店因突然停电、死机等原因坏表,而且有的坏表很难修复,尤其发生在当使用insert或append from 命令向某一表中成批添加数据时发生突然停电或死机,会在表中添入很多异常数据与乱码,造成表数据显示紊乱。对这个问题,在VFP中好像找不到好的根本解决办法(突然停电可以通过安装不间断电源来解决,但各种原因的死机却不可避免)。因此,我*决定将VFP表升迁为SQL数据库表,想通过SQL远程视图来运行VFP表单,或干脆放弃VFP编程,而改钻研VB.NET编程,请问专家,我这种思路是否正确?您的意见呢?
2、在VFP8.0中,当需要同时打开数十个dbf表时,可以设置数据工作期(VUE文件),只要运行VUE文件就可以同时打开数十个dbf表;而如果需要打开数十个远程视图时,是否也可以设置类似的数据工作期?
3、对远程视图表增添多条记录或删除所增添的记录时经常会出现出错提示:“更新冲突”或“不能从视图中插入一个空行到其基表”,这时需要先用Requery()命令刷新视图从SQL表中重新取回数据,如果每增加一行记录都要执行一次Requery()命令,这会不会影响运行速度?
4、在SQL表中能不能设置日期型字段,为什么dbf表升迁后只有日期时间型字段?在SQL远程视图中取出的日期时间型字段,如何Ttod(日期时间型字段)让表单表格中显示出来的数据是日期型的?

#14


1、使用临时表+打开表缓冲+UPS;
3、除了使用自己的DbF外,没有办法,因为那是别人的表,有些属性在VFP中
不支持;
4、SQLERVER有日期型字段类型。

#15


1、用 SQL Server 肯定要比用 DBF 安全的多,你说的坏表现象也会大大改善(不是100%解决,但我目前没有发现 SQL Server 因为掉电、异常退出等坏掉,但 DBF 是碰到过)

2、在不同工作区打开社图即可。不过不建议打开太多,影响性能。

3、一般这样,更新(增加、修改、删除)前不执行 Requery() ,如果更新失败后或更新成功再 Requery() 来刷新本地视图。

4、SQL Server 中没有纯日期型,都带有时间,SmallDatatime也是,所以我用 SQL Server 时都用字符型来存储日期(相信有很多人也这么用,因为这样可以省去很多麻烦,例如 SQL Server 的空日期在 VFP 显示为 1900-01-01 00:00:00,用字符型就不会这样)
   日期型,我用10位字符型,日期时间型,我用19位字符型。

#16


1、用 SQL Server 肯定要比用 DBF 安全的多,你说的坏表现象也会大大改善(不是100%解决,但我目前没有发现 SQL Server 因为掉电、异常退出等坏掉,但 DBF 是碰到过)

呵呵,看来apple_8180对SQLSERVER有信心啊,从稳定上看,
ORACEL>SYBASE>MYSQL>SQLSERVER,SQLSERVER表在掉电情况下,发生
坏表、掉记录的现象是有的,从理论上讲,没有哪种数据库能够在掉电情况避免
坏表、掉记录,所以服务器+UPS是首选。

#17


引用 16 楼 wwwwb 的回复:
1、用 SQL Server 肯定要比用 DBF 安全的多,你说的坏表现象也会大大改善(不是100%解决,但我目前没有发现 SQL Server 因为掉电、异常退出等坏掉,但 DBF 是碰到过) 

呵呵,看来apple_8180对SQLSERVER有信心啊,从稳定上看, 
ORACEL>SYBASE>MYSQL>SQLSERVER,SQLSERVER表在掉电情况下,发生 
坏表、掉记录的现象是有的,从理论上讲,没有哪种数据库能够在掉电情况避免 
坏表、掉记录,所以服务器+UPS是首选。


不是有信心,是用的少,SQL Server 目前没有碰到,ORACEL>SYBASE>MYSQL 不才,不常用,所以更没机会碰到。

还是那句,用 SQL Server 会大大改善坏表问题,不是100%解决,谁的数据库也不敢说100%解决

#18


对,所以服务器+UPS是首选

#19


apple_8180十豆三专家: 
十分感谢您的指导!
引用您的话:“一般这样,更新(增加、修改、删除)前不执行 Requery() ,如果更新失败后或更新成功再 Requery() 来刷新本地视图”
而我遇到的问题是:对远程视图表增添1条以上的记录时或删除所增添的记录时,会立即出现出错提示:“更新冲突”或“不能从视图中插入一个空行到其基表”,而一旦出现“更新冲突”出错提示后,就不能再执行Requery() 命令,因此必须要先用Requery()命令刷新视图后再执行增加、删除命令,如果每增加一行记录或删除一条记录都要执行一次Requery()命令,这会不会影响运行速度? 有没有更好的方法?敬请您指导。

#20


那可能你用的是行缓冲,而不是表缓冲。

CursorSetProp("Buffering",5,"视图名")  &&表缓冲

仔细看一下你原来帖子的8-10楼回复。最好按照做做试试就更好了。

http://topic.csdn.net/u/20081001/08/aa4b2ecf-ce26-4598-91bb-3f7e17939606.html

#21


我的那些子好像没有批量多条记录的操作,但肯定也是可行的,因为我有过批量修改,是可以更新的。

#22


apple_8180十豆三专家: 
十分感谢您的指导! 
用表缓冲CursorSetProp("Buffering",5,"视图名")设置后,对远程视图表增添多条记录时或删除所增添的记录时,不会出现出错提示,但关闭视图前如果不执行Requery()命令刷新视图,则关闭后再次打开该视图后发现所增添的记录没有被保存;但如果在关闭视图前执行Requery()命令时,又发现出错提示:“表缓冲区含有不能予以实现的修改”,因而不能执行Requery()命令刷新视图。敬请指导如何解决这一问题?

#23


测试了一下:
在VFP中APPE BLAN->存入SQLSERVER->VFP Requery()->取出记录,
如果是自增,可以用SELECT @@IDENTITY取得最新插入的ID,对
字段修改->再存入SQLSERVER

#24


引用 22 楼 ZJM4862915 的回复:
apple_8180十豆三专家: 
十分感谢您的指导! 
用表缓冲CursorSetProp("Buffering",5,"视图名")设置后,对远程视图表增添多条记录时或删除所增添的记录时,不会出现出错提示,但关闭视图前如果不执行Requery()命令刷新视图,则关闭后再次打开该视图后发现所增添的记录没有被保存;但如果在关闭视图前执行Requery()命令时,又发现出错提示:“表缓冲区含有不能予以实现的修改”,因而不能执行Requery()命令刷新视图。敬请指导如…


你增加完数据的没有保存吗?

帖一下你的保存代码

#25


引用 22 楼 ZJM4862915 的回复:
apple_8180十豆三专家:
十分感谢您的指导!
用表缓冲CursorSetProp("Buffering",5,"视图名")设置后,对远程视图表增添多条记录时或删除所增添的记录时,不会出现出错提示,但关闭视图前如果不执行Requery()命令刷新视图,则关闭后再次打开该视图后发现所增添的记录没有被保存;但如果在关闭视图前执行Requery()命令时,又发现出错提示:“表缓冲区含有不能予以实现的修改”,因而不能执行Requery()命令刷新视图。敬请指导如何…

要先存入SQLSEVER表,再取出,字段中就有相应的值了,这时再对记录进行修改,再
存入。

#26


apple_8180十豆三专家: 
在商品销售表单中:
1、在表单LOAD事件代码编写:
USE 商品进销存SQL数据库!表商品销售 IN 0
CursorSetProp("Buffering",5,"表商品销售") 
2、在表单中的“增添销售记录”命令框的CLICK事件代码编写:
select表商品销售
GO bottom
bh=编号
APPEND BLANK
REPLACE 编号 with bh+1
3、在表单中的“删除销售记录”命令框的CLICK事件代码编写:
select 表商品销售
DELETE
SET FILTER TO !DELETED() 
4、在表单中的“确认记录”命令框的CLICK事件代码编写:
Requery("表商品销售")
5、在表单中的“关闭”命令框的CLICK事件中代码编写:
select 表商品销售
use
在实际运行表单时,产生以下问题:
1、在对表单表格中通过增添、删除、编辑记录后,再按确认记录按钮(执行Requery()命令)时,出现:“表缓冲区含有不能予以实现的修改”出错提示不能执行命令。
2、如不按确认记录按钮,直接按“关闭”按钮关闭表单后,再次打开表单时,发现所输入的数据没有被保存,已全部丢失。
敬请指导如何解决?

#27


你到底是用的SQL Server数据库,还是VFP的DBC+DBF?

#28


在你发出增添后,更新SQLSERVER表,再Requery,修改记录内容;bh是自增?

#29


apple_8180十豆三专家: 
我用的是VFP的DBC+视图,其中视图均是SQL数据源视图。命令“USE 商品进销存SQL数据库!表商品销售 IN 0”中的“商品进销存SQL数据库”是在VFP中建立的数据库名,“表商品销售”是以SQL数据源建立的视图名,该视图的数据源来自SQL“商品销售表”,该SQL表具有字段:编号、销售日期、商品名、规格、批号、厂牌、购进价、销售价、销售量、行号(递增值为1的标识列),其中除行号(标识列)外所有字段均设置允许null值,并以行号(标识列)为关键字段建立了VFP视图:“表商品销售”。
我现在要问的是:是否在该视图中每增加一条记录都必须立即用Requery()命令刷新视图,如果这样操作速度是否很慢?能否在对视图进行增添、删除、编辑很多记录后,再执行Requery()命令一次性刷新视图,但这样操作又出现“表缓冲区含有不能予以实现的修改”出错提示不能执行命令。敬请指导如何解决?

#30


因为你用了自增字段,所以增加后(APPE BLAN),必须Requery()
才能得到新的自增字段值以及有默认值的字段的值。

删除、编辑:不知道字段是否有有效性设置,如果没有且没有涉及到主键,可以执行Requery()命令一次性刷新视图,如果有,只有删除、编辑一条记录都必须立即用Requery()。

#31


我一般这样
增加、修改或删除后(一条或多条)
提交修改 TABLEUPDATE(1,.T.) 

提交成功后,Requery() (原因有2:1、如果远程表有自增量字段,Requery()后临时得到了这个字段值。2、如果有其他人修改了远程表,Requery()才能保证下次提交成功)

提交失败后,要回滚数据TABLEREVERT(.T.),然后再Requery() (回滚数据的目的是放弃对临时表的修改,因为提交失败的原因可能是有人已经修改远程表,所以要Requery()刷新一下视图)

#32


apple_8180十豆三专家: 
十分感谢您的热心指导! 
我还有一个问题,在以SQL表为数据源的视图显示的表单表格中,应如何设置,可以使SQL表中日期时间型字段在表单表格中只显示日期而不显示时间?

#33


CONVERT ( char(10), ytd_sale, 120)

#34


本帖最后由 apple_8180 于 2009-05-04 11:40:42 编辑
在21楼给出的例子中 有相关视图设置代码,例如这样:

ThisView="你的视图名"
DBSetProp(ThisView+". 日期型字段","Field","DataType"," D")
DBSetProp(ThisView+". 日期型字段","Field","UpdateName"," dbo.SQL表.日期时间型字段")
DBSetProp(ThisView+". 日期型字段","Field","KeyField",.F.)
DBSetProp(ThisView+". 日期型字段","Field","Updatable",.T.)


在SQL Server中我一直都用字符型来存储日期,不用 Datetime 或 SmallDatetime

#1


1、dbf表升迁为SQL表后,原日期型字段被转变为日期时间型(datetime),如何在SQL表中仍然设置为日期型?

根据习惯,一般用日期型好一些,也有人喜欢用字符型

    2、在VFP8.0中可以为所运行的dbf表设置数据工作期(vue文件),
但却不能为以SQL数据库表为数据源的远程视图设计数据工作期(vue文件),是否可以在VFP8.0中设置以SQL远程视图为数据源的数据工作期?
 为什么要这样设计?直接用远程视图不行?

    3、在以SQL远程视图为数据源运行VFP表单时,可以阅读数据,也可以对远程视图表中的原有数据进行修改、删除行操作,但对远程视图表增添空白行记录或删除所增添的空白行记录时却不能操作,出现了出错提示:“更新冲突”或“不能从视图中插入一个空行到其基表”。(说明:已在SQL表中将所有字段设置为允许null值,并增设了一个递增值为1的“序号”标识列,并在远程视图的“更新条件”中将该列设置为关键字段。)如何在以SQL远程视图为数据源运行 VFP表单时正确进行增添行、删除行操作?

SQLSERVER表要有主键,即将自增字段设为主键

#2


1、改为字符型或取出临时表后再Ttod(日期时间型字段)。

2、3、
请参考:

http://topic.csdn.net/u/20081023/20/357912ac-3a16-42f9-8fd0-030c2a148ec0.html?seed=484906614

#3


为什么在SQL表中设置有默认值或具有递增值标识列的字段,在VFP8.0远程视图上,当增添一行空白记录时,有关字段不能显示默认值而只显示空值,(只有当关闭远程视图后再次打开远程视图时有关字段才显示默认值),而在远程视图中增添二行空白记录时,立即显示“不能从视图中插入一个空行到其基表”的出错信息?敬向电脑专家请教,如何解决这一问题?

#4


在VFP8.0远程视图上,当增添一行空白记录时,有关字段不能显示默认值而只显示空值:
在GRID中还是程序中?

#5


引用 3 楼 ZJM4862915 的回复:
为什么在SQL表中设置有默认值或具有递增值标识列的字段,在VFP8.0远程视图上,当增添一行空白记录时,有关字段不能显示默认值而只显示空值,(只有当关闭远程视图后再次打开远程视图时有关字段才显示默认值),而在远程视图中增添二行空白记录时,立即显示“不能从视图中插入一个空行到其基表”的出错信息?敬向电脑专家请教,如何解决这一问题?


你在VFP添加一行,更新后,SQL端自动生成标识,然后你再重新取回数据(或叫刷新视图 Requery("视图名"))才能看到。

#6


是在VFP8.0的表单GRID中,当按表单中的命令“增添纪录”(该命令框的click事件编程为:APPEND BLANK),在表单中能显示空白行,但有关字段不能显示默认值而只显示空值。

#7


在VFP8.0远程视图上,当增添一行空白记录时,有关字段不能显示默认值而只显示空值: 
应该是VFP将数据在本地操作,而不是对SQLSERVER表进行操作,只有更新后,将数据才存入SQLSERVER表中。

#8


测试了一下,确实是这样,感觉是VFP将数据从SQLSERVER中取出,
当作CURSOR操作,因为不是本地的物理表,有一些属性不支持,
如默认值、自增等等,待存入SQLSERVER表后,SQLSERVER表
自动生成默认值、自增等等,这里VFP再取出数据就OK了。

#9


在ACCESS中用链接表测试了一下,同样的问题,要关闭后,再打开链接表,
数据才正确。

#10


呵呵,自己的表与别人的表的差别

#11


这个问题就是这样

只有增加记录时,除了这个标识字段外,都写入数据,然后更新到后台,最后再Requery()取回数据,并将记录行定位到新增的记录上。

#12


更新到后台后,由SQLSERVER处理,生成自增、默认值、检验字段的
有效性、主键、外键等等,如没有问题,则生成数据,否则提示
有问题。

#13


apple_8180十豆三专家:
十分感谢您的热心指导,您的渊博的知识、真诚的帮助、无私的奉献让我深受感动,值得我们大家学习。
很不好意思又要麻烦您,向您请教几个问题:
1、以SQL数据库远程视图运行VFP8.0表单,会不会也发生因突然停电、死机等原因坏表?我自2004年就开始钻研VFP编程,并为商店设计了商品进销存管理软件,在部分商店安装该软件后,运行总体还好,但总会经常发生有的商店因突然停电、死机等原因坏表,而且有的坏表很难修复,尤其发生在当使用insert或append from 命令向某一表中成批添加数据时发生突然停电或死机,会在表中添入很多异常数据与乱码,造成表数据显示紊乱。对这个问题,在VFP中好像找不到好的根本解决办法(突然停电可以通过安装不间断电源来解决,但各种原因的死机却不可避免)。因此,我*决定将VFP表升迁为SQL数据库表,想通过SQL远程视图来运行VFP表单,或干脆放弃VFP编程,而改钻研VB.NET编程,请问专家,我这种思路是否正确?您的意见呢?
2、在VFP8.0中,当需要同时打开数十个dbf表时,可以设置数据工作期(VUE文件),只要运行VUE文件就可以同时打开数十个dbf表;而如果需要打开数十个远程视图时,是否也可以设置类似的数据工作期?
3、对远程视图表增添多条记录或删除所增添的记录时经常会出现出错提示:“更新冲突”或“不能从视图中插入一个空行到其基表”,这时需要先用Requery()命令刷新视图从SQL表中重新取回数据,如果每增加一行记录都要执行一次Requery()命令,这会不会影响运行速度?
4、在SQL表中能不能设置日期型字段,为什么dbf表升迁后只有日期时间型字段?在SQL远程视图中取出的日期时间型字段,如何Ttod(日期时间型字段)让表单表格中显示出来的数据是日期型的?

#14


1、使用临时表+打开表缓冲+UPS;
3、除了使用自己的DbF外,没有办法,因为那是别人的表,有些属性在VFP中
不支持;
4、SQLERVER有日期型字段类型。

#15


1、用 SQL Server 肯定要比用 DBF 安全的多,你说的坏表现象也会大大改善(不是100%解决,但我目前没有发现 SQL Server 因为掉电、异常退出等坏掉,但 DBF 是碰到过)

2、在不同工作区打开社图即可。不过不建议打开太多,影响性能。

3、一般这样,更新(增加、修改、删除)前不执行 Requery() ,如果更新失败后或更新成功再 Requery() 来刷新本地视图。

4、SQL Server 中没有纯日期型,都带有时间,SmallDatatime也是,所以我用 SQL Server 时都用字符型来存储日期(相信有很多人也这么用,因为这样可以省去很多麻烦,例如 SQL Server 的空日期在 VFP 显示为 1900-01-01 00:00:00,用字符型就不会这样)
   日期型,我用10位字符型,日期时间型,我用19位字符型。

#16


1、用 SQL Server 肯定要比用 DBF 安全的多,你说的坏表现象也会大大改善(不是100%解决,但我目前没有发现 SQL Server 因为掉电、异常退出等坏掉,但 DBF 是碰到过)

呵呵,看来apple_8180对SQLSERVER有信心啊,从稳定上看,
ORACEL>SYBASE>MYSQL>SQLSERVER,SQLSERVER表在掉电情况下,发生
坏表、掉记录的现象是有的,从理论上讲,没有哪种数据库能够在掉电情况避免
坏表、掉记录,所以服务器+UPS是首选。

#17


引用 16 楼 wwwwb 的回复:
1、用 SQL Server 肯定要比用 DBF 安全的多,你说的坏表现象也会大大改善(不是100%解决,但我目前没有发现 SQL Server 因为掉电、异常退出等坏掉,但 DBF 是碰到过) 

呵呵,看来apple_8180对SQLSERVER有信心啊,从稳定上看, 
ORACEL>SYBASE>MYSQL>SQLSERVER,SQLSERVER表在掉电情况下,发生 
坏表、掉记录的现象是有的,从理论上讲,没有哪种数据库能够在掉电情况避免 
坏表、掉记录,所以服务器+UPS是首选。


不是有信心,是用的少,SQL Server 目前没有碰到,ORACEL>SYBASE>MYSQL 不才,不常用,所以更没机会碰到。

还是那句,用 SQL Server 会大大改善坏表问题,不是100%解决,谁的数据库也不敢说100%解决

#18


对,所以服务器+UPS是首选

#19


apple_8180十豆三专家: 
十分感谢您的指导!
引用您的话:“一般这样,更新(增加、修改、删除)前不执行 Requery() ,如果更新失败后或更新成功再 Requery() 来刷新本地视图”
而我遇到的问题是:对远程视图表增添1条以上的记录时或删除所增添的记录时,会立即出现出错提示:“更新冲突”或“不能从视图中插入一个空行到其基表”,而一旦出现“更新冲突”出错提示后,就不能再执行Requery() 命令,因此必须要先用Requery()命令刷新视图后再执行增加、删除命令,如果每增加一行记录或删除一条记录都要执行一次Requery()命令,这会不会影响运行速度? 有没有更好的方法?敬请您指导。

#20


那可能你用的是行缓冲,而不是表缓冲。

CursorSetProp("Buffering",5,"视图名")  &&表缓冲

仔细看一下你原来帖子的8-10楼回复。最好按照做做试试就更好了。

http://topic.csdn.net/u/20081001/08/aa4b2ecf-ce26-4598-91bb-3f7e17939606.html

#21


我的那些子好像没有批量多条记录的操作,但肯定也是可行的,因为我有过批量修改,是可以更新的。

#22


apple_8180十豆三专家: 
十分感谢您的指导! 
用表缓冲CursorSetProp("Buffering",5,"视图名")设置后,对远程视图表增添多条记录时或删除所增添的记录时,不会出现出错提示,但关闭视图前如果不执行Requery()命令刷新视图,则关闭后再次打开该视图后发现所增添的记录没有被保存;但如果在关闭视图前执行Requery()命令时,又发现出错提示:“表缓冲区含有不能予以实现的修改”,因而不能执行Requery()命令刷新视图。敬请指导如何解决这一问题?

#23


测试了一下:
在VFP中APPE BLAN->存入SQLSERVER->VFP Requery()->取出记录,
如果是自增,可以用SELECT @@IDENTITY取得最新插入的ID,对
字段修改->再存入SQLSERVER

#24


引用 22 楼 ZJM4862915 的回复:
apple_8180十豆三专家: 
十分感谢您的指导! 
用表缓冲CursorSetProp("Buffering",5,"视图名")设置后,对远程视图表增添多条记录时或删除所增添的记录时,不会出现出错提示,但关闭视图前如果不执行Requery()命令刷新视图,则关闭后再次打开该视图后发现所增添的记录没有被保存;但如果在关闭视图前执行Requery()命令时,又发现出错提示:“表缓冲区含有不能予以实现的修改”,因而不能执行Requery()命令刷新视图。敬请指导如…


你增加完数据的没有保存吗?

帖一下你的保存代码

#25


引用 22 楼 ZJM4862915 的回复:
apple_8180十豆三专家:
十分感谢您的指导!
用表缓冲CursorSetProp("Buffering",5,"视图名")设置后,对远程视图表增添多条记录时或删除所增添的记录时,不会出现出错提示,但关闭视图前如果不执行Requery()命令刷新视图,则关闭后再次打开该视图后发现所增添的记录没有被保存;但如果在关闭视图前执行Requery()命令时,又发现出错提示:“表缓冲区含有不能予以实现的修改”,因而不能执行Requery()命令刷新视图。敬请指导如何…

要先存入SQLSEVER表,再取出,字段中就有相应的值了,这时再对记录进行修改,再
存入。

#26


apple_8180十豆三专家: 
在商品销售表单中:
1、在表单LOAD事件代码编写:
USE 商品进销存SQL数据库!表商品销售 IN 0
CursorSetProp("Buffering",5,"表商品销售") 
2、在表单中的“增添销售记录”命令框的CLICK事件代码编写:
select表商品销售
GO bottom
bh=编号
APPEND BLANK
REPLACE 编号 with bh+1
3、在表单中的“删除销售记录”命令框的CLICK事件代码编写:
select 表商品销售
DELETE
SET FILTER TO !DELETED() 
4、在表单中的“确认记录”命令框的CLICK事件代码编写:
Requery("表商品销售")
5、在表单中的“关闭”命令框的CLICK事件中代码编写:
select 表商品销售
use
在实际运行表单时,产生以下问题:
1、在对表单表格中通过增添、删除、编辑记录后,再按确认记录按钮(执行Requery()命令)时,出现:“表缓冲区含有不能予以实现的修改”出错提示不能执行命令。
2、如不按确认记录按钮,直接按“关闭”按钮关闭表单后,再次打开表单时,发现所输入的数据没有被保存,已全部丢失。
敬请指导如何解决?

#27


你到底是用的SQL Server数据库,还是VFP的DBC+DBF?

#28


在你发出增添后,更新SQLSERVER表,再Requery,修改记录内容;bh是自增?

#29


apple_8180十豆三专家: 
我用的是VFP的DBC+视图,其中视图均是SQL数据源视图。命令“USE 商品进销存SQL数据库!表商品销售 IN 0”中的“商品进销存SQL数据库”是在VFP中建立的数据库名,“表商品销售”是以SQL数据源建立的视图名,该视图的数据源来自SQL“商品销售表”,该SQL表具有字段:编号、销售日期、商品名、规格、批号、厂牌、购进价、销售价、销售量、行号(递增值为1的标识列),其中除行号(标识列)外所有字段均设置允许null值,并以行号(标识列)为关键字段建立了VFP视图:“表商品销售”。
我现在要问的是:是否在该视图中每增加一条记录都必须立即用Requery()命令刷新视图,如果这样操作速度是否很慢?能否在对视图进行增添、删除、编辑很多记录后,再执行Requery()命令一次性刷新视图,但这样操作又出现“表缓冲区含有不能予以实现的修改”出错提示不能执行命令。敬请指导如何解决?

#30


因为你用了自增字段,所以增加后(APPE BLAN),必须Requery()
才能得到新的自增字段值以及有默认值的字段的值。

删除、编辑:不知道字段是否有有效性设置,如果没有且没有涉及到主键,可以执行Requery()命令一次性刷新视图,如果有,只有删除、编辑一条记录都必须立即用Requery()。

#31


我一般这样
增加、修改或删除后(一条或多条)
提交修改 TABLEUPDATE(1,.T.) 

提交成功后,Requery() (原因有2:1、如果远程表有自增量字段,Requery()后临时得到了这个字段值。2、如果有其他人修改了远程表,Requery()才能保证下次提交成功)

提交失败后,要回滚数据TABLEREVERT(.T.),然后再Requery() (回滚数据的目的是放弃对临时表的修改,因为提交失败的原因可能是有人已经修改远程表,所以要Requery()刷新一下视图)

#32


apple_8180十豆三专家: 
十分感谢您的热心指导! 
我还有一个问题,在以SQL表为数据源的视图显示的表单表格中,应如何设置,可以使SQL表中日期时间型字段在表单表格中只显示日期而不显示时间?

#33


CONVERT ( char(10), ytd_sale, 120)

#34


本帖最后由 apple_8180 于 2009-05-04 11:40:42 编辑
在21楼给出的例子中 有相关视图设置代码,例如这样:

ThisView="你的视图名"
DBSetProp(ThisView+". 日期型字段","Field","DataType"," D")
DBSetProp(ThisView+". 日期型字段","Field","UpdateName"," dbo.SQL表.日期时间型字段")
DBSetProp(ThisView+". 日期型字段","Field","KeyField",.F.)
DBSetProp(ThisView+". 日期型字段","Field","Updatable",.T.)


在SQL Server中我一直都用字符型来存储日期,不用 Datetime 或 SmallDatetime