Indexing VFP插入,索引更新

Indexing VFP插入,索引更新,indexing,oledb,visual-foxpro,Indexing,Oledb,Visual Foxpro,所以主程序是用C语言编写的。将新记录插入VFP数据库表。通过为记录生成下一个ID花费的时间太长 select max(id)+1 from table ,因此我将该代码放入VFP中的编译dll中,并通过C#调用该COM对象 COM对象在大约250ms内返回新ID。然后,我只需通过OLEDB进行更新。我遇到的问题是,在COM对象返回新插入的ID后,我无法立即通过OLEDB从C#中找到它 select id form table where id = *newlyReturnedID* 返回0

所以主程序是用C语言编写的。将新记录插入VFP数据库表。通过为记录生成下一个ID花费的时间太长

select max(id)+1 from table
,因此我将该代码放入VFP中的编译dll中,并通过C#调用该COM对象

COM对象在大约250ms内返回新ID。然后,我只需通过OLEDB进行更新。我遇到的问题是,在COM对象返回新插入的ID后,我无法立即通过OLEDB从C#中找到它

select id form  table where id = *newlyReturnedID*
返回0行。如果等待未知的时间段,查询将返回1行。我只能假设它立即返回0行,因为它尚未将新生成的ID添加到索引中,因此select无法找到它

还有谁遇到过类似的事情吗?如果是,你是如何处理的


DD

VFP需要到其工作区。

VFP需要到其工作区。

警告:您的代码在多用户环境中有缺陷。两个人可以同时运行查询并获得相同的ID。如果列具有主键或候选键,其中一个人将在插入时失败,这是键字段的最佳做法

我的建议是要么让ID是一个自动递增的整数字段(我不喜欢),要么更好,创建一个键表。表中的每条记录都是针对一个分配了键的表。我使用的结构与此类似:

Structure for: countergenerator.dbf Database Name: conferencereg.dbc Long table name: countergenerator Number of records: 0 Last updated: 11/08/2008 Memo file block size: 64 Code Page: 1252 Table Type: Visual FoxPro Table Field Name Type Size Nulls Next Step Default ---------------------------------------------------------------------------------------------------------------- 1 ccountergenerator_pk Character 36 N guid(36) 2 ckey Character (Binary) 50 Y 3 ivalue Integer 4 Y 4 mnote Memo 4 Y "Automatically created" 5 cuserid Character 30 Y 6 tupdated DateTime 8 Y DATETIME() Index Tags: 1. Tag Name: PRIMARY - Type: primary - Key Expression: ccountergenerator_pk - Filter: (nothing) - Order: ascending - Collate Sequence: machine 2. Tag Name: CKEY - Type: regular - Key Expression: lower(ckey) - Filter: (nothing) - Order: ascending - Collate Sequence: machine 结构:countergenerator.dbf 数据库名称:conferencereg.dbc 长表名称:计数器生成器 记录数:0 最后更新:11/08/2008 备忘录文件块大小:64 代码页:1252 表类型:Visual FoxPro表 字段名类型大小为空下一步默认值 ---------------------------------------------------------------------------------------------------------------- 1个ccountergenerator_pk字符36 N guid(36) 2个ckey字符(二进制)50 Y 3整数4 Y 4 M备注备注4 Y“自动创建” 5 cuserid字符30 Y 6元组日期时间8 Y日期时间() 索引标签: 1.标记名称:主 -类型:初级 -关键表达式:ccountergenerator_pk -过滤器:(无) -顺序:升序 -校对顺序:机器 2.标签名称:CKEY -类型:普通 -键表达式:lower(ckey) -过滤器:(无) -顺序:升序 -校对顺序:机器 现在,DBC(或其他程序)中存储过程的代码如下:

功能下一个计数器(tcAlias)

本地LCALIA; 下一个值; 再加工; 旧区

lnOldArea=SELECT()

如果参数()小于1 lcAlias=ALIAS()

如果CURSORGETPROP(“SOURCETYPE”)=DB\u srcloclocalview *--尝试获取基表 lcAlias=较低(CURSORGETPROP(“表格”)) lcAlias=SUBSTR(lcAlias,在(“!”,lcAlias)+1) 恩迪夫 其他的 lcAlias=较低(tcAlias) 恩迪夫

lnOrderNumber=0 lnoldreproces=SET('reproces')

*--锁定,直到用户按下Esc键 将“重新处理”设置为“自动”

如果!已使用(“计数器生成器”) 使用事件管理!0中的计数器生成器共享别名计数器生成器 恩迪夫

选择计数器生成器

如果搜索(较低(lcAlias),“计数器生成器”,“ckey”) IF RLOCK() LNEXTVALUE=计数器生成器.iValue 将countergenerator.iValue替换为countergenerator.iValue+1 解锁 恩迪夫 其他的 *使用起始值创建新记录。 在计数器生成器中添加空白 分散记忆备忘录 m、 cKey=较低(lcAlias) m、 iValue=1 m、 mNote=“由存储过程自动创建。” m、 tUpdated=DATETIME() 收集MEMVAR备忘录

IF RLOCK() LNEXTVALUE=计数器生成器.iValue 将countergenerator.iValue替换为countergenerator.iValue+1 解锁 恩迪夫 恩迪夫

选择(lnOldArea) 将REPRESS设置为LNOLDREPRESS

返回lnNextValue ENDFUNC

RLOCK()确保记录没有争用,并且速度足够快,不会造成进程瓶颈。这比您目前采取的方法更安全

里克·舒默

VFP MVP警告:您的代码在多用户环境中有缺陷。两个人可以同时运行查询并获得相同的ID。如果列具有主键或候选键,其中一个人将在插入时失败,这是键字段的最佳做法

我的建议是要么让ID是一个自动递增的整数字段(我不喜欢),要么更好,创建一个键表。表中的每条记录都是针对一个分配了键的表。我使用的结构与此类似:

Structure for: countergenerator.dbf Database Name: conferencereg.dbc Long table name: countergenerator Number of records: 0 Last updated: 11/08/2008 Memo file block size: 64 Code Page: 1252 Table Type: Visual FoxPro Table Field Name Type Size Nulls Next Step Default ---------------------------------------------------------------------------------------------------------------- 1 ccountergenerator_pk Character 36 N guid(36) 2 ckey Character (Binary) 50 Y 3 ivalue Integer 4 Y 4 mnote Memo 4 Y "Automatically created" 5 cuserid Character 30 Y 6 tupdated DateTime 8 Y DATETIME() Index Tags: 1. Tag Name: PRIMARY - Type: primary - Key Expression: ccountergenerator_pk - Filter: (nothing) - Order: ascending - Collate Sequence: machine 2. Tag Name: CKEY - Type: regular - Key Expression: lower(ckey) - Filter: (nothing) - Order: ascending - Collate Sequence: machine 结构:countergenerator.dbf 数据库名称:conferencereg.dbc 长表名称:计数器生成器 记录数:0 最后更新:11/08/2008 备忘录文件块大小:64 代码页:1252 表类型:Visual FoxPro表 字段名类型大小为空下一步默认值 ---------------------------------------------------------------------------------------------------------------- 1个ccountergenerator_pk字符36 N guid(36) 2个ckey字符(二进制)50 Y 3整数4 Y 4 M备注备注4 Y“自动创建” 5 cuserid字符30 Y