如何将不同的Excel文件传递给SSIS中的Excel连接管理器?

时间:2016-03-30 20:54:48

标签: sql sql-server excel ssis

我将不同的excel文件传递给SSIS包。我通过使用每个循环,映射变量来从文件夹中获取。我将该变量传递给Excel连接管理器,但它没有采取。我们得到了以下错误,但是如果我们对excel文件路径进行硬编码它工作正常,但我希望它应该从每个循环开始,因为我们得到不同的Excel文件,例如:abc.xls或{{1 }或abc(1).xls。如何在SSIS中处理这个问题?

Error:
TITLE: Package Validation Error
------------------------------

Package Validation Error

------------------------------
ADDITIONAL INFORMATION:

Error at Load Attendance data [Excel Source [1]]: SSIS Error Code DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER.  The AcquireConnection method call to the connection manager "Excel Connection Manager 2" failed with error code 0xC0202009.  There may be error messages posted before this with more information on why the AcquireConnection method call failed.

Error at Load Attendance data [SSIS.Pipeline]: component "Excel Source" (1) failed validation and returned error code 0xC020801C.

Error at Load Attendance data [SSIS.Pipeline]: One or more component failed validation.

Error at Load Attendance data: There were errors during task validation.

Error at Tardy Load [Connection manager "Excel Connection Manager 2"]: SSIS Error Code DTS_E_OLEDBERROR.  An OLE DB error has occurred. Error code: 0x80004005.
An OLE DB record is available.  Source: "Microsoft JET Database Engine"  Hresult: 0x80004005  Description: "Invalid argument.".

 (Microsoft.DataTransformationServices.VsIntegration)

------------------------------
BUTTONS:

OK
------------------------------

3 个答案:

答案 0 :(得分:0)

这是我们处理类似问题的方法:

  • For循环将Excel文件的完整路径分配给变量
  • 在Excel连接管理器中,将Expressions属性的ExcelFilePath元素设置为该变量
  • 在循环中,我们有一个脚本任务,它将提取第一个工作表名称,将其分配给脚本任务中的ReadWriteVariable:

    public void Main()
    {
        string ConnectionString;
        OleDbConnection ExcelConnection;
        DataTable TablesInFile;
        string FirstSheet = "";
    
        ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Dts.Variables["WorkingFolderAndFile"].Value.ToString() + ";Extended Properties=Excel 8.0";
        ExcelConnection = new OleDbConnection(ConnectionString);
        ExcelConnection.Open();
        TablesInFile = ExcelConnection.GetSchema("Tables");
    
        foreach (DataRow SheetInFile in TablesInFile.Rows)
        {
            FirstSheet = SheetInFile["TABLE_NAME"].ToString();
            break;
        }
        Dts.Variables["WorkingSheetName"].Value = FirstSheet;
    
        ExcelConnection.Close();
        ExcelConnection.Dispose();
    
        Dts.TaskResult = (int)ScriptResults.Success;
    }
    
  • 然后在Excel源编辑器中,对于数据访问模式,选择:表名或视图名称变量。对于变量名,请使用包含在脚本任务中分配的第一个工作表名称的变量。

  • 同样对于Excel Source,您可能还需要设置以下属性:
  • ValidateExternalMetadata = False
  • AccessMode =来自变量的OpenRowset
  • OpenRowsetVariable = 工作表变量

答案 1 :(得分:0)

Excel无法每次都重新生成,使用CSV的同一个包可以正常工作。

但是,您希望使用excel文件,然后使用执行SQL任务并使用Excel连接管理器并添加脚本。

示例:

CREATE TABLE
`Excel Destination` (
    `PromotionKey` INTEGER,
    `PromotionAlternateKey` INTEGER,
    `EnglishPromotionName` NVARCHAR(255),
    `SpanishPromotionName` NVARCHAR(255),
    `FrenchPromotionName` NVARCHAR(255),
    `DiscountPct` DOUBLE PRECISION,
    `EnglishPromotionType` NVARCHAR(50),
    `SpanishPromotionType` NVARCHAR(50),
    `FrenchPromotionType` NVARCHAR(50),
    `EnglishPromotionCategory` NVARCHAR(50),
    `SpanishPromotionCategory` NVARCHAR(50),
    `FrenchPromotionCategory` NVARCHAR(50),
    `StartDate` DATETIME,
    `EndDate` DATETIME,
    `MinQty` INTEGER,
    `MaxQty` INTEGER
)

每次运行包时,查询都会生成一个新的excel文件,并解决您的问题。

希望它能解决你的问题。

答案 2 :(得分:-1)

将变量Excel文件源创建为String并添加excel文件夹的位置, 创建另一个变量excel文件Name作为字符串,并为其添加一个文件名。 回到你的连接管理器,你的一个excel文件...右键单击到属性,在表达式下选择Excel文件路径然后@ [$ Package :: ExcelFileSource] +" \" + @ [ $包:: ExcelFileName。这样您就不会对excel文件名进行硬编码。