Re: [firebase-br] OFF: Migração de Banco

COS cos em dbtools.com.br
Qua Jul 5 13:35:56 -03 2006


Paulo,

Baixa o DBTools Manager em http://www.dbtools.com.br/EN/downloads. Ele migra
do MSAccess para Firebird/Interbase sem problemas, incluindo campos Memo e
Binário. Este não é um problema do MSAccess. O problema existe nos drivers
DAO/ADO (e também ODBC) que precisam de tratamento especial para campos
BLOB. O DBManager faz esse tratamento durante o processo de conversão, que
consiste em dividir o BLOB em pacotes e enviá-lo ao servidor Firebird
utilizando a API cliente específica para este processo.
O DBManager só funciona no Windows e não é gratuito. Entretanto a versão
TRIAL funciona por 20 dias, o que dará tempo suficiente para fazer o
trabalho de migração.

Atenção para um detalhe: Se você utilizar o MSAccess para inserir dados
binários no database você pode ter problemas ao convertê-lo para outros
engines. O problema consiste no fato de que quando se faz diretamente pelo
MSAccess, ele adiciona um header (OLE) adicional antes do próprio dado
binário. Com isso outros aplicativos não podem ler este arquivo
corretamente. Veja exemplo abaixo:

- Inserir uma imagem BMP (no database MDB) utilizando o próprio MSAccess
adiciona também um header que identifica o objeto OLE (para bitmap). Neste
caso o MSAccess pode exibir a imagem em formulários. Entretanto o dado no
banco está incorreto uma vez que ele possui um header adicional que
identifica o objeto OLE.

Se você manipula essas informações em VB/VC++ ou outra linguagem este
problema não ocorre.

Abaixo uma pequena lista dos problemas mais comuns quanto a conversão do
MSAccess para outros engines (o que inclui Interbase/Firebird):

1) Utilização de Funções como Default de colunas
2) Nomes de campos utilizando palavras reservadas no engine destino, além é
claro de caracteres inválidos
3) Arquivos binários inseridos pelo MSAccess (Objetos OLE)

Espero que isso o ajude de alguma forma.

Atenciosamente,

COS


----- Original Message ----- 
From: "Paulo Henrique Mendes Martin" <paulo.mendes87 em gmail.com>
To: "Carlos H. Cantu" <listas em warmboot.com.br>; "FireBase"
<lista em firebase.com.br>
Sent: Wednesday, July 05, 2006 8:44 AM
Subject: Re: [firebase-br] OFF: Migração de Banco


Obrigado por terem me ajudado. Eduardo quanto ao Script de Migração eu já
fiz tanto que não sei se vem ao caso colocá-lo aqui, mas eu vou colocar


Public Access As DAO.Database
Public WS As DAO.Workspace
Public AccessRS As DAO.Recordset


Public Cn As New ADODB.Connection
Public Rs As New ADODB.Recordset
Public Reg As Integer
Public P As Integer

Public Sub Abre_Bco_Access() 'aqui abrimos o banco de dados do Access

