Einzelnen Beitrag anzeigen

Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 

Re: FirebirdClientFactory kann nicht genutzt werden

  Alt 25. Sep 2006, 10:14
Du musst es nicht in die Maschine.config packen. Dazu braucht man Adminrechte, außerdem kann es so "Kollateralschäden" geben.

Viel "cooler" ist es einfach die app.config zu nehmen:
XML-Code:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings"
                  type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
      <section name="ConsoleApplication12.Properties.Settings"
               type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
               requirePermission="false" />
    </sectionGroup>
    <section name="system.data"
             type="System.Data.Common.DbProviderFactoriesConfigurationHandler,
                   System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
  <applicationSettings>
    <ConsoleApplication12.Properties.Settings>
      <setting name="DefaultProviderName"
               serializeAs="String">
        <value>FirebirdSql.Data.FirebirdClient</value>
      </setting>
    </ConsoleApplication12.Properties.Settings>
  </applicationSettings>
  <system.data>
    <DbProviderFactories>
      <add name="Firebird Data Provider for .NET"
           invariant="FirebirdSql.Data.FirebirdClient"
           description="Firebird Data Provider for .NET"
           type="FirebirdSql.Data.FirebirdClient.FirebirdClientFactory,
                 FirebirdSql.Data.FirebirdClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c" />
    </DbProviderFactories>
  </system.data>
</configuration>
Ich habe meinem Project ein Setting namens DefaultProviderName verpasst. (Sieht man auch in der app.config )
Deshalb kann ich jetzt das Ganze einfach so machen:
Code:
DbProviderFactory factory = DbProviderFactories.GetFactory(Settings.Default.DefaultProviderName);
using (IDbConnection connection = factory.CreateConnection())
{
    Console.WriteLine(connection);
}
Da der XML-Inhalt da oben schon sehr hässlich ist, hier nochmal auf deutsch:

Die ProviderFactory schaut in den Configs nach einer Section namens "system.data".
Diese Section besitzt einen Handler, der weiß wie man Infos daraus ziehen kann (System.Data.Common.DbProviderFactoriesConfigurati onHandler).
In der Config datei werden oben die Sections deklariert, die man benutzen möchte und welche Klasse dafür zuständig ist.
Wie du sehen kannst habe ich dort "system.data" deklariert.
Im Hauptteil der Config-Datei habe ich jetzt unter "system.data" einfach einen weiteren Provider hinzugefügt.
Wie das geht muss man sich nichtmal merken, einfach aus der Maschine.config den system.data-Teil herauskopieren und einen der dortigen Provider mit dem gewünschten ersetzen.
Das was unter invariant steht ist der String, mit dem man den Provider im Programm abfragen kann. Ich nahm hier den Namespace der ADO.Net-Komponenten von FB, aber "Hallo.Du.Da" wäre ebenfalls möglich gewesen...)

Solche Späße in die app.config zu packen hat ein paar Vorteile:
  • Du brauchst keine Adminrechte
  • Du zwingst anderen Apps keine neuere/ältere Version des FbProviders auf
  • andere Apps können dir keine andere Version aufdrängen
  • Du musst den Provider nicht im GAC haben (xcopy Deployment )

edit2: Ups, hatte die system.data section in die appsetings sectionGroup kopiert...
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat