I'm trying to update a database structure from another (updated) database.
When i'm creating the missing fields i can't determine the field
properties.
I can find what is the name of the missing field, i can determine its
type,
but for instance if the field is a 'Yes/No' field i'm not able to
determine
if in the field properties the value 'necessary' is true or false, or if
it's
index or not, and if it is, what type of index its using. Is there any way
to
do this (find and set the field properties)?
The code i'm using is this:
Private Sub iniciaTabela(ByVal strNomeTabela As String, ByRef myTable As
ADOX.Table, _
ByVal tabelaDestino As ADOX.Table)
Dim intContador As Integer
Dim intIndex As Integer
Dim intInnerIndex As Integer
Dim intIndexColumn As Integer
Dim intInnerIndexColumn As Integer
Dim col As ADOX.Column
Dim bolFound As Boolean
Dim bolIndexFound As Boolean
Dim strErrInfo As String
Dim ADOXindex As New ADOX.Index
Dim intProperties As Integer
On Error GoTo ErrHandler
For Each tabelaDestino In Cat2.Tables
If myTable.Name = tabelaDestino.Name Then
For intContador = 0 To myTable.Columns.Count - 1
bolFound = False
For Each col In tabelaDestino.Columns
If col.Name = myTable.Columns.Item(intContador).Name Then
If col.Type <> myTable.Columns.Item(intContador).Type
Then
strErrInfo = "Erro ao tentar actualizar o TIPO de
campo na base dados " & m_bdDestino & " através da base de dados " &
m_bdOrigem & " na tabela " & col.Name
col.Type = myTable.Columns.Item(intContador).Type
End If
If col.Attributes <>
myTable.Columns.Item(intContador).Attributes Then
strErrInfo = "Erro ao tentar actualizar os
atributos
de campo na base dados " & m_bdDestino & " através da base de dados " &
m_bdOrigem & " na tabela " & col.Name
col.Attributes =
myTable.Columns.Item(intContador).Attributes
End If
If col.DefinedSize <>
myTable.Columns.Item(intContador).DefinedSize Then
strErrInfo = "Erro ao tentar actualizar o 'defined
size' de campo na base dados " & m_bdDestino & " através da base de dados
" &
m_bdOrigem & " na tabela " & col.Name
col.DefinedSize =
myTable.Columns.Item(intContador).DefinedSize
End If
If col.NumericScale <>
myTable.Columns.Item(intContador).NumericScale Then
strErrInfo = "Erro ao tentar actualizar o 'numeric
scale' de campo na base dados " & m_bdDestino & " através da base de
dados "
& m_bdOrigem & " na tabela " & col.Name
col.NumericScale =
myTable.Columns.Item(intContador).NumericScale
End If
If col.Precision <>
myTable.Columns.Item(intContador).Precision Then
strErrInfo = "Erro ao tentar actualizar a
PRECISÃO
de campo na base dados " & m_bdDestino & " através da base de dados " &
m_bdOrigem & " na tabela " & col.Name
col.Precision =
myTable.Columns.Item(intContador).Precision
End If
If col.RelatedColumn <>
myTable.Columns.Item(intContador).RelatedColumn Then
col.RelatedColumn =
myTable.Columns.Item(intContador).RelatedColumn
End If
If col.SortOrder <>
myTable.Columns.Item(intContador).SortOrder Then
col.SortOrder =
myTable.Columns.Item(intContador).SortOrder
End If
bolFound = True
Exit For
End If
Next
If Not bolFound Then
tabelaDestino.Columns.Append
myTable.Columns.Item(intContador).Name,
myTable.Columns.Item(intContador).Type,
myTable.Columns.Item(intContador).DefinedSize
If
tabelaDestino.Columns.Item(myTable.Columns.Item(intContador).Name).Type <>
myTable.Columns.Item(intContador).Type Then
strErrInfo = "Erro ao tentar actualizar o TIPO de
campo
na base dados " & m_bdDestino & " através da base de dados " & m_bdOrigem
& "
na tabela " & col.Name
tabelaDestino.Columns.Item(myTable.Columns.Item(intContador).Name).Type =
myTable.Columns.Item(intContador).Type
End If
If
tabelaDestino.Columns.Item(myTable.Columns.Item(intContador).Name).Attributes
<> myTable.Columns.Item(intContador).Attributes Then
strErrInfo = "Erro ao tentar actualizar os ATRIBUTOS
de
campo na base dados " & m_bdDestino & " através da base de dados " &
m_bdOrigem & " na tabela " & col.Name
tabelaDestino.Columns.Item(myTable.Columns.Item(intContador).Name).Attributes
= myTable.Columns.Item(intContador).Attributes
End If
If
tabelaDestino.Columns.Item(myTable.Columns.Item(intContador).Name).DefinedSize
<> myTable.Columns.Item(intContador).DefinedSize Then
strErrInfo = "Erro ao tentar actualizar o 'DEFINED
SIZE'
de campo na base dados " & m_bdDestino & " através da base de dados " &
m_bdOrigem & " na tabela " & col.Name
tabelaDestino.Columns.Item(myTable.Columns.Item(intContador).Name).DefinedSize
= myTable.Columns.Item(intContador).DefinedSize
End If
If
tabelaDestino.Columns.Item(myTable.Columns.Item(intContador).Name).NumericScale
<> myTable.Columns.Item(intContador).NumericScale Then
strErrInfo = "Erro ao tentar actualizar o 'NUMERIC
SCALE' de campo na base dados " & m_bdDestino & " através da base de
dados "
& m_bdOrigem & " na tabela " & col.Name
tabelaDestino.Columns.Item(myTable.Columns.Item(intContador).Name).NumericScale
= myTable.Columns.Item(intContador).NumericScale
End If
If
tabelaDestino.Columns.Item(myTable.Columns.Item(intContador).Name).Precision
<> myTable.Columns.Item(intContador).Precision Then
strErrInfo = "Erro ao tentar actualizar a PRECISÃO de
campo na base dados " & m_bdDestino & " através da base de dados " &
m_bdOrigem & " na tabela " & col.Name
tabelaDestino.Columns.Item(myTable.Columns.Item(intContador).Name).Precision
= myTable.Columns.Item(intContador).Precision
End If
If
tabelaDestino.Columns.Item(myTable.Columns.Item(intContador).Name).RelatedColumn
<> myTable.Columns.Item(intContador).RelatedColumn Then
strErrInfo = "Erro ao tentar actualizar a 'RELATED
COLUMN' de campo na base dados " & m_bdDestino & " através da base de
dados "
& m_bdOrigem & " na tabela " & col.Name
tabelaDestino.Columns.Item(myTable.Columns.Item(intContador).Name).RelatedColumn
= myTable.Columns.Item(intContador).RelatedColumn
End If
If
tabelaDestino.Columns.Item(myTable.Columns.Item(intContador).Name).SortOrder
<> myTable.Columns.Item(intContador).SortOrder Then
strErrInfo = "Erro ao tentar actualizar a 'SORTED
ORDER'
de campo na base dados " & m_bdDestino & " através da base de dados " &
m_bdOrigem & " na tabela " & col.Name
tabelaDestino.Columns.Item(myTable.Columns.Item(intContador).Name).SortOrder
= myTable.Columns.Item(intContador).SortOrder
End If
End If
DoEvents
Next intContador
For intIndex = 0 To tabelaDestino.Indexes.Count - 1
If intIndex > tabelaDestino.Indexes.Count - 1 Then Exit For
tabelaDestino.Indexes.Delete intIndex
DoEvents
Next intIndex
For intIndex = 0 To myTable.Indexes.Count - 1
'Set idx = tabelaDestino.Indexes
td.CreateIndex(txtIndexName.Text)
Set ADOXindex = New ADOX.Index
strErrInfo = "Indice: " & myTable.Indexes(intIndex).Name
ADOXindex.Name = myTable.Indexes(intIndex).Name 'name of index
For intInnerIndex = 0 To
myTable.Indexes(intIndex).Columns.Count
- 1
strErrInfo = "Indice: " & myTable.Indexes(intIndex).Name &
", Coluna: " & myTable.Indexes(intIndex).Columns(intInnerIndex).Name
ADOXindex.Columns.Append
myTable.Indexes(intIndex).Columns(intInnerIndex).Name ',
myTable.Indexes(intIndex).Columns(intInnerIndex).Type,
myTable.Indexes(intIndex).Columns(intInnerIndex).DefinedSize
'tabelaDestino.Indexes(intIndex).Columns.Append
myTable.Indexes(intIndex).Columns(intInnerIndex).Name ',
myTable.Indexes(intIndex).Columns(intInnerIndex).Type,
myTable.Indexes(intIndex).Columns(intInnerIndex).DefinedSize
Next intInnerIndex
tabelaDestino.Indexes.Append ADOXindex
DoEvents
Next intIndex
Exit For
End If
Next
Exit Sub
ErrHandler:
If (Err.Description <> "O índice já existe.") And
(InStr(Err.Description, "Não tem a autorização necessária para
utilizar o
objecto") = 0) And _
(InStr(Err.Description, "durante a sua abertura; mas a tabela não
pode ser bloqueada enquanto estiver em utilização. Aguarde um momento e
tente de novo.") = 0) And _
(Err.Description <> "A operação não é permitida neste
contexto.") And _
(InStr(Err.Description, "Object variable or With block variable not
set") = 0) And _
(InStr(Err.Description, "O método não é su****tado **** este
fornecedor") = 0) And _
(InStr(Err.Description, "argumentos são de tipo incorrecto, estão
fora do intervalo aceitável ou estão em conflito uns com os outros") =
0) And
_
(InStr(Err.Description, "A operação de múltiplos passos OLE DB
gerou
erros. Verifique cada valor de estado OLE DB, se disponível") = 0) Then
intRegisto = intRegisto + 1
m_Lvw.ListItems.Add intRegisto, "A" & CStr(intRegisto), "BD:" &
m_bdDestino & " " & strErrInfo & " (" & Err.Number & ") " &
Err.Description
End If
Resume Next
End Sub


|