Importación y exportación de Delphi Excel y Sql Server

Tabla de contenido

Importación y exportación de Delphi Excel y Sql Server

1. Acerca del motor ACE y el motor Jet

1.1 Motor a reacción (abreviatura de Microsoft.Jet.OLEDB.4.0)

1.2, extracción de ACE (Microsoft.ACE.OLEDB.12.0)

1.3, paquete redistribuible del motor de base de datos de Microsoft Access 2010 (es decir: versión Access 2010 del motor ACE)

Visión general

Requerimientos de instalación

Instrucciones de instalación del motor de base de datos de Microsoft Access 2010

otras instrucciones:

2. ¿Por qué utilizar el motor ACE?

2.1, motor Microsoft.Jet.OLEDB.4.0 Microsoft no lo ha mantenido durante mucho tiempo y solo puede manejar el intercambio de datos entre MS Office 2003 y versiones anteriores y MS Sql Server

2.2. El motor Microsoft.ACE.OLEDB.12.0 es un producto de ADO.Net. En la actualidad, son las dos únicas tecnologías principales de motores de bases de datos relacionales a gran escala en el mercado en las que el ODP de Oracle va de la mano.

2.3 ADO.Net y ADO son tecnologías de motor de base de datos con arquitecturas completamente diferentes.

3. ¿Por qué Delphi usa el motor ACE o el motor Jet en lugar de la tecnología OleObject o OleVariant basada en la tecnología ComObj?

Cuarto, utilice la tecnología de motor ACE en el control Delphi

4.1. Entorno técnico a implementar

4.2, código Delphi para lograr ACE.OLEDB.12.0 importar y exportar Excel y Sql Server

        Delphi 6 ~ Delphi 10.4.2 código general:  

        Método de llamada de Delphi:  

Relacionado con este blog:

Si le gusta, simplemente haga clic en Me gusta y en favorito a continuación, para que pueda ver el siguiente intercambio:


Importación y exportación de Delphi Excel y Sql Server

 

1. Acerca del motor ACE y el motor Jet

1.1 Motor a reacción (abreviatura de Microsoft.Jet.OLEDB.4.0)

        Jet.OLEDB.4.0 solo puede gestionar el intercambio de datos entre MS Office 2003 y versiones anteriores y MS Sql Server

1.2, extracción de ACE (Microsoft.ACE.OLEDB.12.0)

        ACE.OLEDB.12.0 puede manejar el intercambio de datos entre MS Office 97 ~ ahora las últimas versiones de MS Office 2019 y MS Sql Server

1.3, paquete redistribuible del motor de base de datos de Microsoft Access 2010 (es decir: versión Access 2010 del motor ACE)

http://www.microsoft.com/zh-CN/download/details.aspx?id=13255   , la descripción es la siguiente:

Visión general

Versión: sp2 Fecha de lanzamiento: 20/12/2019

  • Esta descarga instalará una serie de componentes para ayudar en los archivos de Microsoft Office existentes (como los archivos de Microsoft Office Access 2010 (* .mdb y * .accdb) y Microsoft Office Excel 2010 (* .xls, * .xlsx y * .xlsb) Archivos) y otras fuentes de datos (como Microsoft SQL Server) para transferir datos .
  • También admite el establecimiento de una conexión con archivos de texto existentes .
  • Además, se instalarán controladores ODBC y OLEDB para que los desarrolladores de aplicaciones los utilicen al desarrollar aplicaciones que se conectan al formato de archivo de Office .


El paquete redistribuible del motor de base de datos de Access 2010 no se utiliza para los siguientes propósitos:

  1. Como reemplazo general de Jet (si necesita un reemplazo general de Jet, debe usar  SQL Server Express Edition ).
  2. Como alternativa al proveedor Jet OLEDB para aplicaciones del lado del servidor.
  3. Como procesador de texto, hoja de cálculo o sistema de gestión de base de datos general, se utiliza para crear documentos. (Puede utilizar Microsoft Office o Office Automation para crear archivos compatibles con Microsoft Office).
  4. Usado por servicios del sistema o códigos que serán usados ​​por programas del lado del servidor que se ejecutan bajo la cuenta del sistema, o que manejarán múltiples identidades de usuario al mismo tiempo, o pueden ser altamente reentrantes y esperar un comportamiento sin estado. Por ejemplo, un programa que se ejecuta desde el programador de tareas cuando no hay ningún usuario conectado; o un programa que se llama desde una aplicación web del lado del servidor como ASP.NET; o un componente distribuido que se ejecuta bajo los servicios COM +.

Requerimientos de instalación

