VERIFICAR TABELAS E/OU EXISTENTES VIA CODIGO

SURI 11/06/2010 09:58:46
#344574
E aí galera....

Tive uma idéia só não sei se é possível implementar. Quando os cliente pedem ferramentas novas nas aplicações, geralmente a base de dados também sofre alterações (aumento dum campo, uma tabela etc). A idéia é na hora de actualizar a aplicação nas máquinas, um gestor de updates interno fizesse a leitura das mudanças na base de dados e então rodá-se as rotinas de incremento dos novos campos nas respectivas tabelas e se for o caso criação das novas tabelas. Daí que é importante saber se é possível ler-se a arquitectura da BD via código.

LIZANDER 11/06/2010 10:34:24
#344579
Resposta escolhida
Sim... é possível sim... Existe uma função que eu uso, inclusive peguei aqui mesmo no VBMania que analisa se um campo existe ou não e inclui se não existir... Para tanto, o gestor de updates precisa sempre ser atualizado com a [Ô]estrutura[Ô] do bd e tabelas na versão da atualização. Acredito que um txt resolve o problema (pode-se até fazer o download desse txt via código, através do winsock).

Função:

Dim Con As ADODB.Connection
Dim Cat As ADOX.Catalog
Dim Tbl As ADOX.Table
Dim Col As ADOX.Column
Dim FSO As FileSystemObject


Private Function CriaCampoSeNaoExiste(BancodeDados As String, NomeTabela As String, NomeCampo As String, TipoCampo As Long, TamanhoCampo As Long)
[ô]Criar uma nova instância das Classes adodob e adodx
Set Con = New ADODB.Connection
Set Cat = New ADOX.Catalog
Set Tbl = New ADOX.Table
Set Col = New ADOX.Column
[ô]Criar uma instância do FSO
Set FSO = New FileSystemObject
[ô]Definir o caminho e o nome do MDB
Dim Caminho As String
Dim MyCampos As String
Caminho = BancodeDados
If Not FSO.FileExists(Caminho) Then
MsgBox [Ô]O Arquivo não existe[Ô]
Exit Function
End If
[ô]Abrir o Bd
Con.Open [Ô]Provider=Microsoft.Jet.OleDB.4.0;Data Source=[Ô] & Caminho
[ô]Definir a Conexão ativa
Cat.ActiveConnection = Con

For Each Tbl In Cat.Tables
If Tbl.Name = NomeTabela Then
For Each Col In Tbl.Columns
Tbl.Name = NomeTabela
[ô]Criar os Campos
With Tbl.Columns
If Len(MyCampos) = 0 Then
MyCampos = Col.Name
Else
MyCampos = MyCampos & [Ô],[Ô] & Col.Name
End If
End With
Next

With Tbl.Columns
If InStr(MyCampos, NomeCampo) = 0 Then
.Append NomeCampo, TipoCampo, TamanhoCampo
End If
End With
End If
Next

Set Con = Nothing
Set Cat = Nothing
Set Tbl = Nothing
Set Col = Nothing
End Function


Então a chamada fica assim(exemplo):
Call CriaCampoSeNaoExiste(App.path & [Ô]\data\dbsci.mdb[Ô], [Ô]CASAS[Ô], [Ô]EMAIL[Ô], adVarWChar, 50)

SURI 14/06/2010 06:24:03
#344725
Valeu Lizander, funcionou. Para facilitar o trabalho vou configurar um servidor com as actualizações, assim todo cliente desde que pague para a actualização recebe uma senha de acesso e baixa as actualizações, depois é só rodfar o gestor de update localmente.

Brigadjinho
Tópico encerrado , respostas não são mais permitidas