CHECAR SE UM CAMPO EXISTE NO ACCESS

EDUPAVANI 26/03/2011 13:43:45
#369260
Pessoal

Tenho um sistema instalado em várias empresas, quando faço uma alteração no banco para alguém, os demais ficam sem essa alteração.
Preciso de uma função que teste o banco de dados (access) e verifique se os campos estão todos lá, senão, deve ser criado o campo.
Alguém me ajuda? é urgente...
HIDDEN 26/03/2011 14:10:21
#369263
Resposta escolhida
Você utiliza DAO ou ADO?

Para você criar uma base de dados Access devemos usar a ADOX .

Public Function CreateDB(Path As String) As Boolean
On Error Resume Next
Dim Catalog As New ADOX.Catalog
Catalog.Create [Ô]Provider=Microsoft.Jet.OLEDB.4.0;Data Source=[Ô] & Path
CreateDB = Err.Number = 0
End Function


Você deve fazer referência ao Microsoft ADO Ext. 2.X for DDL and Security (menu Project | References).

Para criar uma tabela com ADOX, faça assim:

Function CreateTbl() as Boolean
Dim Catalogo As New ADOX.Catalog
Dim tbl As New ADOX.Table
Catalogo.ActiveConnection = [Ô]Provider=Microsoft.Jet.OLEDB.4.0;[Ô] & [Ô]Data Source=C:
wind.mdb;[Ô]
With tbl
.Name = [Ô]Contatos[Ô]
.Columns.Append [Ô]Nome[Ô], adVarWChar
.Columns.Append [Ô]Endereco[Ô], adVarWChar
.Columns.Append [Ô]Telefone[Ô], adVarWChar
.Columns([Ô]Telefone[Ô]).Attributes = adColNullable
End With

Catalogo.Tables.Append tbl
Set Catalogo = Nothing
End Function


Os nomes dos tipos de dados para as colunas são diferentes das usadas na DAO.

Tipos de Dados ADO :


adBinary
adBoolean
adUnsignedTinyInt
adCurrency
adDate
adNumeric
adDouble
adGUID
adSmallInt
adInteger
adLongVarBinary
adLongVarWChar
adSingle
adVarWChar


Bem, aqui você aprendeu como criar uma base de dados, tabelas e campos. Já pode te dar um norte. Não me lembro exatamente como testar a existencia de um campo específico. Mais tarde eu tento descobrir.

Mas para você ir tentando: tente capturar o erro, e, assim, criar o campo... sei lá. Vai pensando aí.
EDUPAVANI 26/03/2011 14:59:35
#369272
Legal, eu já consigo criar os campos, mas preciso checar se os mesmo já existem.
Agora esse é o problema.
MARCELO.TREZE 26/03/2011 17:05:43
#369287
assim colega uma função que pode ser adaptada para isto

o código abaixo irá listar as tabelas em um listbox todas tabelas e campos de um banco de dados, basta vc fazer as comparaçoes

Sub ListarTabelasADO()
Dim Conn As New ADODB.Connection
Dim TablesSchema As ADODB.Recordset
Dim ColumnsSchema As ADODB.Recordset
Conn.Provider = [Ô]MSDASQL[Ô]
Conn.Open [Ô]Provider=Microsoft.Jet.OLEDB.4.0;[Ô] & _
[Ô]Data Source=[Ô] & App.Path &[Ô]\SeuBD.MDB;Jet [Ô] & _
[Ô]OLEDB:Database Password=senha;[Ô]
Set TablesSchema = Conn.OpenSchema(adSchemaTables)
Do While Not TablesSchema.EOF
DoEvents
Set ColumnsSchema = Conn.OpenSchema(adSchemaColumns, _
Array(Empty, Empty, [Ô][Ô] & TablesSchema([Ô]TABLE_NAME[Ô])))
Do While Not ColumnsSchema.EOF
DoEvents
List1.AddItem TablesSchema([Ô]TABLE_NAME[Ô]) & [Ô], [Ô] & _
ColumnsSchema([Ô]COLUMN_NAME[Ô])
ColumnsSchema.MoveNext
Loop
TablesSchema.MoveNext
Loop
End Sub


para usar

call ListarTabelasADO
MARCELO.TREZE 26/03/2011 17:10:32
#369288
ou se preferir pode usar um projetinho como este:

http://www.vbmania.com.br/pages/index.php?varModulo=Detalhe&varID=6861
HIDDEN 26/03/2011 19:55:18
#369302
Tente isso e veja se da certo:

If (Not rs([Ô]Campo[Ô]) Is Nothing) Then
[ô]o campo existe
Else
[ô]o campo não existe
End If


Onde rs é o seu RecordSet, e Campo o campo que você deseja verificar.
HIDDEN 26/03/2011 20:07:32
#369306
Aliás, esqueça o código acima. Tente isso:

Function VerificaTabela() as Boolean

On Error Goto Erro

Dim tb As New ADODB.Recordset
tb.Open [Ô]SELECT * FROM usuarios[Ô], Conn, adOpenForwardOnly, adLockOptimistic
If Not tb.Fields([Ô]E2[Ô]) Is Nothing Then
MsgBox [Ô]porra[Ô]
End If

Exit FUnction
Erro:

Select Case Err
Case 3265 [ô]O campo não existe
[ô]Criar o campo com o código do post 1
Resume Next
Case Else
[ô]Outro tipo de erro
End Select

End Function


Essa função explora o erro gerado ao tentar acessar um campo que não existe.
Tópico encerrado , respostas não são mais permitidas