解决ADOX中创建NullAble型字段的疑难

工作中碰到一个奇怪的问题,万恶的MS ACCESS,某个字段的“Unicode压缩”属性竟自动设置为FALSE,导致长度为50的NVARCHAR字段值自动以空格填充,成为定长字段。由于客户的数据不能拿过来,只能想办法以编程的方式去解决。以下记录解决的过程,充满了艰辛: 

  1. 通过DDL的方式。ADODB.Connection.Execute "ALTER TABLE [TableName] ADD COLUMN [NewColName] CHAR(50);"。通过这样的方式,字段的“Unicode压缩”属性自动为FALSE,不能解决问题。 

  2. 于是又想到在1的基础上再通过ADOX.Column.Propertys("Jet OLEDB:Compressed UNICODE Strings")=True方式,可死活失败,可能是“只写”属性。

  3. 以上方式都通不过,又想到以纯ADOX编程的方式去做。中途又碰到一个棘手的问题,通过ADOX.Columns.Append的方式添加的字段,然后竟然不能设置ADOX.Column.Propertys("NullAble")=TRUE或ADOX.Column.Attributes = adColNullable,都无法通过。 

  4. 搜了好多资料,都是同样的问题遭遇。最后,受一篇帖子的启发,想到可能是字段经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编辑  收藏  举报

导航