Sistema operativo compatible

Windows 10, Windows 7, Windows 8, Windows Server 2003, Windows Server 2003 Service Pack 1, Windows Server 2003 Service Pack 2, Windows Server 2008 R2, Windows Server 2008 Service Pack 2, Windows Server 2012 R2, Windows Vista Service Pack 1, Paquete de servicio 2 de Windows XP

  • Solo se puede usar el motor de base de datos de 32 Access en Windows XP Service Pack 3si instaló Office anteriormente, Office tiene 32, entonces debería corresponder instalar el ACE de 32 bits; Office es 64, debería corresponder a la instalación 64 Un poco de ACE.
  • AccessDatabaseEngine.exe 、 AccessDatabaseEngine_X64.exe

Instrucciones de instalación del motor de base de datos de Microsoft Access 2010

Nota: antes de instalar esta descarga, primero debe desinstalar cualquier versión anterior del motor de base de datos de Access de su computadora usando "Agregar o quitar programas" en el "Panel de control".

Para instalar esta descarga:

  1. Descarga el archivo haciendo clic en el botón "Descargar" y guarda el archivo en el disco duro.
  2. Haga doble clic en el archivo de programa "AccessDatabaseEngine.exe" en el disco duro para iniciar el programa de instalación.
  3. Siga las instrucciones en pantalla para completar la instalación.

Para utilizar esta descarga, haga lo siguiente: (De lo contrario, no podrá conectarse correctamente :)

  1. Si es un usuario de la aplicación, consulte la documentación de la aplicación para obtener detalles sobre cómo utilizar el controlador correspondiente.
  2. Si es un desarrollador de aplicaciones que utiliza OLEDB , establezca el parámetro Proveedor de la propiedad ConnectionString en "Microsoft.ACE.OLEDB.12.0".
    Por ejemplo: Proveedor = MICROSOFT.ACE.OLEDB.12.0;
    si desea conectarse a los datos de Microsoft Office Excel, agregue los atributos extendidos de la cadena de conexión OLEDB correspondiente según el tipo de archivo de Excel:

    tipo de archivo (extensión) atributos extendidos
    ------ -------------------------------------------------- -------------------------------------
    Libro de Excel 97-2003 (.xls) "Excel 8.0 "Por                      ejemplo: Propiedades extendidas = Excel 8.0;
    Libro de trabajo de Excel 2007-2010 (.xlsx)" Excel 12.0 Xml "Por            ejemplo: Propiedades extendidas = Excel 12.0 Xml;
    Libro de trabajo de Excel 2007-2010 habilitado para macros (.xlsm)" Macro de Excel 12.0 "
    Libro de trabajo binario no XML de Excel 2007-2010 (.xlsb) "Excel 12.0"                    

    Provider=MICROSOFT.ACE.OLEDB.12.0;Data Source=D:\开发包\饲料分批次进销存-存货计价和条码\A1.xls;Extended Properties=Excel 8.0;Persist Security Info=False
    Provider=MICROSOFT.ACE.OLEDB.12.0;Data Source=D:\开发包\饲料分批次进销存-存货计价和条码\A1.xlsx;Extended Properties=Excel 12.0 Xml;Persist Security Info=False
    

    ¡Esto es importante!

  3. Si es un desarrollador de aplicaciones que utiliza ODBC para conectarse a los datos de Microsoft Office Access, establezca la cadena de conexión en "Driver = {Microsoft Access Driver (* .mdb, * .accdb)}; DBQ = ruta al archivo mdb / accdb "
  4. Si es un desarrollador de aplicaciones que utiliza ODBC para conectarse a datos de Microsoft Office Excel, establezca la cadena de conexión en "Driver = {Microsoft Excel Driver (* .xls, * .xlsx, * .xlsm, * .xlsb)}; DBQ = ruta al archivo xls / xlsx / xlsm / xlsb "

Para eliminar esta descarga, haga lo siguiente:
Para eliminar el archivo de descarga, elimine el archivo  AccessDatabaseEngine.exe

  1. En el menú Inicio, seleccione Configuración y luego haga clic en Panel de control .
  2. Haga doble clic en  "Agregar o quitar programas" .
  3. En la lista de aplicaciones instaladas actualmente, seleccione "Motor de base de datos de Microsoft Access 2010" y luego haga clic en "Eliminar" o "Agregar o quitar" . Si aparece un cuadro de diálogo, siga las instrucciones para eliminar el programa.
  4. Haga clic en "Sí" o "Aceptar" para confirmar que desea eliminar el programa.

otras instrucciones:

Los controladores de Office System solo son compatibles en determinadas situaciones específicas, que incluyen:

  1. Aplicaciones de escritorio que leen o escriben varios formatos de archivo (incluidos Microsoft Office Access, Microsoft Office Excel y archivos de texto).
  2. Transfiera datos entre bases de datos y formatos de archivo compatibles (como SQL Server). Por ejemplo, use el Asistente para importación y exportación de SQL Server o SQL Server Integration Services para importar datos de un libro de Excel a SQL Server (siempre que el trabajo SSIS se ejecute en el contexto de un usuario que haya iniciado sesión con un subárbol de registro HKEY_CURRENT_USER válido).

2. ¿Por qué utilizar el motor ACE?

2.1, motor Microsoft.Jet.OLEDB.4.0 Microsoft no lo ha mantenido durante mucho tiempo y solo puede manejar el intercambio de datos entre MS Office 2003 y versiones anteriores y MS Sql Server

        Jet.OLEDB.4.0 solo puede manejar el intercambio de datos entre MS Office 2003 y versiones anteriores y MS Sql Server; y Microsoft ya no lo ha mantenido. Es un producto de ADO.

2.2. El motor Microsoft.ACE.OLEDB.12.0 es un producto de ADO.Net. En la actualidad, son las dos únicas tecnologías principales de motores de bases de datos relacionales a gran escala en el mercado en las que el ODP de Oracle va de la mano.

        ACE.OLEDB.12.0 puede manejar el intercambio de datos entre varias versiones de MS Office 97 ~ ahora el último MS Office 2019 y MS Sql Server. Microsoft siempre lo mantendrá, y juega un papel importante en el procesamiento de datos subyacente de la estrategia .Net y la base de datos actual del universo en la nube de Microsoft Cosmos DB y la base de datos del sistema operativo Azure. Es un producto de ADO.Net.

2.3 ADO.Net y ADO son tecnologías de motor de base de datos con arquitecturas completamente diferentes.

 

3. ¿Por qué Delphi usa el motor ACE o el motor Jet en lugar de la tecnología OleObject o OleVariant basada en la tecnología ComObj?

        El motor ACE o motor Jet es N órdenes de magnitud más rápido que CreateOleObject de ComObj.pas.
        Porque es el método nativo del motor de base de datos OLE de Microsoft: solo se necesitan unos 20 segundos para exportar 1 millón de registros a Excel.

Cuarto, utilice la tecnología de motor ACE en el control Delphi

4.1. Entorno técnico a implementar

        Consulte este artículo [1.3, Paquete redistribuible del motor de base de datos de Microsoft Access 2010].

4.2, código Delphi para lograr ACE.OLEDB.12.0 importar y exportar Excel y Sql Server

        Delphi 6 ~ Delphi 10.4.2 código general:  

//Delphi 6 ~ Delphi 10.4.2通用代码: 

function TDMGlobalFun.AceToXls( AFullPathName:string;AAce_Extended_Properties:string;
  AWorkSheet_TableName:string;AColums_DisPlayLabel:string;ASelectList:string):Integer;
var
    LFilePath: string;
    LFileExt: string;
    LFileStream: TFileStream;
    LAce_Extended_Properties: string;
    LResultLines: Integer;
    LDML_OpenDataSource_Sql:string;
    ExcelCon1: TADOConnection; ExcelDBQuery:TADOQuery;
    LTestStrings :TStringList;
