delphi导入导出Excel与Sql Server

目录

delphi导入导出Excel与Sql Server

一、关于ACE引擎和Jet引擎

1.1、Jet引擎(Microsoft.Jet.OLEDB.4.0的简称)

1.2、ACE引擎(Microsoft.ACE.OLEDB.12.0)

1.3、Microsoft Access 2010 数据库引擎可再发行程序包(即:ACE引擎的Access 2010版)

总览

安装要求

Microsoft Access 2010 数据库引擎安装说明

其它说明:

二、为什么使用ACE引擎?

2.1、Microsoft.Jet.OLEDB.4.0引擎微软早就不在维护,只能处理MS Office 2003及其以下版本与MS Sql Server之间的数据共享

2.2、Microsoft.ACE.OLEDB.12.0引擎是ADO.Net的产物,是现目前市场上仅有Oracle的ODP与其齐头并进的两种主流大型关系型数据库引擎技术

2.3、ADO.Net与ADO,是两种架构完全不同的数据库引擎技术。

三、Delphi为什么使用ACE引擎或Jet引擎,替代基于ComObj技术的OleObject活OleVariant技术?

四、在Delphi中控使用ACE引擎技术

4.1、需要部署的技术环境

4.2、Delphi代码实现ACE.OLEDB.12.0导入导出Excel与Sql Server

        Delphi 6 ~ Delphi 10.4.2通用代码:  

        Delphi调用方法:  

本博客相关:

喜欢的话,就在下面点个赞、收藏就好了,方便看下次的分享:


delphi导入导出Excel与Sql Server

一、关于ACE引擎和Jet引擎

1.1、Jet引擎(Microsoft.Jet.OLEDB.4.0的简称)

        Jet.OLEDB.4.0只能处理MS Office 2003及其以下版本与MS Sql Server之间的数据共享

1.2、ACE引擎(Microsoft.ACE.OLEDB.12.0)

        ACE.OLEDB.12.0能处理从MS Office 97~现目前最新的MS Office 2019各个版本与MS Sql Server之间的数据共享

1.3、Microsoft Access 2010 数据库引擎可再发行程序包(即:ACE引擎的Access 2010版)

http://www.microsoft.com/zh-CN/download/details.aspx?id=13255  ,说明如下:

总览

版本:sp2       Realease日期:2019/12/20

  • 此下载将安装一系列组件,帮助在现有的 Microsoft Office 文件(例如 Microsoft Office Access 2010(*.mdb 和 *.accdb)文件和 Microsoft Office Excel 2010(*.xls、*.xlsx 和 *.xlsb)文件)与其他数据源(例如 Microsoft SQL Server)之间传输数据
  • 支持与现有文本文件建立连接
  • 此外,还会安装 ODBC 和 OLEDB 驱动程序,供应用程序开发人员在开发与 Office 文件格式连接的应用程序时使用。


Access 2010 数据库引擎可再发行程序包不用于以下用途:

  1. 作为 Jet 的一般替代品(如果您需要 Jet 的一般替代品,应该使用 SQL Server Express Edition)。
  2. 作为服务器端应用程序的 Jet OLEDB 提供程序的替代品。
  3. 作为一般的文字处理、电子表格或数据库管理系统 -用于创建文件。(您可以使用 Microsoft Office 或 Office 自动化来创建 Microsoft Office 支持的文件。)
  4. 由系统服务或代码将在系统帐户下运行的服务器端程序使用,或将同时处理多个用户标识,或可高度重入并且期望无状态行为。例如,当没有任何用户登录时从任务计划程序运行的程序;或者,从像 ASP.NET 这样的服务器端 Web 应用程序调用的程序;或者,在 COM+ 服务下运行的分布式组件。

安装要求

支持的操作系统

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, Windows XP Service Pack 2

  • 只有 32 位 Access 数据库引擎可在 Windows XP Service Pack 3 上使用 ;  如果你之前安装了Office,则Office是32位的,则应当对应安装32位的ACE;Office是64位的,则应当对应安装64位的ACE。
  • AccessDatabaseEngine.exe 、AccessDatabaseEngine_X64.exe

Microsoft Access 2010 数据库引擎安装说明

注意:在安装此下载之前,必须先通过使用“控制面板”中的“添加/删除程序”,从你的计算机中卸载任何以前版本的 Access 数据库引擎。

若要安装此下载,请执行以下操作:

  1. 通过单击“下载”按钮并将文件保存到硬盘上来下载文件。
  2. 双击硬盘上的“AccessDatabaseEngine.exe”程序文件启动安装程序。
  3. 按照屏幕上的说明完成安装。

