解决ADOX中创建NullAble型字段的疑难
工作中碰到一个奇怪的问题,万恶的MS ACCESS,某个字段的“Unicode压缩”属性竟自动设置为FALSE,导致长度为50的NVARCHAR字段值自动以空格填充,成为定长字段。由于客户的数据不能拿过来,只能想办法以编程的方式去解决。以下记录解决的过程,充满了艰辛:
- 通过DDL的方式。ADODB.Connection.Execute "ALTER TABLE [TableName] ADD COLUMN [NewColName] CHAR(50);"。通过这样的方式,字段的“Unicode压缩”属性自动为FALSE,不能解决问题。
- 于是又想到在1的基础上再通过ADOX.Column.Propertys("Jet OLEDB:Compressed UNICODE Strings")=True方式,可死活失败,可能是“只写”属性。
-
以上方式都通不过,又想到以纯ADOX编程的方式去做。中途又碰到一个棘手的问题,通过ADOX.Columns.Append的方式添加的字段,然后竟然不能设置ADOX.Column.Propertys("NullAble")=TRUE或ADOX.Column.Attributes = adColNullable,都无法通过。
- 搜了好多资料,都是同样的问题遭遇。最后,受一篇帖子的启发,想到可能是字段经Append添加后,某些属性就变成了只读,于是再次尝试,终于解决问题。将字段的“NullAble”设置为True。
以下是代码:
Private Sub MethodName(ByVal cn As ADODB.Connection)
On Error GoTo errHandler
Dim adoxCat As ADOX.Catalog
Dim adoxTable As ADOX.Table
Dim adoxCol As ADOX.Column
Dim adoxProperty As ADOX.Property
Dim strAllowEmpty As String
Dim strAllowNull As String
cn.BeginTrans
isTrans = True
Set adoxCat = New ADOX.Catalog
Set adoxCat.ActiveConnection = cn
Set adoxTable = adoxCat.Tables("TableName")
strAllowEmpty = "Jet OLEDB:Allow Zero Length"
strAllowNull = "NullAble"
'1.
'cn.Execute "ALTER TABLE [stockProduct] ADD COLUMN [ColName] CHAR(50);" '字段的“Unicode压缩”属性自动为FALSE,不能是TRUE
'2
'adoxTable.Columns.Append "ColName", adWChar, 50
'adoxTable.Columns("ColName").Properties(strAllowEmpty) = True '此句有效,不知为什么。
'adoxTable.Columns("ColName").Properties(strAllowNull).Value = True '无效,运行时出错,又为什么
'adoxTable.Columns("ColName").Attributes = adColNullable '与上句同样的意图,也错
'4
Set adoxCol = New ADOX.Column
With adoxCol
.Name = "ColName"
.Type = adWChar
.DefinedSize = 50
.Attributes = adColNullable '!!关键:在未Append该Column之前,此处设置adColNullable。解决!!
'.Properties(strAllowEmpty) = True '未Append前,Properties集合没有元素
'.Properties(strAllowNull) = True '未Append前,Properties集合没有元素
End With
adoxTable.Columns.Append adoxCol '创建好Column对象后,再Append
adoxCol.Properties(strAllowEmpty) = True
cn.CommitTrans
Exit Sub
errHandler:
MsgBox err.Source & vbCrLf & err.Description, vbCritical
If isTrans = True Then
cn.RollbackTrans
End If
If Not cn Is Nothing Then
If cn.State = adStateOpen Then
cn.Close
End If
Set cn = Nothing
End If
posted on 2009-01-20 13:39 flashcloud 阅读(612) 评论(0) 编辑 收藏 举报