![]() |
Datenbank: Firebird • Version: 2.0 RC1 • Zugriff über: FB NET Provider 2.0.1 RC1
FirebirdClientFactory kann nicht genutzt werden
Hallo,
ich möchte mich auf einen DB-unabhängigen Zugriff vorbereiten und möchte dabei DbProviderFactory nutzen. Das klappt aber für FirebirdClientFactory nicht; die verschiedenen Fehlermeldungen helfen mir nicht weiter. Der FB-NET-Provider ist in machine.config eingetragen (Dank an Carlos Guzmán Álvarez):
Code:
Ausgangspunkt ist folgender Versuch (nach @Elvis und anderen Hinweisen):
<configSections>
<section name="firebirdsql.data.firebirdclient" type="System.Data.Common.DbProviderConfigurationHandler, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> ... <DbProviderFactories> <add name="FirebirdClient Data Provider" invariant="FirebirdSql.Data.FirebirdClient" description=".Net Framework Data Provider for Firebird" type="FirebirdSql.Data.FirebirdClient.FirebirdClientFactory, FirebirdSql.Data.FirebirdClient, Version=%Version%, Culture=%Culture%, PublicKeyToken=%PublicKeyToken%" /> ... // Subst: %Version% -> The version of the provider assembly you are using. %Culture% -> The culture of the provider assembly you are using. %PublicKeyToken% -> The Public Key Token of the provider assembly you are using.
Code:
Dieses Problem ist mir inzwischen klar, weil DbProviderFactory eine abstrakte Klasse ist. Also will ich gezielt FirebirdClientFactory einbinden, was mir aber nicht gelingt:
private System.Data.Common.DbProviderFactory dataFactory;
string s0 = System.Configuration.ConfigurationManager.AppSettings["provider"]; // s0 enthält den korrekten Wert dataFactory = System.Data.Common.DbProviderFactories.GetFactory(s0); // Fehlermeldung: Exception System.TypeInitializationException was thrown in debuggee: Der Typeninitialisierer für JThomas.DGW.Data.DbService hat eine Ausnahme verursacht. Versuch A
Code:
dataFactory = FirebirdSql.Data.FirebirdClient.FirebirdClientFactory;
Zitat:
Code:
Versuch C
dataFactory = FirebirdSql.Data.FirebirdClient.FirebirdClientFactory();
Code:
dataFactory = new FirebirdSql.Data.FirebirdClient.FirebirdClientFactory();
Zitat:
Zitat:
Danke für erläuternde Hinweise! Jürgen PS. Für dieses Problem hätte ich lieber ein NET- oder Firebird-Forum. Aber die DP wird so oft und gerne besucht (vor allem auch von DB-Fachleuten), dass ich hier die größte Erfolgsaussicht vermute. |
Re: FirebirdClientFactory kann nicht genutzt werden
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:
Ich habe meinem Project ein Setting namens DefaultProviderName verpasst. (Sieht man auch in der app.config :zwinker: )
<?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> Deshalb kann ich jetzt das Ganze einfach so machen:
Code:
Da der XML-Inhalt da oben schon sehr hässlich ist, hier nochmal auf deutsch:
DbProviderFactory factory = DbProviderFactories.GetFactory(Settings.Default.DefaultProviderName);
using (IDbConnection connection = factory.CreateConnection()) { Console.WriteLine(connection); } 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:
edit2: Ups, hatte die system.data section in die appsetings sectionGroup kopiert... :oops: |
Re: FirebirdClientFactory kann nicht genutzt werden
Danke, Elvis, für die schnelle Antwort. Hier zunächst ebenso schnelle Anmerkungen.
Mir fehlt (unter vielem anderen) ein Tutorial o.ä., was und wie man praktisch mit den applicationSettings umgeht. Bei meinem ersten Versuch (siehe mein erster C-Quellcode) hatte ich festgestellt, dass der FB-Provider überhaupt nicht bekannt war. Als ich die Original-NET-Provider in machine.config fand, habe ich das (mit Hinweis durch Carlos) für FB erweitert. Im Moment stecke ich in anderen Überlegungen fest (dort komme ich allerdings voran); deshalb werde ich Deine Hinweise erst etwas später untersuchen und benutzen. Unklar bleibt mir aber auf jeden Fall: Was ist mit FirebirdClientFactory und den von mir festgestellten Problemen (Versuche A, B, C)? Danke für Ergänzungen! Jürgen |
Re: FirebirdClientFactory kann nicht genutzt werden
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Du kannst also höchstens FirebirdClientFactory.instance benutzen. Oder du gehst den Weg über die ProviderFactory, die macht nichts anderes. Versuch A kann nicht gehen, da du einen Typen nicht einfach so in eine Variable stecken kannst (Kontext ungültig :zwinker: ) Versuch B kann nicht gehen, da ein Typ keine Funktion ist, selbst ein "new" (Versuch C) davor kann nicht gehen, da der Contructor private ist. FirebirdClientFactory ist nunmal ein Singleton, auch wenn das hier IMHO Blödsinn ist. Ich glaube der von mir gezeigte Weg ist der schniekeste, denn:
Wenn du noch keine Settings hast, findest du einen Link, der sie anlegen wird. Nun kannst du einfach einen neuen Eintrag anlegen und ihm einen Default wert geben. (im Screenie siehst du den, den ich für den Bleistift code genommen habe) Jetzt solltest du das hier machen können:
Code:
btw: Den Teil des type-Attributes in der Provider-section, kannst du direkt aus dem Reflector kopieren. Dadurch kannst du dir sicher sein, dass Version, Culture und Public key token richtig sind. :)
DbProviderFactory factory = DbProviderFactories.GetFactory(Settings.Default.DefaultProviderName);
using (IDbConnection connection = factory.CreateConnection()) { Console.WriteLine(connection); } |
Re: FirebirdClientFactory kann nicht genutzt werden
Hallo Elvis,
jetzt versuche ich den ganzen Vormittag, Deine Anleitung zu verstehen und umzusetzen, aber ich bin offensichtlich zu dämlich. Alles, was Du mir zum Bereich <system.data> und der Einbindung des FirebirdClient geschrieben hast, ist klar; es handelt sich ja in der Tat 'nur' um das Verschieben von machine.config nach app.config. Beim Lesen der Werte aus der config-Datei habe ich aber keinerlei Erfolg:
Nachtrag zur FirebirdClientFactory: Welche Information habe ich überlesen, dass dies eine Singleton-Klasse ist? Hätte mich vor allem die Eigenschaft 'Instance' darauf hinweisen sollen? Hier teile ich Deine Einschätzung, dass dies als Singleton eher Quatsch ist: Für mehrere DBs benutzt man doch wohl auch mehrere Instanzen von DbProviderFactory, oder? Danke für weitere Hinweise und Erläuterungen! Jürgen |
Re: FirebirdClientFactory kann nicht genutzt werden
Zitat:
Zitat:
Code:
// der invariantName den du dem Provider verpasst hast
// ich nahm den hier: DbProviderFactory factory = DbProviderFactories.GetFactory("FirebirdSql.Data.FirebirdClient"); using (IDbConnection connection = factory.CreateConnection()) { Console.WriteLine(connection); } Zitat:
Zitat:
Diese Macke haben alle DbProviderFactories, vllt werden sie irgendwo über Referenzen verglichen. Keine Ahnung, wirklich... :gruebel: |
Re: FirebirdClientFactory kann nicht genutzt werden
Hallo Elvis,
nach vielem langem Probieren bin ich jetzt endlich fündig geworden und kann auf meine FB-DB zugreifen. Mein Fehler, warum ich den FirebirdClient nicht aktivieren konnte, war ganz banal:
XML-Code:
Speicherung in GAC und Appl-Verzeichnis, PublicKeyToken und app.config habe ich mehrfach in verschiedenen Situationen geprüft; aber auf den Gedanken, dass die Versionsnummer falsch sein könnte, bin ich nicht gekommen...
<system.data>
<DbProviderFactories> <add name="FirebirdClient NET-Provider" invariant="FirebirdSql.Data.FirebirdClient" description="FirebirdClient Data Provider for .NET" type="FirebirdSql.Data.FirebirdClient.FirebirdClientFactory, FirebirdSql.Data.FirebirdClient, Version=2.0.1.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c" /> </DbProviderFactories> </system.data> Meine Versuche umfassten: Buch aus der Stadtbibliothek geholt, genau und gezielt gelesen, NET-Doku untersucht, Visual C# Express von MS geholt und installiert (damit ich den Settings-Manager nutzen konnte), Roeder's Reflector mit Details untersucht - und schließlich Fusion_Log_View.exe genutzt. So kann Zeit verloren gehen; aber dabei lernt man natürlich zusätzlich. Jedenfalls vielen Dank für Deine Hilfe! Jürgen |
Re: FirebirdClientFactory kann nicht genutzt werden
Zitat:
Sorry, aber das kann ich mir jetzt nicht verkneifen: Zitat:
|
Re: FirebirdClientFactory kann nicht genutzt werden
moin Elvis :mrgreen:
wollte das mit den DbProviderFactory- Klasse mal probieren. leider kennt er diese Klasse nicht. jetzt bin ich verzweifelt auf der Suche nach der .dll . gib mir mal einen Tip :zwinker: danke Raik // edit Leichte Schläge auf den Hinterkopf erhöhen das Denkvermögen :wall: System.Data.Common |
Re: FirebirdClientFactory kann nicht genutzt werden
Zitat:
Reflector -> F3 -> DbPoviderFactory -> Erleuchtung. ;) btw: Wollten wir uns oben in der Altmark nichtmal auf ein Bier treffen? :zwinker: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz