Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   C# DbProviderFactory: Provider will nicht geladen werden? (https://www.delphipraxis.net/79924-dbproviderfactory-provider-will-nicht-geladen-werden.html)

Phoenix 31. Okt 2006 10:39

Datenbank: Oracle • Version: XE • Zugriff über: CoreLab Oracle Direct

DbProviderFactory: Provider will nicht geladen werden?
 
Dank dem Gespräch mit Elvis letzte Woche habe ich eine kleine Applikation versucht auf DbProviderFactory und die System.Data Interface umzustellen.

Soweit, sogut, aber beim Starten der Datenbankverbindung geht mir da noch was in die Hose.

Folgender Fehler tritt auf:
Zitat:

Column 'InvariantName' is constrained to be unique. Value 'CoreLab.Oracle' is already present.
und zwar an genau der Stelle, an der ich die Factory holen will:

Code:
_factory = DbProviderFactories.GetFactory(Properties.Settings.Default.DefaultProviderName); // <-- hier knallts
_DbConnection = _factory.CreateConnection();
Hier der Auszug aus meiner App.Config:

XML-Code:
   <configSections>
      <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
         <section name="system.data" type="System.Data.Common.DbProviderFactoriesConfigurationHandler, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
      </sectionGroup>
   </configSections>

   <applicationSettings>
      <ASTA.Properties.Settings>
   <setting name="DefaultProviderName" serializeAs="String">
    <value>CoreLab.Oracle</value>
   </setting>
  </ASTA.Properties.Settings>
   </applicationSettings>

   <system.data>
      <DbProviderFactories>
         <add name="Corelabs Oracle Provider for .NET"
    invariant="CoreLab.Oracle"
    description="Corelab Orlace Provider for .NET"
    type=" CoreLab.Oracle.OraDirectFactory, CoreLab.Oracle, Version=3.50.9.0, Culture=neutral, PublicKeyToken=09af7300eec23701" />
      </DbProviderFactories>
   </system.data>
Hab ich was übersehen oder vergessen?

Jürgen Thomas 31. Okt 2006 15:39

Re: DbProviderFactory: Provider will nicht geladen werden?
 
Hallo Sebastian,

auf den ersten Blick sieht alles korrekt aus. Versuch zunächst Folgendes mit Debugger über eine zusätzliche String-Variable:

1. Wie lautet der String, der über DefaultProviderName gelesen wird? An dieser Stelle muss der Wert stehen, der in der config-Datei im invariant-Attribut steht.

2. Wenn das passt, dann solltest Du einmal - mit Debugger oder temp-DataGrid(View) - mit GetFactoryClasses() alle zur Verfügung stehenden Provider einlesen. In der davon gelieferten DataTable ist das Feld InvariantName von Bedeutung. Der Wert dieses Feldes gehört in die config-Datei als "invariant".

Wichtiger Nachtrag
Du hast in app.config den Verweis auf section name="system.data" innerhalb der sectionGroup name="applicationSettings" eingetragen. Verändere dies mal:
XML-Code:
  <configSections>
    <sectionGroup name="applicationSettings"
      type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0,
      Culture=neutral, PublicKeyToken=b77a5c561934e089" >
    </sectionGroup>
    <section name="system.data"
             type="System.Data.Common.DbProviderFactoriesConfigurationHandler,
                   System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
Viel Erfolg! Jürgen

[edit=Phoenix](XML-Formatierung war zerlegt... Blöder HTML-Cache ;-) Mfg, Phoenix[/edit]

Phoenix 1. Nov 2006 08:04

Re: DbProviderFactory: Provider will nicht geladen werden?
 
Sodele... ich und meine Freizeit im Moment *schnauf* ;-)

1.) Zum Nachtrag: Das reine Verschieben des Abschnitts System.data in der App.config hat nichts geholfen.

Zitat:

Zitat von Jürgen Thomas
1. Wie lautet der String, der über DefaultProviderName gelesen wird? An dieser Stelle muss der Wert stehen, der in der config-Datei im invariant-Attribut steht.

Es steht tatsächlich "CoreLab.Oracle" drin. Das passt also.

Zitat:

Zitat von Jürgen Thomas
2. Wenn das passt, dann solltest Du einmal - mit Debugger oder temp-DataGrid(View) - mit GetFactoryClasses() alle zur Verfügung stehenden Provider einlesen. In der davon gelieferten DataTable ist das Feld InvariantName von Bedeutung. Der Wert dieses Feldes gehört in die config-Datei als "invariant".

Hrm.. der Fehler trat auch beim Aufruf von GetFactoryClasses() auf.
Dank Debugger konnte ich aber herausfinden, das Corelab schon 2x drin war. Also meinen Eintrag aus der App.Config herausgenommen und *wuppdi* - hab ich den Provider bekommen.

Nun stimmt nur noch der ConnectionString nicht, aber den bekomm ich denk ich mal schon hin ;-)

Elvis 1. Nov 2006 08:10

Re: DbProviderFactory: Provider will nicht geladen werden?
 
Zitat:

Zitat von Phoenix
Nun stimmt nur noch der ConnectionString nicht, aber den bekomm ich denk ich mal schon hin ;-)

Du vertraust jetzt aber darauf, dass der CoreLabs Provider auf dem Zielsystem installiert wurde.
Wenn du ihn einfach nur durch Kopieren in dein AppDir benutzen wilst, soltest du dir einen eigenen InvariantName ausdenken. Zum Bleistift deinen eigenen Namespace prefix davorpacken. ;)

Jürgen Thomas 1. Nov 2006 08:19

Re: DbProviderFactory: Provider will nicht geladen werden?
 
Zitat:

Zitat von Elvis
Du vertraust jetzt aber darauf, dass der CoreLabs Provider auf dem Zielsystem installiert wurde.

Hallo Elvis,

das verstehe ich nicht:
Zitat:

Zitat von Phoenix
Hrm.. der Fehler trat auch beim Aufruf von GetFactoryClasses() auf.
Dank Debugger konnte ich aber herausfinden, das Corelab schon 2x drin war. Also meinen Eintrag aus der App.Config herausgenommen und *wuppdi* - hab ich den Provider bekommen.

Dadurch ist doch schon klar, dass der Provider installiert ist, oder?! Jürgen

Phoenix 1. Nov 2006 08:29

Re: DbProviderFactory: Provider will nicht geladen werden?
 
Nachtrag: Hat alles geklappt ;-)

Das muss man aber auch erstmal wissen, dass sich Corelab direkt in die Provider einträgt und kein extra Eintrag in der App.Config nötig ist.

Naja, beim ausliefern werd ich wohl das Corelab Assembly ins Anwendungsverzeichnis legen und die dennoch eintragen in die App.config - aber das weiss ich ja jetzt ;-)

Elvis 1. Nov 2006 08:35

Re: DbProviderFactory: Provider will nicht geladen werden?
 
Zitat:

Zitat von Jürgen Thomas
Dadurch ist doch schon klar, dass der Provider installiert ist, oder?! Jürgen

Hi Jürgen,
Zielsystem != Entwicklungssystem. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz