访问更改表“允许零长度”

时间:2008-10-08 19:24:36

标签: ms-access

我正在使用一个旧的Access数据库(是的,它非常难看,我讨厌它)。我需要修改我正在创建的VB应用程序中的一些列。我已经正确设置了大部分修改,但我正在努力将列修改为文本,默认为“允许零长度”为假。

SO ALTER TABLE [申请人表] ALTER COLUMN [申请人ID]文本(255)

我需要改变以将“允许零长度”设置为真。

我试过了 ALTER TABLE [申请人表] ALTER COLUMN [申请人ID]文本(255)NULL

但这似乎也不起作用。我一直在寻找解决方案,但似乎无法找到答案。

有什么想法吗?

谢谢, 莱恩。


感谢您的信息。我很高兴它是Access而不是我。

我想我只是打算通过这个应用程序破解我的方式,因为无论如何整个数据模型都是垃圾。

5 个答案:

答案 0 :(得分:4)

此选项不适用于Jet sql。您可以在Access gui或vba代码中执行此操作。例如:

Public Function setAllowZeroLenStr()    
    On Error GoTo Proc_Err

    Dim db As Database
    Dim tbl As TableDef
    Dim fld As DAO.Field

    Set db = CurrentDb
    Set tbl = db.TableDefs![Applicant Table]
    Set fld = tbl.Fields![Applicant ID]
    fld.AllowZeroLength = True

Proc_Exit:    
    Set fld = Nothing
    Set tbl = Nothing
    Set db = Nothing

    Exit Function

Proc_Err:    
    MsgBox Err.Number & vbCrLf & Err.Description
    Err.Clear
    Resume Proc_Exit    
End Function

答案 1 :(得分:3)

我同意:此设置没有ACE / Jet语法。如果你考虑一下,SQL DLL往往是标准的“可移植”东西,可以在大多数SQL产品上实现。大多数SQL没有显式(Dis)AllowZeroLength功能,因此它没有进入标准,因此不在ACE / Jet语法中。

对于ACE / Jet也适用的'便携式'解决方案是使用CHECK约束,例如:类似的东西:

ALTER TABLE [Applicant Table] ADD
   CONSTRAINT Applicant_ID__not_zero_length 
      CHECK (LEN([Applicant ID]) > 0);

允许零长度值将不需要首先创建CHECK约束(!!)或DROP它是否已存在...但为什么要允许标识符(“申请人”) ID“)无论如何都是零长度?

答案 2 :(得分:0)

年龄之前我想做同样的事情和ISTR,它只是不可能来自DDL / SQL - 但你可以通过查找字段(table.fields)并将AllowZeroLength设置为所需的值来从VBA执行此操作

答案 3 :(得分:0)

使用Interop.ACCDBLIB

试试这个:

    DBLib dbLib = new DBLib();
    dbLib.ConnectionString = ConnectionString;
    dbLib.Initialize(); 
    dbLib.ModifyTextFieledSetAllowZeroLength(ref TableName, ref FiledName);

答案 4 :(得分:0)

Sub SetUpTempDbExample()
' Set up a temp database for running report data into.
' Temp DB is killed and re-created on demand (saves having to compact and repair in primary DB).
' Temp table can be relinked to primary DB for further querying
Dim dbTemp As Database
Dim tblTemp As TableDef
Dim idxTemp As Index, idxTemp2 As Index
Const cTempPath = "C:\temp\"
Const cTempDB = "TempReportData"

    '  Delete old temp database (if db is in use, Kill will fail. Resume gracefully.)
    On Error Resume Next
    If Dir(cTempPath & cTempDB) <> "" Then Kill (cTempPath & cTempDB)

    On Error GoTo ErrHandler
    
    ' Create a new temp DB.
    Set dbTemp = CreateDatabase(cTempPath & cTempDB, dbLangGeneral)

    Set tblTemp = dbTemp.CreateTableDef("TEMP_SAMPLES")
    
    With tblTemp
        .Fields.Append .CreateField("SAMPLE_ID", dbDouble)
        .Fields.Append .CreateField("SITE_ID", dbText, 38)
        .Fields.Append .CreateField("SAMPLE_DATE_TIME", dbDate)
        .Fields.Append .CreateField("METHOD", dbText, 20)
        .Fields.Append .CreateField("MATRIX", dbText, 20)
        .Fields.Append .CreateField("COMMENT", dbText, 255)
        .Fields![COMMENT].AllowZeroLength = True
        Set idxTemp = .CreateIndex("SAMPLE_ID")
        idxTemp.Fields.Append .CreateField("SAMPLE_ID")
        idxTemp.Primary = True
        Set idxTemp2 = .CreateIndex("SITE_ID")
        idxTemp2.Fields.Append .CreateField("SITE_ID")
    End With
    dbTemp.TableDefs.Append tblTemp
    tblTemp.Indexes.Append idxTemp
    tblTemp.Indexes.Append idxTemp2

    Set tblTemp = Nothing
    Set idxTemp = Nothing
    Set dbTemp = Nothing

ExitSub:
    Exit Sub

ErrHandler:
    MsgBox Err.Description & " (" & Err.Number & ")"
    Resume ExitSub
End Sub