如何在Microsoft Visual FoxPro 9中调用自定义newid()函数并获取返回值?
Visual FoxPro 9中调用存储过程newid()函数的正确方式
问题背景
在Microsoft Visual FoxPro 9的主数据库(Main)存储过程内,有一个用于为新增记录生成唯一ID的自定义函数newid(),代码如下:
function newId parameter thisdbf regional keynm, newkey, cOldSelect, lDone keynm=padr(upper(thisdbf),50) cOldSelect=alias() lDone=.f. do while not lDone select keyvalue from main!idkeys where keyname=keynm into array akey if _tally=0 insert into main!idkeys (keyname) value (keynm) loop endif newkey=akey+1 update main!idkeys set keyvalue=newkey where keyname=keynm and keyvalue=akey if _tally=1 lDone=.t. endif enddo if not empty(cOldSelect) select &cOldSelect else select 0 endif return newkey
该函数原本作为字段默认值调用(如id字段默认值设为newid("TABLENAME")),但直接执行SELECT newid("TABLENAME")时,会抛出**Invalid subscript reference(无效下标引用)**错误。
报错原因
错误出现在newkey=akey+1行:当在VFP的SQL SELECT语句中调用该函数时,SQL的执行上下文与常规程序执行上下文存在差异,导致SELECT ... INTO ARRAY akey语句创建的数组akey无法被正确识别或访问,触发下标引用错误。
正确调用方式
方式1:直接用赋值语句获取返回值
这是最稳妥的方式,避开SQL上下文的限制:
* 确保主数据库已打开 OPEN DATABASE Main local lnNewId lnNewId = newid("TABLENAME") ? lnNewId && 输出生成的新ID
方式2:通过SQL语句调用(需调整写法)
如果必须用SQL语句获取结果,可将函数返回值存入变量后再查询:
OPEN DATABASE Main local lnNewId lnNewId = newid("TABLENAME") SELECT lnNewId AS new_id FROM DummyCursor && DummyCursor为任意已打开的空游标或临时表 * 或者用以下方式创建临时游标返回结果 CREATE CURSOR temp_result (new_id I) INSERT INTO temp_result VALUES (newid("TABLENAME")) SELECT * FROM temp_result
额外注意事项
- 确保主数据库
Main已通过OPEN DATABASE Main命令打开,存储过程会随数据库打开自动加载; - 如果存储过程未自动加载,可执行
SET PROCEDURE TO Main!storedprocs手动加载(storedprocs为存储过程的文件名,若为数据库内嵌存储过程则无需此操作)。
内容的提问来源于stack exchange,提问作者Trock
相关产品推荐
相关产品推荐

