Access911.net   |   a9BBS   |   OTaA System  
  搜索文章:  
Access911欢迎您光临  
   主页      上传      繁體版       论坛     
设为首页  |  加入收藏   
  
你现在的位置:文章索引 -> 文章分类 -> 表  
 首页|  近日更新|  下载  |  文章索引  |  搜索|  术语|  承接工程|  
 
系统正在加载内容,请耐心等待...
 
 查询
 窗体
 报表
 
 
 VBA
 函数
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 发布
 OA
 ASP/ASP.NET
 其他语言
 控件
 DELPHI
 C#/.Net
 本站
 其他
 小例程
 常用软件
 参考文档
 业主作品
 网友大作
 
 
友情链接
 access911.net
 
访问人次
 1701984
 
站长 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 订阅

显示附加信息 >>>

如何在已有数据的情况下更改某列的数据类型为“自动编号 递增”

作者:cg1  摘自:access911.net  :cg1  更新日期:2006-9-14  浏览人次:

 

问题:

如何在某字段已有数据的情况下更改该列的数据类型为“自动编号 递增”

 

回答:

ACCESS JET DB MDB 数据库中不允许将一个已经有值的字段的数据类型更改为“自动编号”类型,而且一个表只允许有一个自动编号字段。但是可以利用 JET DB MDB 数据库的一个特点,就是添加( INSERT INTO )记录时允许指定自动编号字段的值。具体内容请参考

    如何更改数据类型为“自动编号”“同步复制ID”的值?《查询》
    http://access911.net/index.asp?u1=a&u2=72FAB11E15DCE8F3

操作如下:

首先,必须确认该字段中每一条记录都已经赋值,而且不允许有重复,如果有重复,那么取一个不重复的值来代替。如果有空值,那么必须找一个新的不重复的值来更新该“空”。

其次,必须将该字段的数据类型转换为“数字-长整”,如果无法转换,那么一条一条去处理!

最后,新建立一个表(比如命名为:TEMP),其结构与需要更改字段类型的表(比如:tblName)的结构完全一致,当然,其中某个字段(比如:ID)已经是自动编号了。这时 TEMP 表没有任何记录,编程用 ADO 的 RECORDSET 循环整个 tblName 表,将所有数据一条一条 INSERT INTO 到 TEMP 表,然后删除 tblName 表,重命名 temp 为 tblName 即可


本文示例代码如下:


'按键盘 ALT + F11 转到  VBA 编辑器界面,菜单 插入 模块,然后将一下代码 COPY 进去
'点击鼠标左键,将光标停留在各个函数的名称上按 F5 可以执行该函数


'===========================================================
' 过程及函数名:  CreateTempDate
' 版本号      :  1.0
' 说明        :  本函数作用:建立本文章需要的测试环境(表)
' 引用        :  --
' 输入参数    :  --
' 输出值      :  --
' 返回值      :  --
' 调用演示    :  --
' 最后修改日期:  2006-9-14 16:32:00
' 示例地址    :  http://access911.net/?kbid;72FABE1E11DCE8F3 
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
'===========================================================

Function CreateTempDate()
'本函数作用:建立本文章需要的测试环境(表)

    Dim strSQL(6) As String
    Dim i As Long
    strSQL(0) = "drop table tblName"
    strSQL(1) = "drop table temp"
    strSQL(2) = "create table tblName (ID LONG,Name text(50),Address text(50))"
    strSQL(3) = "insert into tblName(ID,NAME,ADDRESS) VALUES(1,'王午','上海')"
    strSQL(4) = "insert into tblName(ID,NAME,ADDRESS) VALUES(3,'立嗣','上海')"
    strSQL(5) = "insert into tblName(ID,NAME,ADDRESS) VALUES(45,'苏俄','上海')"
    strSQL(6) = "create table temp (ID AUTOINCREMENT(2,4),Name text(50),Address text(50),Primary KEY ([ID]))"
    
    On Error Resume Next
    For i = 0 To UBound(strSQL)
        CurrentProject.Connection.Execute strSQL(i)
        If Err <> 0 Then
            Debug.Print "语句 strSQL(" & CStr(i) & ") 运行出错:" & Err.Description
            Err.Clear
        End If
    Next
    
