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