web-dev-qa-db-fra.com

Comment résoudre "Impossible de trouver ISAM installable" erreur pour OLE Fournisseur de base de données "Microsoft.ACE.OLEDB.12.0"

J'essaie d'importer des données de fichiers Excel 2007 (.xlsx) dans SQL Server 2008 à l'aide d'une commande T-SQL OpenRowset () avec le fournisseur de base de données "Microsoft.ACE.OLEDB.12.0" OLE, et je obtenir une erreur persistante "Impossible de trouver le programme d'installation ISAM". Tout le matériel est en 32 bits.

[Révisé le 10/10/12 pour essayer de mieux cibler les anomalies]

L'instruction T-SQL suivante génère l'erreur:

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 j'enregistre le fichier Excel au format "Excel 97-2003" (.xls) et que j'utilise l'ancien fournisseur Microsoft.Jet.OLEDB.4.0 pour importer les données, cela fonctionne parfaitement. Cela me fait penser que ce n'est pas un problème de sécurité ou un autre problème environnemental.

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

Cependant, lorsque j'essaie le fichier * .xls avec le fournisseur Microsoft.ACE.OLEDB.12.0, qui doit être rétrocompatible avec le format * .xls, il échoue à nouveau avec la même erreur:

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

En outre, il est intéressant de noter que lorsque j’utilise l’Assistant "Importer des données ..." de SSMS, cela fonctionne correctement. J'ai enregistré la sortie de l'assistant d'importation de données en tant que package SSIS et j'ai cherché dans le fichier SSIS pour comprendre son fonctionnement. Il a IS correctement utilisé le fournisseur Microsoft.ACE.OLEDB.12.0. Voici la chaîne de connexion du package 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>

J'ai également effectué la configuration appropriée de SQL Server pour autoriser la requête distribuée OPENROWSET:

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

Si je définis également les valeurs * sp_MSset_oledb_prop * suivantes (que j'ai trouvées quelque part dans un message) ...

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 

... alors l'erreur devient "Erreur non spécifiée":

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)".

Cependant, je ne sais pas s'il s'agit d'une erreur en amont ou en aval. (Est-ce qu'il trouve maintenant le "ISAM installable" mais échoue par la suite?) 

J'ai essayé cela avec plusieurs fichiers Excel sur deux machines/systèmes d'exploitation différents (Windows Server 2003, Windows XP SP3). Les deux machines sont 32 bits.

J'ai également essayé de réinstaller les versions Office 2007 et Office 2010 d'AccessDatabaseEngine.exe ( http://www.Microsoft.com/download/en/details.aspx?id=23734 et http : //www.Microsoft.com/download/en/details.aspx? id = 13255 , respectivement), en vain.

Résumer:

  • Le fournisseur "Microsoft.Jet.OLEDB.4.0" fonctionne avec T-SQL, mais pas "Microsoft.ACE.OLEDB.12.0".
  • "Microsoft.ACE.OLEDB.12.0" fonctionne à l'aide de l'assistant "Importer des données ..." (d'après ce que je peux dire à partir du fichier de travail SSIS enregistré).
  • Définir les propriétés "AllowInProcess" et "DynamicParameters" sur "1" modifie l'erreur en "erreur non spécifiée". (Est-ce un pas en avant?!)

Des pensées?

17
Martin_ATS

ESSAYEZ cela cela peut vous aider:

régler path et strFileType selon l'exigence

      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
Sagar R

ENFIN, une solution!

Vérifiez ceci: Msg 7302, niveau 16, état 1, ligne 1 Impossible de créer une instance du fournisseur de base de données OLE «Microsoft.ACE.OLEDB.12.0» pour le serveur lié «(null)»

Fondamentalement, vous allez à

Panneau de configuration> Outils d'administration> Services de composants

puis développez

Services de composants> Ordinateurs> Poste de travail> Configuration DCOM

trouver

MSDAINITIALIZE

aller à

Propriétés> Sécurité> Autorisations de lancement et d'activation

cliquer sur

Personnaliser> Modifier ...

ajoutez votre identifiant ou "Tout le monde" si vous préférez

cochez TOUTES les cases "autoriser" pour le nouvel utilisateur/groupe

et cliquez sur OK sur les deux pages

Maintenant, voyez si votre commande OpenRowSet/OpenDataSource fonctionne

Merci à Ramesh Babu Vavilla (vr.babu) de social.technet.Microsoft.com pour le lien

0
Hamid Sadeghian

Assurer des citations autour de la section des propriétés étendues de la chaîne de connexion m'a résolu le problème. J'avais ajouté une propriété supplémentaire et je n'avais pas migré le devis à la fin de ma nouvelle propriété.

0
Aaronius