2012-01-10 55 views
16

Estoy tratando de importar datos desde archivos de Excel 2007 (.xlsx) a SQL Server 2008 utilizando un comando T-SQL OpenRowset() con el "Microsoft.ACE". OLEDB.12.0 "proveedor OLE DB, y obtengo un error persistente" No se pudo encontrar ISAM instalable ". Todo el hardware es de 32 bits.Cómo resolver "No se pudo encontrar el ISAM instalable". error para el proveedor OLE DB "Microsoft.ACE.OLEDB.12.0"

[Revisado 10/01/12 a tratar de centrarse más en las anomalías]

La siguiente instrucción T-SQL produce el error:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Data Source=C:\work\TestData.xlsx;Extended Properties="Excel 12.0 XML;HDR=YES"', 
    'SELECT * FROM [Sheet1$]' 
) 

Si salvo el archivo de Excel en el formato "Excel 97-2003" (.xls) y usa el antiguo proveedor Microsoft.Jet.OLEDB.4.0 para importar los datos, funciona bien. Esto me hace pensar que no es un problema de seguridad u otro problema ambiental.

SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
    'Excel 8.0;Database=C:\work\TestData.xls;HDR=YES', 
    'SELECT * FROM [Sheet1$]' 
) 

Sin embargo, cuando intento el archivo .xls * con el proveedor de Microsoft.ACE.OLEDB.12.0, que debe ser compatible con el formato * .xls, de nuevo se produce el mismo error:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Data Source=C:\work\TestData.xls;Extended Properties="Excel 8.0;HDR=YES";', 
    'SELECT * FROM [Sheet1$]' 
) 

Además, curiosamente, cuando uso el asistente "Importar datos ..." de SSMS, funciona bien. Guardé el resultado del asistente Importar datos como un paquete SSIS y miré en el archivo SSIS para tratar de descubrir cómo funciona, y está utilizando con éxito el proveedor Microsoft.ACE.OLEDB.12.0. Esta es la cadena de conexión del paquete de SSIS:

<DTS:Property DTS:Name="ConnectionString"> 
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\work\TestData.xlsx;Extended Properties="Excel 12.0 XML;HDR=YES"; 
</DTS:Property> 

También he hecho la configuración de SQL Server pertinente para evaluar la consulta distribuida OPENROWSET:

sp_configure 'show advanced options', 1 
reconfigure 
GO 
sp_configure 'Ad Hoc Distributed Queries', 1 
reconfigure 
GO 

Si yo también puse el siguiente * * sp_MSset_oledb_prop los valores (que he encontrado en un puesto en alguna parte) ...

USE [master] 
GO 
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1 
GO 
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1 
GO 

... entonces cambia el error de "error no especificado":

OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "Unspecified error". 
Msg 7303, Level 16, State 1, Line 1 
Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)". 

Sin embargo, no estoy seguro de si esto es un error de subida o de bajada. (¿Ahora está encontrando el "ISAM instalable" pero fallando posteriormente?)

He intentado esto con múltiples archivos de Excel en dos máquinas/sistemas operativos diferentes (Windows Server 2003, Windows XP SP3). Ambas máquinas son de 32 bits.