End Function



'===========================================================
' 过程及函数名:  DoAlterTable
' 版本号      :  1.0
' 说明        :  本函数作用:利用 JET DB 的特性更改已有数据字段的数据类型为“自动编号”“递增”
' 引用        :  --
' 输入参数    :  --
' 输出值      :  --
' 返回值      :  --
' 调用演示    :  --
' 最后修改日期:  2006-9-14 16:32:00
' 示例地址    :  http://access911.net/?kbid;72FABE1E11DCE8F3
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
'===========================================================

Function DoAlterTable()
'本函数作用:利用 JET DB 的特性更改已有数据字段的数据类型为“自动编号”“递增”
    Dim strSQL As String
    strSQL = "insert into temp (ID,NAME,ADDRESS) SELECT id,name,address from tblName"
    CurrentProject.Connection.Execute strSQL
    '如果是纯 ACCESS 环境可以使用
    'DoCmd.Rename "新表名", acTable, "原表名"
    '来更改表名

    renameTableName "tblName", "tblName-" & Format(Now, "yyyymmddhhnnss")
    renameTableName "temp", "tblName"
End Function



'===========================================================
' 过程及函数名:  renameTableName
' 版本号      :  1.0
' 说明        :  本函数作用,更改某个用户表的名称
' 引用        :  ADOX 
' 输入参数    :  strOldName 文本,修改前的名称
'                 strNewName 文本,修改后的表名称
' 输出值      :  --
' 返回值      :  Boolean 确定是否成功更名
' 调用演示    :  renameTableName "tblName", "tblName-" & Format(Now, "yyyymmddhhnnss")
' 最后修改日期:  2006-9-14 16:32:00
' 示例地址    :  http://access911.net/?kbid;72FABE1E11DCE8F3
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
'===========================================================

Function renameTableName(strOldName As String, strNewName As String) As Boolean
'本函数作用,更改某个用户表的名称

    On Error Resume Next
    'Dim tbl As ADOX.Table              '在 ACCESS 环境中可以这样声明
    'Dim cat As New ADOX.Catalog        '在 ACCESS 环境中可以这样声明
    Dim tbl
    Dim cat
    
    Set tbl = CreateObject("adox.table")
    Set cat = CreateObject("adox.catalog")
    Set cat.ActiveConnection = CurrentProject.Connection
    
    '上面这句中 CurrentProject.Connection 在VB中要更改为已经open的connection对象
    For Each tbl In cat.Tables
        If tbl.Name = strOldName Then tbl.Name = strNewName
    Next
    If Err.Number <> 0 Then
        renameTableName = False
    Else
        renameTableName = True
    End If
End Function


 


本站文章旨在为该问题提供解决思路及关键性代码,并不能完成应该由网友自己完成的所有工作,请网友在仔细看文章并理解思路的基础上举一反三、灵活运用。

access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接

 

 
相关文章
     没有手动相关文章
     如何用JET SQL DDL创建自动编号GUID字段
     关于如何得到新增记录的自动编号字段数值方法三
     如何更改数据类型为“自动编号”“同步复制ID”的值?
     自动编号如果递增到的最大数后会怎么样?什么是同步复制ID?
     自动编号的字段在删除记录后编号不连续
     误删除了某条含有自动编号字段的记录?怎么恢复?
     关于如何得到新增记录的自动编号字段数值方法二
     如何定义自动编号字段的初始值和步进值?
     如何在表中新插入新记录后,获取该记录自动编号字段的值?
 
评论
     查看或发表更多的评论,请单击这里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陈格 保留所有权利