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:
Des pensées?
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\"";
}
ENFIN, une solution!
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
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é.