database - reciente - convertir base de datos access 2010 a 2013
Cómo importar un archivo de Excel en la base de datos de Access, usando Delphi (1)
Estoy escribiendo una aplicación de base de datos, usando Delphi y necesito importar datos en una hoja de Excel y guardarlos en una base de datos de acceso. No tengo idea de cómo hacer esto, qué componentes usar o si es posible, ¿pueden ayudarme?
Tienes varias opciones, prueba uno de estos
1) usando la función DoCmd.TransferSpreadsheet
, este método es más simple pero no muy flexible.
{$APPTYPE CONSOLE}
{$R *.res}
uses
SysUtils,
ActiveX,
ComObj;
procedure ImportDataAccess(const AccessDb, TableName, ExcelFileName:String);
Const
acQuitSaveAll = $00000001;
acImport = $00000000;
acSpreadsheetTypeExcel9 = $00000008;
acSpreadsheetTypeExcel12 = $00000009;
var
LAccess : OleVariant;
begin
//create the COM Object
LAccess := CreateOleObject(''Access.Application'');
//open the access database
LAccess.OpenCurrentDatabase(AccessDb);//if the access database doesn''t exist use the NewCurrentDatabase method instead.
//import the data
LAccess.DoCmd.TransferSpreadsheet( acImport, acSpreadsheetTypeExcel9, TableName, ExcelFileName, True);
LAccess.CloseCurrentDatabase;
LAccess.Quit(1);
end;
begin
try
CoInitialize(nil);
try
ImportDataAccess(''C:/Data/Database1.accdb'',''Sales'',''C:/Data/Sales.xlsx'');
Writeln(''Done'');
finally
CoUninitialize;
end;
except
on E:EOleException do
Writeln(Format(''EOleException %s %x'', [E.Message,E.ErrorCode]));
on E:Exception do
Writeln(E.Classname, '':'', E.Message);
end;
Writeln(''Press Enter to exit'');
Readln;
end.
2) utilizando los componentes de ado, de una manera más flexible.
{$APPTYPE CONSOLE}
{$R *.res}
uses
Data.DB,
Data.Win.ADODB,
SysUtils,
ActiveX,
ComObj;
procedure ImportDataADO(const AccessDb, TableName, ExcelFileName:String);
var
LAdoQueryExcel : TADOQuery;
LADOAccesCmd : TADOCommand;
begin
LAdoQueryExcel:=TADOQuery.Create(nil);
LADOAccesCmd:=TADOCommand.Create(nil);
try
//set the connection string for access
LADOAccesCmd.ConnectionString:=Format(''Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%s;'',[AccessDb]);
LADOAccesCmd.Parameters.Clear;
LADOAccesCmd.CommandText:=''INSERT INTO Sales (id,name) VALUES (:id,:name)'';
LADOAccesCmd.ParamCheck:=False;
//set the connection string for excel
LAdoQueryExcel.ConnectionString:=Format(''Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%s;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1"'',[ExcelFileName]);
LAdoQueryExcel.SQL.Add(''SELECT * FROM [Sheet1$]'');
LAdoQueryExcel.Open;
while not LAdoQueryExcel.eof do
begin
LADOAccesCmd.Parameters.ParamByName(''id'').Value := LAdoQueryExcel.FieldByname(''id'').AsInteger;
LADOAccesCmd.Parameters.ParamByName(''name'').Value := LAdoQueryExcel.FieldByname(''name'').AsString;
LADOAccesCmd.Execute;
LAdoQueryExcel.Next;
end;
finally
LAdoQueryExcel.Free;
LADOAccesCmd.Free;
end;
end;
begin
try
CoInitialize(nil);
try
ImportDataADO(''C:/Datos/Database1.accdb'',''Sales'',''C:/Datos/Sales.xlsx'');
Writeln(''Done'');
finally
CoUninitialize;
end;
except
on E:EOleException do
Writeln(Format(''EOleException %s %x'', [E.Message,E.ErrorCode]));
on E:Exception do
Writeln(E.Classname, '':'', E.Message);
end;
Writeln(''Press Enter to exit'');
Readln;
end.