Impossibile risolvere il factory del provider SQL Server CE in base al nome invariante
-
05-07-2019 - |
Domanda
Questa riga di codice
DbProviderFactory factory = DbProviderFactories.GetFactory("Microsoft.SqlServerCe.Client");
genera questa eccezione
System.Configuration.ConfigurationErrorsException: Impossibile trovare o caricare la registrazione .Net Framework Data Provider.
Sebbene il mio file machine.config contenga la seguente sezione
<system.data>
<DbProviderFactories>
<add name="OracleClient Data Provider" invariant="System.Data.OracleClient" description=".Net Framework Data Provider for Oracle" type="System.Data.OracleClient.OracleClientFactory, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add name="SqlClient Data Provider" invariant="System.Data.SqlClient" description=".Net Framework Data Provider for SqlServer" type="System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add name="SQL Server CE Data Provider" invariant="Microsoft.SqlServerCe.Client" description=".NET Framework Data Provider for Microsoft SQL Server 2005 Compact Edition" type="Microsoft.SqlServerCe.Client.SqlCeClientFactory, Microsoft.SqlServerCe.Client, Version=9.0.242.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
</DbProviderFactories>
</system.data>
Mi sto perdendo qualcosa? Dovrei cercare altrove? Codice come DbProviderFactory factory = SqlCeProviderFactory.Instance
funziona bene.
Soluzione
Esistono più installazioni di SQL Server CE . Gli Strumenti di Visual Studio fornisce i componenti di progettazione e di esplorazione dei server e posiziona le DLL di SQL Server CE in una posizione locale in Visual Studio. Ho dovuto installare il runtime per ottenere il fornitore di dati registrato nel file machine.config.
Altri suggerimenti
In Visual Studio 2012, il ProviderName predefinito è System.Data.SqlServerCe.4.0
.
Questo permette a me di trovare una fabbrica per nome:
String providerName = "System.Data.SqlServerCe.4.0";
DbProviderFactory factory = DbProviderFactories.GetFactory(providerName);
if (factory == null)
throw new Exception("Unable to locate factory for " + providerName);
DbConnection conn = factory.CreateConnection();
conn.ConnectionString = connectionString;
conn.Open();
Nota : qualsiasi codice viene rilasciato nel dominio pubblico. Nessuna attribuzione richiesta.