以下是问题:
>有关将主键从整数更改为GUID的任何建议吗?
>有关从Access客户端中的代码使用和操作GUID的任何建议吗?
>我应该使用哪种sql Server GUID类型?
解决方法
> GUID可以按照不同的规则生成.你可以查看这个here
>设置复制时,sql将系统地添加GUID
(作为新的序列生成)到
每个表,如果它还没有
存在,并将其称为rowguid.当然,如果每个表中已经有这样的GUID / newSequentialId,sql将使用它. BUt我不建议你将复制GUID与PK GUID’混合’:你可以将GUID类型的所有主键声明为’newSequentialIds’,但是(a)你将失去在客户端生成GUID值的可能性 – 见下文 – 和(b)你的PK将是“可预测的”,这个想法让我觉得不舒服……
>保持自动增量整数并通过复制管理其范围意味着大量开销(您必须为每个表/每个发布分配范围)以及从不同来源复制时潜在的冲突源.
>此外,一些特定于范围分配的sql错误如this one仍未得到妥善解决:应用累积包5并未解决我们的问题,我们必须找到另一种方法来重新启动复制过程.
>无论如何,我深信,从整数切换到GUID作为主键是强制性的.造成这种情况的原因有很多,其中一个原因与这些范围管理有关,因为它们是头巾和夜间故障排除会议的潜在来源.
关于从整数到GUIDS的更改,我建议您编写一个分步模块,该模块将:
>在修改之前备份所有现有表
>为每个表添加GUID字段
>在请求时添加相应的FK字段
>通过使用现有关系构建的视图更新FK字段(基于整数字段构建)
>打破关系
>将PK从整数字段更改为GUID字段
>重建关系
花点时间编写此代码.在正常工作之前,您将多次使用它.您应该从DAO对象,tabledef,索引等中获利.请记住,您必须始终能够返回起点,因此不要忘记初始备份过程.
那么从VBA操纵GUID呢?有几点需要了解:
> GUID属于Variant类型
>可以并且很容易在应用程序的客户端生成GUID作为主键,正如我在here中提出的那样.
>当您尝试获取GUID值时
从一个形式的控件(通常作为组合框中的链接字段),你会得到’?????’但没有价值.您必须引用记录集中的字段值才能获得正确的数据.您可以在应用中打开此类表单,转到“即时”窗口,然后尝试以下操作:
? myForm.myControl ????? ? myForm.recordset.fields("myFieldName") {000581EB-9CBF-418C-A2D9-5A7141A686CC}
>在使用记录集(例如recordset.findfirst)浏览记录集时,可能必须将guid转换为字符串:
myFirstRecordset.FindFirst "stringFromGUID(myGuidId) = " & StringFromGUID(mySecondRecordset.Fields("myGuidId").Value)