2010-08-04 155 views
3

如何在除PersonalID列之外的表中更改所有列值(Nullable = True和Allow Zero Length = True)?当脚本执行时,我得到错误 “-2147217887 - 多步OLE DB操作产生错误。检查每个OLE DB状态值(如果可用),没有工作完成。” 这是只有一个表的代码。我需要创建更多的表,所以设置每列的Nullable属性是不实际的。请帮助!更改列的属性值

Public Sub DBcreation() 
Dim tbl As New Table 
Dim cat As New ADOX.Catalog 
Dim col As ADOX.Column 
Dim prp As ADOX.Property 
Dim oCn As ADODB.Connection 
Dim sConStr As String 


'Set Connection string 
sConStr = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
         "Data Source=" & App.Path & "\mydbase.mdb" & ";" & _ 
         "Jet OLEDB:Engine Type=4;" 
' 1) Create the DataBase 
cat.Create sConStr 

' 2) Create Table name "PDetails" 
tbl.Name = "PDetails" 
' 3) Add Fields 
With tbl.Columns 
.Append "PersonalID", adInteger 'Number 
.Append "GHName", adVarWChar, 50 'Text 
.Append "FirstName", adVarWChar, 50 'Text 
.Append "FHName", adVarWChar, 50 'Text 
.Append "Surname", adVarWChar, 50 'Text 
.Append "BirthDate", adDate 
.Append "Gender", adVarWChar, 10 'Text 
.Append "Address", adLongVarWChar 'Memo 
.Append "Pincode", adInteger 'Number 
.Append "MobileNo", adInteger 'Number 
.Append "HomeNo", adInteger 'Number 
.Append "MaritalStatus", adVarWChar, 10 'Text 
.Append "Profession", adVarWChar, 50 'Text 
.Append "BloodGroup", adVarWChar, 10 'Text 
.Append "Photo", adVarWChar, 50 'Text 

' 4) 'Set the field properties. 


With !PersonaltID 'AutoNumber. 
.ParentCatalog = cat 
.Properties("Autoincrement") = True 
.Properties("Description") = "Automatically " & _ 
"generated unique identifier for this record." 
End With 

With !BirthDate 
Set .ParentCatalog = cat 
.Properties("Jet OLEDB:Column Validation Rule") = _ 
    "Is Null Or <=Date()" 
.Properties("Jet OLEDB:Column Validation Text") = _ 
    "Birth date cannot be future." 
End With 

End With 
' 5) Save the Table to the DataBase 
    cat.Tables.Append tbl 
' 6) Set Column Properties  
    For Each col In tbl.Columns 
    For Each prp In col.Properties 
    If col.Name <> "PersonalID" Then 
    If prp.Name = "Nullable" Then 
    prp.Value = True 'error generated 
    '-2147217887 - Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done. 
    End If 
    End If 
    Next 
    Next 

'Clean up 

    Set tbl = Nothing 
    Set cat = Nothing 
    set prp = Nothing 
    End Sub 
+0

只是一个小小的错字“With!PersonaltID'自动编号。'应该是'With!PersonalID'AutoNumber。' – jakdep 2011-01-13 14:38:41

回答

2

我假设你希望Allow Zero Length和Nullable属性都设置为true。看起来MS Access不允许你通过ADOX设置Nullable属性,就像我所知,用ADO命令设置Allow Zero Length属性是不可能的,所以你需要使用ADOX和ADO命令。这是我怎么会去这样做:

6) Set Column Properties 
    For Each col In tbl.Columns 
     For Each prp In col.Properties 
      If col.Name <> "PersonalID" Then 
       col.Properties("Jet OLEDB:Allow Zero Length").Value = True 
      End If 
     Next 
    Next 

    Set oCn = cat.ActiveConnection 

    SetColumnToNullable oCn, "PDetails", "GHName", "VARCHAR(50)" 

    oCn.Close 

    ''' 
    End Sub 


Private Sub SetColumnToNullable(ByRef poCn As ADODB.Connection, _ 
           ByVal pstrTableName As String, _ 
           ByVal pstrColumnName As String, _ 
           ByVal pstrDataType As String) 

    poCn.Execute "ALTER TABLE " & pstrTableName & " ALTER COLUMN " & pstrColumnName & " " & pstrDataType & " NULL" 
End Sub 

这种方法的另一个好处是,以前的目录开到处于打开的执行完成后,与数据库的连接。

随着

oCn.Close 

这不再是一个问题。