我们的一个系统仍在Visual FoxPro数据库上运行。这是我一生的祸根。
在调查最近的一个错误时,我发现它是由一个命名错误的列引起的。原始DB有一个名为SELECTIONS
的表,其中有一个称为mediumValue
的列,长度为11个字符。该错误是由基于该数据的另一个表将列重命名为mediumValu
引起的。
问题的根源似乎是这样的陈述:
SET DELETED ON
SELECT selections.*;
FROM ;
SELECTIONS;
WHERE
//criteria
INTO TABLE Result.dbf
如果您只是在没有INTO TABLE
的情况下运行select,则该列将显示为mediumValue
。但是对于INTO TABLE
,生成的Result.dbf
表具有名为mediumValu
的列。
我认为这是某种内置的截断,这在任何地方都有记录吗?有什么设置可以替代来修复它吗?
您对外部表的截断是正确的。在VFP中,数据库容器(.dbc)允许表的列名超过"空闲"表(即:不与数据库关联)的默认最大10个字符。因此,最初的11个字符可能是有效的,因为它是数据库容器的一部分。
现在,如果您这样做是为了对程序的另一个区域中的数据进行一些临时处理,那么您可以始终选择
INTO CURSOR C_MyTestResults readwrite
通过这种方式,它是一个内存中的表,并将保留完整的列名长度。READWRITE子句将允许您在工作时对游标数据进行更改,就像它本身也是一个表一样。
我喜欢使用"C_"作为表结果别名的前缀,这样我就知道它是一个"CURSOR"而不是生产表,并且知道我不会根据手头的任务来处理生产数据。
如果需要执行vfp命令select ..into table..
,并且字段名称超过10个字符,则必须使用database
子句。
例如:
SELECT selections.*;
FROM ;
SELECTIONS;
WHERE
//criteria
INTO TABLE Result.dbf DATABASE dbUser
如果你没有数据库(dbUser.dbc),你可以创建它:
create database c:dbUser