begin
  LResultLines:= 1;
  if (trim(AAce_Extended_Properties)='')
    or (trim(AFullPathName)='') then LResultLines:= 0;
  if LResultLines=0 then
  begin
    Result:=LResultLines;
    exit;
  end;
  LFilePath:=SysUtils.ExtractFileDir(trim(AFullPathName)) ;
  if SysUtils.DirectoryExists(LFilePath)=false then
  begin //:如果路径不存在就强制产生路径并返回是否成功产生路径:
    if SysUtils.ForceDirectories(AFullPathName)=false then
    begin
      Application.MessageBox('路径字符串表达不合法!', '系统提示:', MB_OK);
      LResultLines:= 0;
      Result:=LResultLines;
      exit;
    end;
  end;
  LFileExt:= SysUtils.ExtractFileExt( trim(AFullPathName) );
  if (trim(LFileExt)='')
    and (trim(LFileExt)<>'.xls')
    and (trim(LFileExt)<>'.xlsx')
    and (trim(LFileExt)<>'.xlsm')
    and (trim(LFileExt)<>'.xlsb') then
  begin
    Application.MessageBox('文件的扩展名字符串表达不合法!', '系统提示:', MB_OK);
    LResultLines:= 0;
    Result:=LResultLines;
    exit;
  end else
  begin//获取正确的Excel扩展属性:
    if (trim(LFileExt)='.xls') then
      LAce_Extended_Properties:='Excel 8.0';//:Excel 97-2003 工作簿 (.xls)
    if (trim(LFileExt)='.xlsx') then
      LAce_Extended_Properties:='Excel 12.0 Xml';//:Excel 2007-2010 工作簿 (.xlsx)
    if (trim(LFileExt)='.xlsm') then
      LAce_Extended_Properties:='Excel 12.0 宏';//:启用宏的 Excel 2007-2010 工作簿 (.xlsm)
    if (trim(LFileExt)='.xlsb') then
      LAce_Extended_Properties:='Excel 12.';//:Excel 2007-2010 非 XML 二进制工作簿 (.xlsb)
  end;

  //开始用文件流产生一个Excel文件
  if SysUtils.FileExists(trim(AFullPathName))=false then
    LFileStream:= TFileStream.Create(trim(AFullPathName),Classes.fmCreate or SysUtils.fmOpenReadWrite);
  if SysUtils.FileExists(trim(AFullPathName))=true then
    if LFileStream<>nil then LFileStream.Free;
  //开始拼接MS Sql Server内部函数OPENDATASOURCE的OLEDB数据库连接的的ConnectionString:
  LTestStrings:= TStringList.Create;
  ExcelCon1:= TADOConnection.Create(nil);
  try
    {try
      ExcelCon1.LoginPrompt:= false;
      ExcelCon1.Mode:= cmShareDenyWrite;//:连接拒绝共享写:::::::::::
      ExcelCon1.KeepConnection:= true;  //:一直保持连接直至关闭
      ExcelCon1.IsolationLevel:= ilCursorStability;//:连接的冲突级别
      ExcelCon1.CursorLocation:= clUseClient;//:连接的游标位置
      ExcelCon1.ConnectOptions:= coConnectUnspecified;//:连接选项:不要异步
      ExcelCon1.CommandTimeout:= 30;//:连接超时
      ExcelCon1.ConnectionTimeout:= 15;//:连接超时
      ExcelCon1.ConnectionString
        :='Provider=MICROSOFT.ACE.OLEDB.12.0;'
        +'Data Source='+AFullPathName+';'
        +'Extended Properties='+LAce_Extended_Properties+';'
        +'Persist Security Info=False'
        ;//:连接字符串不能有换行回车符
      LTestStrings.Add(ExcelCon1.ConnectionString);
      LTestStrings.Add(LFileExt);
      LTestStrings.SaveToFile( SysUtils.ExtractFilePath(System.ParamStr(0)) +'ExcelCon1.ConnectionString.txt');
      ExcelCon1.Connected:=true;
        //:开启连接:注意!!!:同一时间只能有1个连接被打开:
          //:为什么把这段屏蔽,它与下面的连接执行DML冲突
          //:它用于Excel导入MS Sql Server时使用
    except
      LResultLines:= 0;
      LTestStrings.Free;
      if LFileStream<>nil then LFileStream.Free;
      if ExcelCon1.Connected=true then ExcelCon1.Close;
      ExcelCon1.Free;
      exit;
    end; //}
    //开始拼接OpenDataSource的DML的语句:
    LDML_OpenDataSource_Sql
      :='insert into OPENDATASOURCE ('''+'Microsoft.ACE.OLEDB.12.0'+''',' +sLineBreak
          +'''Data Source='+AFullPathName+';' +sLineBreak
              +'Extended Properties='+LAce_Extended_Properties+';'
              +'Persist Security Info=False''' +sLineBreak
      +')...['
            +Copy(SysUtils.ExtractFileName( trim(AFullPathName) ),1,LastDelimiter('.',SysUtils.ExtractFileName( trim(AFullPathName) ))-1)
         +'$](公司编码,行种子,产品编码,销量下限,销量上限,现场折扣,其它扣率,备注)' +sLineBreak
      +'select com_id,seeds_id,item_id,sd_oq_LowerLimit,sd_oq_UpperLimit,send_sum,send_sum_other,c_memo' +sLineBreak
      +'from Siliao_jxc_BarcodeStock.dbo.Ctl03001_DiscountTemp ;'
      ;
      //:Siliao_jxc_BarcodeStock:TestTemp使用全链接架构名可跨库跨域操作:
        //:比如[81.69.222.207].Carveout.dbo.sdf00504
      LTestStrings.Add(LDML_OpenDataSource_Sql);
      LTestStrings.SaveToFile( SysUtils.ExtractFilePath(System.ParamStr(0)) +'LDML_OpenDataSource_Sql.txt');
    try
      //本地当前使用的数据集curDataSet:TDataSet开始执行OpenDataSource的DML的语句:
      try
        //(curDataSet as TCustomADODataSet).Connection.BeginTrans;
          //:事务开始:Excel可能会不支持
        //(curDataSet as TAdoQuery) (curDataSet as TADOStoredProc)
        QryExec.ExecuteOptions:= [eoExecuteNoRecords];//:执行选项无需返回任何记录集
        QryExec.DisableControls;
          QryExec.SQL.Text:=LDML_OpenDataSource_Sql;
          QryExec.Prepared;
          QryExec.ExecSQL;
        QryExec.EnableControls;
        QryExec.ExecuteOptions:= [];
        //((curDataSet as TCustomADODataSet).Connection as TADOConnection)
        //LTestStrings.Add(TADOConnection(TCustomADODataSet(curDataSet).Connection).Name);//:=ADOConGlobal
        //LTestStrings.SaveToFile( SysUtils.ExtractFilePath(System.ParamStr(0)) +'LDML_OpenDataSource_Sql.txt');

      except
        //(curDataSet as TCustomADODataSet).Connection.RollbackTrans;//:事务错误回滚
        LTestStrings.Free;
        if LFileStream<>nil then LFileStream.Free;
        if ExcelCon1.Connected=true then ExcelCon1.Close;
        ExcelCon1.Free;
      end;
    finally
      //(curDataSet as TCustomADODataSet).Connection.CommitTrans; //:事务结束
    end;
    LResultLines:= 1;
  finally
    LTestStrings.Free;
    if LFileStream<>nil then LFileStream.Free;
    if ExcelCon1.Connected=true then ExcelCon1.Close;//:关闭连接
    ExcelCon1.Free; //:释放连接
    Result:= LResultLines;
  end;
end;

function TDMGlobalFun.XlsToAce( AFullPathName:string;AAce_Extended_Properties:string;
  AWorkSheet_TableName:string):Integer;
var LResultLines: Integer;  //:略了,自己参考上面的方法写:
begin
  try
    try

    except
      LResultLines:= 0;
      exit;
    end;
    LResultLines:= 1;
  finally
    Result:= LResultLines;
  end;

end;

        Método de llamada de Delphi:  

procedure TfrmStoreQry.BtnPrintClick(Sender: TObject);
var LFileFullPath: string;
begin
  if DSMaster.dataset.IsEmpty then exit;
  DBGrid1.DataSource:=nil;    DBGrid1.Visible:=false;
  try
    LFileFullPath:=SysUtils.ExtractFilePath(System.ParamStr(0))+'ImportAndExport_xls\';
    //if not SysUtils.DirectoryExists(LFileFullPath) then SysUtils.ForceDirectories(LFileFullPath);
    //aDataSetToaXLS(sp_storeQry,(LFileFullPath + trim(Label5.Caption)+'.xls') );
      //:比上面基于ComObj.pas的CreateOleObject方面快得N个数量级:
        //:因为它是微软OLE数据库引擎的原生方法:100万笔记录导出Excel只需20秒左右:
        //:excel表格的Sheet中:按住CTRL键+方向键盘的下键,可得最大行数:
        //:2019版的excel表格最大行数是1048576行:
        //:2007版的excel表格最大行数是1048576行:
        //:2003版及其以下的excel表格最大行数是65536行:
    DMGlobalFun.AceToXls(
      LFileFullPath + trim(Label5.Caption)+'.xls',
      'Excel 8.0',
      trim(Label5.Caption),
      '公司编码,行种子,产品编码,销量下限,销量上限,现场折扣,其它扣率,备注',
      'com_id,seeds_id,item_id,sd_oq_LowerLimit,sd_oq_UpperLimit,send_sum,send_sum_other,c_memo'
      );
  finally
    DBGrid1.DataSource:=DSMaster;    DBGrid1.Visible:=true;
  end;
  //inherited;
end;

Relacionado con este blog:

        1. " Delphi utiliza consultas distribuidas de la base de datos del servidor MS Sql "

        2. " RAD Studio 10.4.1 TEdgeBrowser e interacción javascript: uso del control del navegador Edge basado en Chromium 2 "

Si le gusta, simplemente haga clic en Me gusta y en favorito a continuación, para que pueda ver el siguiente intercambio:

 

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/pulledup/article/details/110233127
Recomendado
Clasificación