PDA

Ver la Versión Completa : Exportar de Interbase a tabla Access


VRO
18-01-2005, 12:57:11
Hola otra vez,
necesito algun ejemplillo ó manual donde encuentre como exportar datos de interbase a una tabla de Access, me gustaría hacerlo utilizando el Pallette Server de Delphi 6, pero si tengo que hacerlo con conexión ADO ó de alguna otra forma tampoco me importa.

Además me gustaría que la exportación me valiese para cualquier Access 97, 2000, XP.

Muchas gracias por su ayuda en este y en todos los casos anteriores.

Neftali [Germán.Estévez]
18-01-2005, 13:04:37
...me gustaría hacerlo utilizando el Pallette Server de Delphi 6, pero si tengo que hacerlo con conexión ADO ó de alguna otra forma tampoco me importa.

Además me gustaría que la exportación me valiese para cualquier Access 97, 2000, XP.
Justo creo que te será más sencillo hacerlo vía ADO que hacerlo con la paleta SERVERS.
(1) Pon un form con lo necesario para las dos conexiones (ADO: ADOConnection + ADOTable) y similar para la de IB/FB.
(2) Se trata de ir leyendo de uno y escribiendo en otro.

En cuanto a la segunda cuestión, justo con ADO conseguirás la independencia de la versión de Access, cosa que no es seguro si utilizas la paleta Servers.

VRO
19-01-2005, 19:16:40
Gracias Neftalí por tu rapida respuesta, así lo he hecho con conexión ADO para lo que he naufragado en la busqueda y he encontrado muchos hilos que tratan del tema, acontinuación cito el código utilizado por si ha alguien le sirve de ayuda, ya que he creado la base de datos directamente desde Delphi 6, lo cito porque esto sólo lo he encontrado en un hilo para facilitar la busqueda:

Primero comento lo que hace el codigo:

Crea la base de datos desde delphi con código, para ello,en el menú de Delphi voy a Projecti-> Importar TYpe Librery e importo la librería "Microsoft ADO ext. 2.1 for DLL and Security (versión 2.1)" después pulso "Create Unit " y pongo el código que después detallaré.
El código comprueba que esa base de datos no esté creada ya, si no está creada la crea , crea tambiñén la tabla y realiza el paso de datos.si la base da datos está creada ya, comprueba que la tabla no esté creada, si es así(no está creada) la crea y pasa lo datos, si está creada sólo pasa los datos (lo que viene acontinuación falta de hacer) sólo los datos que no estén ya introducidos.

Para haccer el codigo utilizo una conexion TADOConnection (llamada ADOConnect) y un query TADOQuery(llamado ADOQ) todo de la pestaña ADO de Delphi y un IBQuery de la pestaña Interbase (llamdo dlecturas).Os ruego que si se os ocurre una forma más rapida ó sencilla de hacer lo descrito con ADO me lo comuniqueis, por favor.


procedure TForm1.Exportardatos1Click(Sender: TObject);
const
DATABASENAME='C:\Archivos de programa\agua\datos\exportar.mdb';
var
catalog:_catalog;
ConnectionString:String;
begin

//Creamos el objeto catalogo
Catalog:=CreateComObject(StringToGUID('ADOX.Catalog')) as _Catalog;
//Cadena de conexión
ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+ DATABASENAME;
try
//Create new Access database por primera vez
Catalog.Create(ConnectionString);
//Conectamos con la base de datos creada.
datos.ADOConnect.ConnectionString:=ConnectionString+';Persist Security Info=False';
datos.ADOConnect.Connected:=true;
//Creamos la tabla texportar.
datos.ADOQ.SQL.Clear;
datos.ADOQ.SQL.Add('Create table texportar(contador int not null,fecha date not null,lectura float, consumo float, primary key(contador,fecha))');
datos.ADOQ.Open;

datos.dlecturas.First;
while datos.dlecturas.Eof=false do
begin
datos.ADOQ.SQL.Clear;
datos.ADOQ.SQL.Add('insert into texportar(contador,fecha,lectura,consumo)values('+ datos.dlecturas.fieldbyname('numero').text+','+FormatDateTime('dd/mm/yy',datos.dlecturas.fieldbyname('fecha').asFloat)+','+datos.dlecturas.fieldbyname('lectura').text+', '+datos.dlecturas.fieldbyname('consumo').text+')');
datos.ADOQ.Open;

