[guid数据库同步失败]ACCESS中使用GUID全局唯一标识符的自动唯一编号同步复制ID之解决方法

背景:

这段时间临时为一个旅游类网站制作一些网站程序。数据表的情况大致如下: 图1数据库表的大致情况由于是Access数据库,之前有两个数据表:TC_TourCompany和TC_SubDetail,前者是旅行社名录相关资料(为了方便描述,暂且叫“总公司表”),后者是下属营业部(如果有的话)的相关资料(为方便描述,暂且叫“子公司表”)。

由于业务需要,想将之扩展为适用于所有“公司类”(比如酒店、景区、景点、漂流公司、娱乐餐饮、机票代理、交通公司等)的数据表,由于酒店、餐饮娱乐、机票代理等公司都有可能有分部或分公司,所以表的数据结构是差不多的。所以,我们可以通用这样的数据表设计来简化今后的程序开发。当然,我们需要在数据表中新增一列,用于描述公司的类型是旅行社、酒店、景区或是娱乐餐饮类公司等。不在本文的叙述范围,按下不表。

为了方便今后的分类搜索查询,确保公司(包括子公司)的唯一性,所以,我想在上述两个表中增加一列,我把列名叫做GUID。它的每条记录都是唯一不重复的值,类似:{9E4038C8-E965-45B1-BDE1-9F06E6B280A3},这有点象.Net中的System.Guid.NewGuid()生成的值,并用大括号{}包含起来。

做法:如何在已有数据库表记录的情况下自动生成每一条记录的这些值呢?

一开始,我走了点弯路。在新增GUID列时,我选择了此列的数据类型为“数字”并在下面常规选项卡中“字段大小”中选择了“同步复制ID”,索引中选择了“有(无重复)”。本以为这样保存结构之后就万事大吉,最终打开表的所有记录时发现,GUID列完全为空,没有任何值!于是,我想了一些办法去插入GUID唯一值。方案之一是在ACCESS中使用SQL语句更新,后来发现此路不通。方案之二就是使用ADO.net编程方式更新表记录,工作量也不小。

有没有更好的办法呢?一个偶尔的想法让我找到了更快更好的解决办法,那就是在设计视图中建立GUID列时,数据类型选择自动编号而不是数字!同时,在下面常规选项卡中“字段大小”中选择了“同步复制ID”,索引中选择了“有(无重复)”。

如下图: 图2给总公司名录表(TC_TourCompany表)增加GUID列

图3给总公司表(TC_TourCompany表)增加GUID列后自动生成GUID记录值 图4给分公司(分部)TC_SubDetail表增加GUID列

图5给分公司(分部)TC_SubDetail表增加GUID列后自动生成GUID记录值

以后新增记录时会发生什么?经测试发现,ACCESS会自动搞定生成GUID记录值的问题。OK,完美!

更多的话:从Access生成SQL语句时,遇到了Guid查询的问题,在SQLServer中使用的字符串形式,不能查询出任何数据。

SELECT*FROMtableNameWHERE[GUID]='12345678-90AB-CDEF-1234-567890ABCDEF'

如果条件字符串所引用的列为GUID类型,那么该条件表达式使用的语法稍微有所不同:WHERE[GUID]={GUID{12345678-90AB-CDEF-1234-567890ABCDEF}}请确保包含如上所示的嵌套大括号和连字号。需要注意的是,嵌入大括号的方法只用于Where语句,在Insert语句中还是要使用单引号,否则将产生MALFORMEDGUIDinquery的错误。

更多参考:ASP.NET开发经验(3)---使用GUID值来作为数据库行标识http://blog.joycode.com/moslem/archive/2004/03/23/16930.aspx

其他:导出/打印Access数据库的结构http://blog.csdn.net/johnsuna/archive/2008/05/05/2393664.aspx

附录:

Access数据类型与.netOleDbType枚举类型的对应

最常见的数据类型映射列表

访问类型名称数据库数据类型OLEDB类型.NET框架类型成员名称文本VarWCharDBTYPE_WSTRSystem.StringOleDbType.VarWChar备忘录LongVarWChaRDBTYPE_WSTRSystem.StringOleDbType.LongVarWChar字节数:UnsignedTinyIntDBTYPE_UI1System.ByteOleDbType.UnsignedTinyInt是/否BooleanDBTYPE_BOOLSystem.BooleanOleDbType.Boolean日期/时间DateTimeDBTYPE_DATESystem.DateTimeOleDbType.date货币十进制DBTYPE_NUMERICSystem.DecimalOleDbType.numeric十进制数:十进制DBTYPE_NUMERICSystem.DecimalOleDbType.numeric双精度数字:双精度数字DBTYPE_R8System.DoubleOleDbType.Double自动数字(复制ID)GUIDDBTYPE_GUIDSystem.GuidOleDbType.guid复制(ID)号:GUIDDBTYPE_GUIDSystem.GuidOleDbType.guid自动数字(长整型)整数DBTYPE_I4System.Int32OleDbType.integer数量:(长整型)整数DBTYPE_I4System.Int32OleDbType.integerOLE对象LongVarBinaryDBTYPE_BYTES数组System.ByteOleDbType.LongVarBinary单精度数字:单精度数字DBTYPE_R4System.SingleOleDbType.single整型数:SmallIntDBTYPE_I2System.Int16OleDbType.SmallInt二进制VarBinary*DBTYPE_BYTES数组System.ByteOleDbType.binary超链接VarWCharDBTYPE_WSTRSystem.StringOleDbType.VarWChar

猜你喜欢

转载自www.cnblogs.com/sqlserver-mysql/p/12721630.html