Ms access “访问更改表”;“允许零长度”;
我正在使用一个旧的Access数据库(是的,它非常难看,我讨厌它)。我需要修改我正在创建的VB应用程序中的一些列。我已经正确地设置了大多数修改,但我正在与这样一个事实抗争:将列修改为文本会使默认值“AllowZero Length”为false 所以 ALTER TABLE[申请人表格]ALTER COLUMN[申请人ID]文本(255) 我需要将“允许零长度”设置为true 我试过了 ALTER TABLE[申请人表格]ALTER COLUMN[申请人ID]文本(255)NULL 但这似乎也不起作用。我到处寻找解决办法,但似乎找不到一个直截了当的答案 有什么想法吗 谢谢, 瑞安Ms access “访问更改表”;“允许零长度”;,ms-access,Ms Access,我正在使用一个旧的Access数据库(是的,它非常难看,我讨厌它)。我需要修改我正在创建的VB应用程序中的一些列。我已经正确地设置了大多数修改,但我正在与这样一个事实抗争:将列修改为文本会使默认值“AllowZero Length”为false 所以 ALTER TABLE[申请人表格]ALTER COLUMN[申请人ID]文本(255) 我需要将“允许零长度”设置为true 我试过了 ALTER TABLE[申请人表格]ALTER COLUMN[申请人ID]文本(255)NULL 但这似乎也不
谢谢你的信息。我很高兴这是访问,而不是我
我想我只是想破解一下这个应用程序,因为整个数据模型都是垃圾。很久以前,我也想这么做,并且我觉得从DDL/SQL根本不可能做到这一点,但是你可以通过定位字段(table.fields)从VBA中实现并将AllowZeroLength设置为所需值此选项在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
我同意:此设置没有ACE/Jet语法。仔细想想,SQLDLL往往是标准的“可移植的”东西,在大多数SQL产品上都可以实现。大多数SQL没有显式(Dis)AllowZeroLength特性,因此它没有进入标准,因此不在ACE/Jet语法中 FWIW“便携式”解决方案也适用于ACE/Jet,它使用检查约束,例如:
ALTER TABLE [Applicant Table] ADD
CONSTRAINT Applicant_ID__not_zero_length
CHECK (LEN([Applicant ID]) > 0);
允许零长度值需要首先不创建CHECK约束(!!),或者删除它(如果它已经存在的话)
。。。但您为什么要允许标识符(“申请人ID”)长度为零呢?使用Interop.accdlib
试试这个:
DBLib dbLib = new DBLib();
dbLib.ConnectionString = ConnectionString;
dbLib.Initialize();
dbLib.ModifyTextFieledSetAllowZeroLength(ref TableName, ref FiledName);
子设置tempdbExample()
'设置临时数据库,以便在中运行报表数据。
“临时数据库按需关闭和重新创建(省去了在主数据库中压缩和修复的麻烦)。
'临时表可以重新链接到主数据库以进行进一步查询
Dim dbTemp作为数据库
将tblTemp调暗为TableDef
Dim idxTemp作为索引,idxTemp2作为索引
Const cTempPath=“C:\temp\”
Const cTempDB=“TempReportData”
'删除旧的临时数据库(如果数据库正在使用,Kill将失败。正常恢复。)
出错时继续下一步
如果Dir(cTempPath&cTempDB)“,则Kill(cTempPath&cTempDB)
关于错误转到错误处理程序
'创建一个新的临时数据库。
设置dbTemp=CreateDatabase(cTempPath&cTempDB,dbLangGeneral)
设置tblTemp=dbTemp.CreateTableDef(“临时样本”)
用tblTemp
.Fields.Append.CreateField(“示例_ID”,dbDouble)
.Fields.Append.CreateField(“SITE_ID”,dbText,38)
.Fields.Append.CreateField(“示例日期时间”,dbDate)
.Fields.Append.CreateField(“方法”,dbText,20)
.Fields.Append.CreateField(“矩阵”,dbText,20)
.Fields.Append.CreateField(“注释”,dbText,255)
.菲尔兹![注释].AllowZeroLength=True
设置idxTemp=.CreateIndex(“示例ID”)
idxTemp.Fields.Append.CreateField(“示例ID”)
idxTemp.Primary=True
设置idxTemp2=.CreateIndex(“站点ID”)
idxTemp2.Fields.Append.CreateField(“站点ID”)
以
dbTemp.TableDefs.Append tblTemp
tblTemp.index.Append idxTemp
tblTemp.INDEX.Append idxTemp2
设置tblTemp=Nothing
设置idxTemp=Nothing
设置dbTemp=Nothing
进出口银行:
出口接头
错误处理程序:
MsgBox错误说明(“&Err.Number&”)
恢复出口
端接头
在GUI(表格设计)中尝试时会发生什么?Allen Browne,MVP:“出于好奇,为什么要将此属性设置为“是”?也许是为了与其他软件兼容?对于一个非常奇怪的领域?一般来说,我认为这是一个很差的想法,因为:1)用户无法区分,2)Access无法区分。(请尝试使用DLookup()--
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