解决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。 

 


以下是代码:

ContractedBlock.gif ExpandedBlockStart.gif Code
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
 

转载于:https://www.cnblogs.com/flashcloud/archive/2009/01/20/1378881.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值