【问题标题】:MS Access run-time error 3259 invalid field data type on alter tableMS Access 运行时错误 3259 更改表上的字段数据类型无效
【发布时间】:2014-03-26 11:22:48
【问题描述】:

完全重新安装我的电脑后,突然出现这个错误:
Run-time error 3259 invalid field data type on alter table
运行此查询时:
ALTER TABLE Invoices ALTER COLUMN ID COUNTER (1, 1) 在 MS Access 数据库上。

数据类型没有改变,实际上除了重新安装之外没有任何改变..

字段 ID 是一个 Long Integer 字段,设置为针对表中包含的每个 Invoice 自动递增。由于数据仅临时驻留在此表中,因此我在每批后重置自动增量。我认为这可能与不同版本中缺少或更改的引用有关。但我似乎无法弄清楚是哪一个或为什么..

我的查询需要更明确吗?有没有人经历过这种情况?

【问题讨论】:

  • 我刚刚在 Access 2010 中尝试了您的 ALTER TABLE 查询,它对我来说效果很好。我使用DAO.Database.ExecuteADODB.Connection.Execute 对其进行了测试。查询按预期工作并且没有产生错误。您是否确认 Microsoft Update 已为您提供了 Office 2010 的所有最新补丁?

标签: sql ms-access ms-access-2010


【解决方案1】:

我遇到了同样的问题。我在检查"Hoew to alter the data definition of a linked table" 时突然想到我可以尝试将字段数据类型更改为NUMBER 并查看该代码是否有效。

所以我把代码改成:

ALTER TABLE XXXXX ALTER COLUMN ID NUMBER

运行代码没有问题!检查表格设计,字段数据类型已从 Autonumber 更改为 Number。

所以,我决定再试一次原来的代码:

ALTER TABLE XXXX ALTER COLUMN ID COUNTER (1,1)

并且...它工作了! O.O

我不明白为什么……但它起作用了……

尝试通过代码将数据类型更改为NUMBER,运行它,然后将其更改回COUNTER(1,1),看看你是否修复了错误,就像我的那样......

【讨论】:

  • 你救了我的一天兄弟!
  • ALTER TABLE XXXXX ALTER COLUMN ID NUMBER 将 ID 字段的整理顺序更改为选项新数据库排序顺序中的设置。也许这就是它起作用的原因。但似乎只有空桌子。
【解决方案2】:

ALTER COLUMN ID NUMBER 也对我有用,但它可能仅在空表的情况下使用,否则将 ID 字段设置为自动编号(ALTER COLUMN ID COUNTER(此处为下一个 ID 号,1))将不起作用.至少不能手动设置。
这是 .mdb Access 10 (2002) 文件放在任何用户目录上方的 C://directory/ 中,在 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 错误且排序顺序 = General、ID Collat​​ingOrder = 1045 的表。如果删除此类表并导入新表,则不会发生 ID Collat​​ingOrder = 1033 和 3259 错误。看来,Access 在导入期间更改了 ID 字段的整理顺序。那将是解决该问题的第二种方法。或将整个数据库导入新文件。第三种方法是复制这样的表 - 它显然也改变了 ID 的 Collat​​ingOrder。最好是通过 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在重新启动后停止工作。在压缩和修复之前,对于 ID 和整个数据库,MsgBox 中的 Collat​​ingOrder 属性值不同,在压缩和修复之后相同(在新数据库排序顺序更改之前)。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,通过“压缩和修复”MS Access 数据库已解决。

    【讨论】:

      【解决方案4】:

      回复晚了,但其他人也可能会发现这个问题。

      通过改变

      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)"
      

      我的没有再报错,它确实“重置”了自动编号。

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题。显然这是因为我通过复制已经具有自动编号字段的现有表的结构创建了一个新表。无论出于何种原因,它在副本上给了我这个错误。它在删除表并从头开始重新创建后工作。

        【讨论】:

          【解决方案6】:

          Microsoft ADO 分机。 2.8(或 6.0 ?)用于 DDL 和安全 (ADOX) 工作!!

          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
          

          但它很慢,可能是因为后期绑定。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-05-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多