完全重新安装我的电脑后,我突然收到此错误:
Run-time error 3259 invalid field data type on alter table
运行此查询时:
MS Access数据库上的ALTER TABLE Invoices ALTER COLUMN ID COUNTER (1, 1)
。
数据类型没有改变,实际上除了重新安装之外没有任何改变..
字段ID是一个Long Integer字段,对于表所包含的每个Invoice,都设置为自动递增。由于数据仅暂时存在于此表中,因此我会在每批次之后重置自动增量。我认为它可能与不同版本中缺少或更改的引用有关。但我似乎无法弄清楚哪一个或为什么......
我的查询中是否需要更明确?以前有人经历过这个吗?
答案 0 :(得分:4)
我遇到了同样的问题。我正在检查"Hoew to alter the data definition of a linked table"当我发现我可以尝试将字段数据类型更改为NUMBER
并查看该代码是否有效。
所以我将代码更改为:
ALTER TABLE XXXXX ALTER COLUMN ID NUMBER
运行代码没有问题!检查表设计,字段数据类型已从自动编号更改为数字。
所以,我决定再次尝试原始代码:
ALTER TABLE XXXX ALTER COLUMN ID COUNTER (1,1)
和......工作!!! O.O
我不明白为什么......但它有效......
尝试通过代码将数据类型更改为NUMBER
,运行它,然后将其更改回COUNTER(1,1)
,然后查看是否修复了错误,就像我做的那样......
答案 1 :(得分:2)
ALTER COLUMN ID NUMBER也适用于我,但它可能仅在空表的情况下使用,否则将ID字段设置为自动编号(ALTER COLUMN ID COUNTER(此处的下一个ID号,1))将不起作用。至少手动无法设置
这是.mdb Access 10(2002)文件放在C://目录/上面的任何用户目录上,在Windows XP下,由Runtime 2010打开。我在用户目录中没有注意到这种行为,比如我的文档或桌面,但也许这是巧合,它会在某个时候发生。它是在使用该代码几年后第一次发生的。
第二天编辑:
似乎有部分解释。原因是整理订单。之前使用此设置创建并使用了数据库:
工具>选项>一般>新数据库排序顺序>波兰
但在中间时,程序中的此设置被设置为>一般
现在它显示错误。它可以很容易地固定回来>波兰
并运行压缩和修复数据库(ALTER COLUMN ID COUNTER再次开始工作)。到目前为止,我已经重复了几次,每次都有效。但是使用General Compact和修复数据库并没有任何帮助。
这个子程序:
Private Sub IDProperties()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim TableName As String
Dim i As Integer
Dim str As String
TableName = "the name of table"
Set db = CurrentDb()
Set tdf = db.TableDefs(TableName)
For i = 0 To tdf.Fields("ID").Properties.Count - 1
On Error Resume Next
str = str & vbNewLine & tdf.Fields("ID").Properties(i).name
If Err > 0 Then
str = str & vbNewLine & Err.Number & " " & Err.Description
Err.Clear
End If
str = str & " = " & tdf.Fields("ID").Properties(i).Value
If Err > 0 Then str = str & "; " & Err.Number & " " & Err.Description
On Error GoTo 0
Next
Set tdf = Nothing
db.Close
Set db = Nothing
Debug.Print str
End Sub
返回ID字段的整理顺序。对于返回3259错误且排序顺序=常规的表,ID CollatingOrder = 1045.如果删除此表并导入新表,则不会发生ID CollatingOrder = 1033和3259错误。看来,Access在导入期间会更改ID字段的整理顺序。这将是解决这个问题的第二种方法。或者将整个数据库导入新文件。第三种方法是复制这样的表 - 它显然也改变了ID的CollatingOrder。最好的方法是通过VBA更改整理顺序,但它是只读属性。
Private Sub GetCollatingOrder()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim TableName As String
Set db = CurrentDb()
Set tdf = db.TableDefs("table name")
MsgBox "Collating order" & _
vbNewLine & "- database: " & db.CollatingOrder & _
vbNewLine & "- table: " & tdf.Fields("ID").Properties("CollatingOrder").Value
'or tdf.Fields("ID").CollatingOrder
Set tdf = Nothing
db.Close
Set db = Nothing
End Sub
只能更改数据库排序顺序:
Application.SetOption "New Database Sort Order", 1033 ' or 1045 for example
但它改变了某人数据库的属性......并且可能仍然紧凑并需要修复。
稍后编辑:
现在MsgBox显示1045:General和Polish(以及:db和ID)并停止显示错误......非常奇怪。也许是因为几个紧凑和修理
稍后编辑:
如果新数据库排序顺序未更改+紧凑和修复,第二天再次出现相同的错误。所以General重启后停止工作。压缩和修复之前,MsgBox中的CollatingOrder属性值对于ID和整个数据库是不同的,在压缩和修复之后(在新数据库排序顺序更改之前)也是如此。
答案 2 :(得分:0)
我遇到了同样的问题,它已经被" Compact&修复" MS Access数据库。
答案 3 :(得分:0)
迟到的回复,但其他人也可能会发现这个问题。
通过更改
DoCmd.RunSQL "DELETE * FROM YourTable"
CurrentDb.Execute "ALTER TABLE YourTable ALTER COLUMN ID COUNTER(1,1)"
到
DoCmd.RunSQL "DELETE * FROM YourTable"
CurrentDb.Execute "ALTER TABLE YourTable ALTER COLUMN ID COUNTER(1,2)"
我没有再给出错误,它确实“重置”了自动编号。
答案 4 :(得分:0)
我遇到了同样的问题。显然是因为我通过复制已经具有AutoNumber字段的现有表的结构创建了一个新表。不管出于什么原因,它都会在复印件上给我这个错误。在删除表并从头开始创建表后,它就可以工作了。
答案 5 :(得分:0)
Microsoft ADO Ext。 DDL和安全性(ADOX)的2.8(或6.0吗?)有效!
Dim cat As Object
Set cat = CreateObject("ADOX.Catalog") 'late binding instead As ADOX.Catalog or As New ADOX.Catalog to avoid using references to ADOX
cat.ActiveConnection = CurrentProject.Connection
cat.Tables("Your table name").Columns("Your field name").Properties("Seed") = 1
cat.Tables("Your table name").Columns.Refresh
Set cat = Nothing
但这很慢,可能是因为绑定较晚。