【问题标题】:Access Alter Table "Allow Zero Length"访问更改表“允许零长度”
【发布时间】:2021-02-19 11:23:09
【问题描述】:

我正在使用旧的 Access 数据库(是的,它非常丑陋,我讨厌它)。我需要修改我正在创建的 VB 应用程序中的一些列。我的大部分修改设置正确,但我正在与将列修改为文本使其默认为“允许零长度”为假这一事实作斗争。

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

我需要该更改将“允许零长度”设置为 true。

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

但这似乎也不起作用。我已经到处寻找解决方案,但似乎找不到一个直接的答案。

有什么想法吗?

谢谢, 瑞恩。


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

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

【问题讨论】:

  • 在 GUI(表格设计)中尝试会发生什么?
  • Allen Browne, MVP :“只是出于好奇,您为什么要将此属性设置为是?也许是为了与其他软件兼容?对于一个非常奇怪的领域?总的来说,我认为这是一个糟糕的主意,因为:1) 用户无法区分,2) Access 无法区分。(尝试使用 DLookup())。 -- pcreview.co.uk/forums/allow-zero-length-using-sql-t1636536.html

标签: ms-access


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我同意:此设置没有 ACE/Jet 语法。如果你仔细想想,SQL DLL 往往是标准的“可移植”东西,大多数 SQL 产品都可以实现。大多数 SQL 没有明确的 (Dis)AllowZeroLength 特性,因此它没有成为标准,因此不在 ACE/Jet 语法中。

    FWIW 也适用于 ACE/Jet 的“便携式”解决方案是使用 CHECK 约束,例如类似:

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

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

    【讨论】:

      【解决方案3】:

      很久以前我也想做同样的事情,而 ISTR 认为它根本不可能从 DDL/SQL 中实现 - 但您可以通过定位字段 (table.fields) 并将 AllowZeroLength 设置为所需值从 VBA 中做到这一点

      【讨论】:

        【解决方案4】:

        使用 Interop.ACCDBLIB

        试试这个:

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

        【讨论】:

          【解决方案5】:
          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
          

          【讨论】:

            猜你喜欢
            • 2019-07-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-03-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多