使用TableDef.CreateField方法VBA时,字段数据类型无效

时间:2016-07-27 17:38:26

标签: vba ms-access access-vba

我正在尝试向Access 2016表添加一系列字段,但仍然遇到错误:

Runtime error '3259'
Invalid field data type

我最初将数据类型指定为dbNumeric,但将其更改为dbDecimal以查看是否有所不同。虽然我没有尝试SQL,但为CreateFields提供here的解决方案并没有解决我的问题。它没。这是代码:

Sub BOD_Variables()

    Dim myDBS
    Dim myTable As TableDef
    Dim myTableName As String

    myTableName = "BOD_Data"
    Set myDBS = CurrentDb
    Set myTable = myDBS.TableDefs(myTableName)

    Dim myField As Field
    Dim myVariableNames As Variant

    myVariableNames = Array("Blank_4_SampleVol", ... "BOD_ Concentration _OUT")

    Dim iCount As Integer

    For iCount = LBound(myVariableNames) To UBound(myVariableNames)
    Debug.Print myVariableNames(iCount)

        Set myField = myTable.CreateField(myVariableNames(iCount), dbDecimal) 'Originally specified dbNumeric for data type.
        myTable.Fields.Append myField
    Next  
End Sub

我试图用以下代码替换对Array(index)的调用:

        Set myField = myTable.CreateField("Blank_4_SampleVol", dbNumeric)

仍然得到同样的错误。

我尝试将长度指定为discussed here,但这并没有解决问题。关于CreateField的文档说它在字段类型为dbNumberic时忽略字段长度。

我缺少什么想法?提前致谢。

2 个答案:

答案 0 :(得分:1)

虽然DAO似乎没有公开创建Decimal字段所需的属性,但即使我们尝试使用DAO.Field2对象,以下ADOX代码确实会创建{{1 }(使用Access 2010测试):

Decimal

或者,我们可以使用DDL查询......

Option Compare Database
Option Explicit

Sub AddNewDecimalField()
    Dim cat As New ADOX.Catalog
    cat.ActiveConnection = CurrentProject.Connection
    Dim tbl As ADOX.Table
    Set tbl = cat.Tables("MyTable")
    Dim col As New ADOX.Column
    col.Name = "MyNewDecimalField"
    col.Type = adNumeric  ' note: not adDecimal
    col.Precision = 18
    col.NumericScale = 8
    tbl.Columns.Append col
End Sub

......正如安德烈在答案中所说的那样。

答案 1 :(得分:0)

关注相关问题中的link,并阅读DECIMAL脚注#7:

  

[7]在Access查询界面或DAO中不可用。使用ADO执行DDL查询语句。

所以你要使用这样的东西:

strSQL = "ALTER TABLE myTable ADD COLUMN " & myVariableNames(iCount) & " DECIMAL (20,6);"
CurrentProject.Connection.Execute strSQL

小数字段(见下面的评论)他们的问题,请参阅Avoid Using Decimal Field Size in Microsoft Access Tableshttp://allenbrowne.com/bug-08.html

长或双或货币可能是更好的选择。