若要使用此下载,请执行以下操作:(否则,你是不能成功连接的:)

  1. 如果您是应用程序用户,请查阅您的应用程序文档,了解有关如何使用相应驱动程序的详细信息。
  2. 如果您是使用 OLEDB 的应用程序开发人员,请将 ConnectionString 属性的 Provider 参数设置为“Microsoft.ACE.OLEDB.12.0”。
    比如:Provider=MICROSOFT.ACE.OLEDB.12.0;
    如果要连接到 Microsoft Office Excel 数据,请根据 Excel 文件类型添加相应的 OLEDB 连接字符串扩展属性:

    文件类型(扩展名)                                             扩展属性
    ---------------------------------------------------------------------------------------------
    Excel 97-2003 工作簿 (.xls)                                  “Excel 8.0”                      比如:Extended Properties=Excel 8.0;
    Excel 2007-2010 工作簿 (.xlsx)                             “Excel 12.0 Xml”            比如:Extended Properties=Excel 12.0 Xml;
    启用宏的 Excel 2007-2010 工作簿 (.xlsm)            “Excel 12.0 宏”
    Excel 2007-2010 非 XML 二进制工作簿 (.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
    

    这很重要!

  3. 如果您是使用 ODBC 连接到 Microsoft Office Access 数据的应用程序开发人员,请将连接字符串设置为“Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=path to mdb/accdb file”
  4. 如果您是使用 ODBC 连接到 Microsoft Office Excel 数据的应用程序开发人员,请将连接字符串设置为“Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=path to xls/xlsx/xlsm/xlsb file”

若要删除此下载,请执行以下操作:
若要删除下载文件本身,请删除文件 AccessDatabaseEngine.exe

  1. 在“开始”菜单上,指向“设置”,然后单击“控制面板”
  2. 双击 “添加/删除程序”
  3. 在当前安装的应用程序列表中,选择“Microsoft Access 2010 数据库引擎”,然后单击“删除”“添加/删除”。如果出现对话框,请按照说明删除该程序。
  4. 单击“是”“确定”,以确认要删除该程序。

其它说明:

Office System 驱动程序仅在某些特定情况下受支持,包括:

  1. 读取或写入各种文件格式(包括 Microsoft Office Access、Microsoft Office Excel 和文本文件)的桌面应用程序。
  2. 在受支持的文件格式与数据库(例如 SQL Server)之间传输数据。例如,使用 SQL Server 导入和导出向导或 SQL Server Integration Services 将数据从 Excel 工作簿导入到 SQL Server(前提是 SSIS 作业在具有有效 HKEY_CURRENT_USER 注册表配置单元的登录用户上下文中运行)。

二、为什么使用ACE引擎?

2.1、Microsoft.Jet.OLEDB.4.0引擎微软早就不在维护,只能处理MS Office 2003及其以下版本与MS Sql Server之间的数据共享

        Jet.OLEDB.4.0只能处理MS Office 2003及其以下版本与MS Sql Server之间的数据共享;且微软早已不再维护。它是ADO的产物。

2.2、Microsoft.ACE.OLEDB.12.0引擎是ADO.Net的产物,是现目前市场上仅有Oracle的ODP与其齐头并进的两种主流大型关系型数据库引擎技术

        ACE.OLEDB.12.0能处理从MS Office 97~现目前最新的MS Office 2019各个版本与MS Sql Server之间的数据共享。微软永远会维护它,它担任了.Net战略与现目前微软云宇宙数据库Cosmos DB及Azure操作系统数据库的底层数据处理的重要角色。它是ADO.Net的产物。

2.3、ADO.Net与ADO,是两种架构完全不同的数据库引擎技术。

三、Delphi为什么使用ACE引擎或Jet引擎,替代基于ComObj技术的OleObject活OleVariant技术?

        ACE引擎或Jet引擎比ComObj.pas的CreateOleObject方面快得N个数量级。
        因为它是微软OLE数据库引擎的原生方法:100万笔记录导出Excel只需20秒左右。

四、在Delphi中控使用ACE引擎技术

4.1、需要部署的技术环境

        见本文【1.3、Microsoft Access 2010 数据库引擎可再发行程序包】所述。

4.2、Delphi代码实现ACE.OLEDB.12.0导入导出Excel与Sql Server

        Delphi 6 ~ Delphi 10.4.2通用代码:  

//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;

        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;

本博客相关:

        1、《delphi使用MS Sql Server数据库的分布式查询

        2、RAD Studio 10.4.1的TEdgeBrowser与javascript交互-基于Chromium的Edge浏览器控件用法之二

喜欢的话,就在下面点个赞、收藏就好了,方便看下次的分享:

猜你喜欢

转载自blog.csdn.net/pulledup/article/details/110233127