問題:
如何在某字段已有數據的情況下更改該列的數據類型為“自動編號 遞增”
回答:
Access JET DB MDB 數據庫中不允許將一個已經有值的字段的數據類型更改為“自動編號”類型,而且一個表只允許有一個自動編號字段。但是可以利用 JET DB MDB 數據庫的一個特點,就是添加( INSERT INTO )記錄時允許指定自動編號字段的值。具體內容請參考
如何更改數據類型為“自動編號”“同步復制ID”的值?《查詢》
操作如下:
首先,必須確認該字段中每一條記錄都已經賦值,而且不允許有重復,如果有重復,那麼取一個不重復的值來代替。如果有空值,那麼必須找一個新的不重復的值來更新該“空”。其次,必須將該字段的數據類型轉換為“數字-長整”,如果無法轉換,那麼一條一條去處理!
最後,新建立一個表(比如命名為: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
' 電子郵件 : [email protected]
'===========================================================
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
' 電子郵件 : [email protected]
'===========================================================
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
' 電子郵件 : [email protected]
'===========================================================
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