I have an SSIS 2012 package that, among other things, needs to write to nine different tabs in each of twenty different Excel 2010 files.
In one of the data flow tasks, when running the package within Visual Studio 2012, I get an error during validation:
Error: 0xC0014020 at MyPackage, Connection manager "Excel Files Whatever": An ODBC error -1 has occurred.
Error: 0xC0014009 at MyPackage, Connection manager "Excel Files Whatever": There was an error trying to establish an Open Database Connectivity (ODBC) connection with the database server.
This data flow task that generates this error would be writing to six tabs in each of the Excel files if it worked. With fewer files (four) in a previous version of this SSIS package, it worked fine. Also, another data flow task in the same package that writes to the other three tabs of each Excel file also works fine. The two data flow tasks are using the same connection managers. The specific connection manager named in the error changes each time the package is run.
I enabled ODBC tracing, and I found the following error in the log:
DIAG [08004] [Microsoft][ODBC Excel Driver] Too many client tasks. (-1036)
I found some documentation about ODBC destinations, which reads in relevant part:
There is no limitation on the number of ODBC destination components that can run in parallel against the same table or different tables, on the same machine or on different machines (other than normal global session limits).
However, limitations of the ODBC provider being used may restrict the number of concurrent connections through the provider. These limitations limit the number of supported parallel instances possible for the ODBC destination. The SSIS developer must be aware of the limitations of any ODBC provider being used and take them into consideration when building SSIS packages.
OK, great, but:
- What is the limit on parallel connections in the 32-bit Excel driver contained in the Microsoft Access Database Engine 2010 Redistributable? Or is that even the problem?
- If there is a limit on parallel connections, how can I force SSIS to honor the limit when running the package, including during the validation phase?
As additional info, I have DelayValidation set to True on all the ODBC connection managers. I have ValidateExternalMetadata set to False on all the ODBC destinations because the files do not exist yet when starting the package (a Copy Files task creates all the files earlier in the package). The connection string for each of the connection managers is generated by an expression, but the result is of the form
Dsn=Excel Files;dbq=c:\MyWorkspace\Whatever-20130701-to-20130917.xlsx;defaultdir=c:\MyWorkspace;driverid=1046;fil=excel 12.0;maxbuffersize=2048;pagetimeout=5;
in which only the file and directory names change due to parameters used in the expression.