如何在VisualFoxPro9中获取newId生成的最新插入记录ID
在Visual FoxPro 9中获取newId()生成的插入记录ID
首先明确:newId()并非VFP原生内置函数,它应该是你数据库中自定义的唯一ID生成函数(比如基于GUID或自定义自增逻辑实现)。这类自定义函数生成的ID,无法用LASTVAL()、SCOPE_IDENTITY()这类针对VFP原生自动增量字段的函数获取,因为这些函数只对VFP原生**自动增量(AutoIncrement)**字段生效。
下面提供几个可行的解决方案:
方案1:插入前预先生成ID
既然newId()是自定义函数,你可以先调用它生成ID,再将该ID与其他字段一同插入记录,这样就能直接拿到目标ID,无需事后查询:
LOCAL lcNewId lcNewId = newId("database name") && 提前生成ID INSERT INTO YourTableName (IdField, OtherField1, OtherField2) ; VALUES (lcNewId, "值1", "值2") && 此时lcNewId就是需要返回给Swagger的ID
这个方法最直接,还能避免并发场景下的ID获取错误(比如同时有其他插入操作时,事后查询可能拿到其他记录的ID)。
方案2:插入后通过唯一字段查询
如果必须依赖字段默认值生成ID,那你需要找到新插入记录的唯一标识(比如ID外的其他唯一字段组合),再查询获取ID:
&& 执行插入操作 INSERT INTO YourTableName (OtherUniqueField1, OtherField2) ; VALUES ("唯一值A", "值2") && 通过唯一字段组合查询刚插入记录的ID SELECT IdField FROM YourTableName ; WHERE OtherUniqueField1 = "唯一值A" AND OtherField2 = "值2" ; INTO CURSOR tmpNewRecord LOCAL lcNewId IF _TALLY > 0 lcNewId = tmpNewRecord.IdField ENDIF && lcNewId即为目标ID
注意:此方法要求你必须有能唯一标识这条新记录的字段组合,否则可能查询到多条记录或错误记录。
方案3:修改自定义newId()函数,让它返回生成的ID
如果newId()是你自行编写的函数,可以调整其逻辑,让它在生成ID的同时返回该值。比如:
FUNCTION newId(tcDbName) && 原ID生成逻辑 LOCAL lcNewId lcNewId = "生成的唯一ID值" && 替换为实际生成逻辑 && 添加返回语句 RETURN lcNewId ENDFUNC
这样不管是作为字段默认值还是手动调用,都能直接获取生成的ID。
为什么之前的方法无效?
LASTVAL():仅适用于VFP原生自动增量字段,对自定义函数生成的ID无效。SCOPE_IDENTITY()、IDENT_CURRENT():这些是SQL Server的函数,VFP并不支持,调用自然失败。
内容的提问来源于stack exchange,提问作者Trock
相关产品推荐
相关产品推荐

