我正在使用一个旧的Access数据库(是的,它非常难看,我讨厌它)。我需要修改我正在创建的VB应用程序中的一些列。我已经正确设置了大部分修改,但我正在努力将列修改为文本,默认为“允许零长度”为假。
SO ALTER TABLE [申请人表] ALTER COLUMN [申请人ID]文本(255)
我需要改变以将“允许零长度”设置为真。
我试过了 ALTER TABLE [申请人表] ALTER COLUMN [申请人ID]文本(255)NULL
但这似乎也不起作用。我一直在寻找解决方案,但似乎无法找到答案。
有什么想法吗?
谢谢, 莱恩。
感谢您的信息。我很高兴它是Access而不是我。
我想我只是打算通过这个应用程序破解我的方式,因为无论如何整个数据模型都是垃圾。
答案 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