datos.dlecturas.Next;
end;
except
on E:EOLEException do begin
//Levantamos la excepcion, si existe la base da datos, creamos la tabla y
//pasamos los datos
if Trim(E.Message)='La base de datos ya existe' then
begin
datos.ADOConnect.ConnectionString:=ConnectionString+';Persist Security Info=False';
datos.ADOConnect.connected:=true;
try
datos.ADOQ.SQL.Clear;
datos.ADOQ.SQL.Add('Create table texportar(contador int not null,fecha date not null,lectura float,consumo float, primary key(contador,fecha))');
datos.ADOQ.Open;

datos.dlecturas.First;
while datos.dlecturas.Eof=false do
begin
datos.ADOQ.SQL.Clear;
datos.ADOQ.SQL.Add('insert into texportar(contador,fecha,lectura,consumo)values('+datos.dlecturas.fieldbyname('numero').text+','+For matDateTime('mm/dd/yy',datos.dlecturas.fieldbyname('fecha').AsDateTime)+','+datos.dlecturas.fieldbyname('lectura').text +','+datos.dlecturas.fieldbyname('consumo').text+')');
datos.ADOQ.Open;

datos.dlecturas.Next;
end;
except
on E:EOLEException do begin
//Volvamos a lanzar otra excepcion si ya existe la tabla, pasamos datos
if Trim(E.Message)='La tabla ''texportar'' ya existe' then
begin
datos.dlecturas.First;
while datos.dlecturas.Eof=false do
begin
datos.ADOQ.SQL.Clear;
datos.ADOQ.SQL.Add('insert into texportar(contador,fecha,lectura,consumo)values('+datos.dlecturas.fieldbyname('numero').text+','+For matDateTime('mm/dd/yy',datos.dlecturas.fieldbyname('fecha').AsDateTime)+','+datos.dlecturas.fieldbyname('lectura').text +','+datos.dlecturas.fieldbyname('consumo').text+')');
datos.ADOQ.Open;

datos.dlecturas.Next;
end;
end
else
messageDLG('Error al crear la base de datos; Mensaje:'+ E.Message,mtError,[mbOk],0);
end;
end;
end
else
messageDLG('Error al crear la base de datos; Mensaje:'+ E.Message,mtError,[mbOk],0);
end;
end;
end;


Nota: me he dado cuenta que cuando crea la tabla ó
mete datos da un error que dice:
"ADOQ:CommandTex does not return a result set."
Estoy investigando a ver porque da ese error ya que
creo haberlo visto resuleto en un hilo, no obstante si sabeis
porque es os ruego me lo comuniqueis.

Pues lo dicho espero que le sirva a alguien,aunque debe sufrir alguna modificación que cuando esté terminada añadiré a este hilo.

Gracias por todo

Neftali [Germán.Estévez]
20-01-2005, 10:55:54
Yo te recomiendo que hagas las comprobaciones de existencuia tanto de la Base de Dats como de las tablas antes de ejecutar, en lugar de realizarlas en el tratamiento de excepciones; Con ésto conseguiras evitar código duplicado y más seguridad (por la comprobación del mensaje de las excepciones -eso no es muy seguro-).

Para la de la Base de Datos como es un archivo Access puedes usar FileExists y para la tabla el método GetTableNames del ADO Connection.

El código sería algo así:


procedure TForm1.Button2Click(Sender: TObject);
const
DATABASENAME='C:\Archivos de programa\agua\datos\exportar.mdb';
var
TS:TStringList;
Index:Integer;
begin

// Existe la Base de Datos?
if FileExists(DATABASENAME) then begin
// EXISTE
// ...
end
else begin
// NO EXISTE
// ...
end;

// Crear la lista
TS := TStringList.Create();
TS.Sorted := True;

// proteccion para liberar
try

// Recuperar nombres de tablas
ADOConnection1.GetTableNames(TS, False);

// Existe la tabla ?
if TS.Find('texportar', Index) then begin
// EXISTE
//...
end
else begin
// NO EXISTE
//...
end;

finally
TS.Free;
end;

end;