También intenté volver a instalar las versiones de Office 2007 y Office 2010 de AccessDatabaseEngine.exe (http://www.microsoft.com/download/en/details.aspx?id=23734 y http://www.microsoft.com/download/en/details.aspx?id=13255, respectivamente), fue en vano.

En resumen:

  • proveedor "Microsoft.Jet.OleDb.4.0" funciona utilizando T-SQL, pero "Microsoft.ACE.OLEDB.12.0" no.
  • "Microsoft.ACE.OLEDB.12.0" funciona utilizando el asistente "Importar datos ..." (hasta donde puedo decir desde el archivo de trabajo SSIS guardado).
  • Al establecer las propiedades "AllowInProcess" y "DynamicParameters" en "1", se cambia el error a "Error no especificado". (¿Es eso un paso adelante ?!)

¿Alguna idea?

+0

Ha buscado SO para este eeor? Hay muchas preguntas al respecto, la mayoría de las respuestas parecen girar en torno a la adición de comillas alrededor de 'Data Source = '...' ' –

+0

Sí, pasé unas horas buscando SO y en otros lugares, y probé muchas variaciones de la cadena de conexión, incluso jugando con las comillas, así que no creo que ese sea el problema. (Eso incluye copiar la cadena de conexión SSIS que está funcionando.) –

+0

Estoy teniendo el mismo problema – Pete

Respuesta

0

Creo que la respuesta se esconde en la información del paquete de SSIS que ha publicado. El nuevo formato de archivo xlsx almacena los datos en formato XML en lugar del formato antiguo. Míralo de nuevo. Se lee ... Propiedades extendidas = "Excel 12.0 XML; HDR = SÍ

No se pierda ese XML después de las cosas estándar. (Por lo que vale, también leí que necesita" Excel 12.0 Macro "para conectar con un archivo xslm)

darle una oportunidad extraño, pero es de esperar que funciona

+2

El primer fragmento de código anterior incluye las 'Propiedades extendidas =" Excel 12.0 XML; HDR = SÍ "' que sugirió-- todavía no funciona. –

0

intenta esto

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
       'EXCEL 12.0;DataBase=C:\TEMP\test.xlsx;Extended Properties="EXCEL 12.0 Xml;HDR=YES', [Sheet1$]) 
0

he resuelto con esta consulta:...

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Excel 12.0;HDR=NO;Database=D:\Filename.xlsx;', 
    [SheetName$]) 

Parece sql no le gusta la sección "Propiedades extendidas" ...

2

probar esto puede ayudarle a:

conjunto path y strFileType según el requisito

 string connString = ""; 
// string strFileType = Path.GetExtension(UpfileName.FileName).ToLower(); 
// string path = UpfileName.PostedFile.FileName; 

if (strFileType.Trim() == ".xls") 
    { 

     connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\""; 
    } 
    else if(strFileType.Trim() == ".xlsx") 
    { 
      connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\""; 
    } 
+1

añadiendo comillas a Propiedades extendidas trabajado para mí (como este "Proveedor = Microsoft.ACE.OLEDB.12.0; Fuente de datos =" + nombre de archivo + "; Propiedades extendidas = \" Excel 12.0; HDR = YES; \ "" ;) – pawciu

1

¡FINALMENTE, una solución!

mira esto: Msg 7302, Level 16, State 1, Line 1 Cannot create an instance of OLE DB Provider “Microsoft.ACE.OLEDB.12.0” for linked server “(null)”

Básicamente, usted va a

Control Panel > Administrative Tools > Component Services

continuación, expanda

Component Services > Computers > My Computer > DCOM Config

encuentran

MSDAINITIALIZE

ir a

Properties > Security > Launch and Activation Permissions

clic en

Customize > Edit...

añadir su nombre de usuario o "Todo el mundo" si usted prefiere

marcar todas las casillas "Permitir" para el nuevo usuario/grupo

y golpeó OK en ambas páginas

Ahora vea si su comando OpenRowSet/OpenDataSource funciona

Gracias a Ramesh Babu Vavilla (vr.babu) from social.technet.microsoft.com para el enlace

+0

Todos los controles en los "Permisos de inicio y activación" están deshabilitados. –

+1

@Irawan Debe iniciar sesión en Windows como administrador para tener acceso a esta configuración. Pida acceso al administrador de su dominio. –

0
Hai am also faced this situation i solved It

Resuelto

string ConeectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + txtFlp.Text 

    + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES\""); 

       OleDbConnection oconn = new OleDbConnection(ConeectionString);</b> 
0

Esto funcionó para mí:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Excel 12.0;HDR=NO;Database=C:\temp\file.xlsx;',[sheetname$]) 
Cuestiones relacionadas