Set WS = DBEngine.Workspaces(0)
Set Access = WS.OpenDatabase("D:\Projetos\Database
Firebird\CADSOCIO\CADSOCIO.mdb", False, False)
Exit Sub

End Sub
Public Sub Abre_Bco_Firebird() ' Abrindo agora o banco de dados do Firebird

Cn.ConnectionString = "DRIVER=Firebird/InterBase(r)
driver;UID=SYSDBA;PWD=masterkey;DBNAME=D:\Projetos\Database
Firebird\CADSOCIO\CADSOCIO.FDB"
Cn.Open

End Sub

Public Sub Adiciona_Firebird()

Dim SqlA As String
Dim SqlF As String
Dim cont As Integer

SqlA = "SELECT * FROM sócios" 'Aqui é o SQL da tabela do Access
Set AccessRS = Access.OpenRecordset(SqlA) ' Setamos o recorset para a tabela
do access com a devida consulta

AccessRS.MoveFirst 'movendo para o primeiro registro antes de começar o Loop

f = Array("REGSOC", "NOMSOC", "CODCAT", "CODSIT", "DTLIM", "DTNASC", "SEXO",
"CODCIV", "DTADM", "DTDEM", "TIPO", "RUA", "NUM", "COMPL", "BAIRRO", "CID",
"EST", "CEP", "FONE", "FONE2", "FONE3", "EXAME", "OBSERVACOES",
"TRANSFERENCIA", "CONTROVIA", "PROVISORIO", "ICARD", "CARNE", "VOTO",
"CONVITE", "CONVITE2", "CX", "CX2", "CT", "email", "PROMO", "CPF", "E",
"RG", "ESCOLARIDADE")

Do Until AccessRS.EOF
    x = Array(AccessRS("REGSOC"), AccessRS("NOMSOC"), AccessRS("CODCAT"),
AccessRS("CODSIT"), AccessRS("DTLIM"), AccessRS("DTNASC"), AccessRS("SEXO"),
AccessRS("CODCIV"), AccessRS("DTADM"), AccessRS("DTDEM"), AccessRS("TIPO"),
AccessRS("RUA"), AccessRS("NUM"), AccessRS("COMPL"), AccessRS("BAIRRO"),
AccessRS("CID"), AccessRS("EST"), AccessRS("CEP"), AccessRS("FONE"),
AccessRS("FONE2"), AccessRS("FONE3"), AccessRS("EXAME"),
AccessRS("OBSERVAÇÕES"), AccessRS("TRANSFERÊNCIA"), AccessRS("CONTROVIA"),
AccessRS("PROVISORIO"), AccessRS("ICARD"), AccessRS("CARNÊ"),
AccessRS("VOTO"), AccessRS("CONVITE"), AccessRS("CONVITE2"), AccessRS("CX"),
AccessRS("CX2"), AccessRS("CT"), AccessRS("email"), AccessRS("PROMO"),
AccessRS("CPF"), AccessRS("E"), AccessRS("RG"), AccessRS("ESCOLARIDADE"))
    For cont = 0 To 0
        Cn.BeginTrans
        SqlF = "Insert Into SOCIOS (" & f(cont) & ") values" & "('" &
x(cont) & "')" & ""
        Cn.Execute (SqlF)
        For cont2 = 1 To 38
            If IsNull(x(cont2)) = True Then
                GoTo proximo
            End If
           ' If cont2 = 25 Then x(cont2) = 0
             If cont2 = 4 Or cont2 = 5 Or cont2 = 8 Or cont2 = 9 Or cont2 =
21 Or cont2 = 37 Then
                If IsNull(x(cont2)) = True Or x(cont2) = "" Then
                    GoTo proximo
                Else
                    x(cont2) = Left(x(cont2), 2) & "." & Mid(x(cont2), 4, 2)
& "." & Right(x(cont2), 4)
                End If
                SqlF = "Update SOCIOS Set socios." & f(cont2) & "=" & "(' "
& x(cont2) & "')" & ""
            Else
                SqlF = "Update SOCIOS Set socios." & f(cont2) & "=" & "('" &
x(cont2) & "')" & ""
            End If
            Cn.Execute (SqlF)
proximo:
        Next
    Cn.CommitTrans
    Next
    Me.pb_main.Value = P + 1
    Reg = Reg + 1
    Me.Label1.Caption = Reg
    AccessRS.MoveNext
Loop
Cn.Close 'Fechando o Banco de Dados do Firebird


End Sub
Private Sub Command1_Click()


P = 1
Reg = 1

Call Abre_Bco_Access
Call Abre_Bco_Firebird
Call Adiciona_Firebird

MsgBox ("Banco Exportado Com sucesso"), vbInformation, "AVISO"


End Sub
-----------------------


Certo, mas como falei quando ele chegava no campo tipo Blob ele dava uma
mensagem de erro (erro do Firebird) dizendo que o tipo String colocado na
variável do vetor X era incompatível com o campo Blob para o qual eu ia
migrar.

Agradeço ao Cantu pois eu consegui migrar PARTE dos dados com aquele
software mas as tabelas que tem campos MEMO no access dão uma mensagem de
erro assim quando vou abrir no Firebird (utilizo o IBExpert para fazer tal
acesso)

   can't format message 13:198 - message file c:\HK-Software\firebird.msg
not found.
   Atithimetic exception, numeric overflow, or string truncation.
   Cannot transliterate character detween character sets

Gostaria de saber se alguém por favor poderia dizer, será problema com o
banco de dados em Access... Diga-se de passagem que estou trabalhando nesta
empresa a pouco tempo e não fui eu que montei a estrutura desse banco, que
na minha opinião está bem mal projetado (digo o banco em si).

Mais alguma informação é só pedirem... eu ainda sou Newbie em Firebird,
estou aprendendo com o tempo e com os erros e acertos.
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa





Mais detalhes sobre a lista de discussão lista