Изменить значения свойств столбца - PullRequest
3 голосов
/ 05 августа 2010

Как изменить все значения столбца (Nullable = True и Allow Zero Length = True) в таблице, кроме столбца PersonalID?Когда скрипт выполняется, я получаю сообщение об ошибке: -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

1 Ответ

2 голосов
/ 13 января 2011

Я предполагаю, что вы хотите, чтобы свойства Allow Zero Length и Nullable были установлены в true. Может показаться, что MS Access не позволяет вам устанавливать свойство Nullable через ADOX, так как, насколько я знаю, невозможно установить свойство Allow Zero Length с помощью команды ADO, поэтому вам нужно использовать и 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

это больше не проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...