Hey,
ich bin gerade dabei unser "Intranet" (eigentlich ist es nur eine kleine Webseite wo News stehen und man sich für Veranstaltungen anmelden kann) von MSSQL auf Postgresql umzustellen (wir ziehen gerade sämtliche Projekte auf ein einheitliches Datenbanksystem, vorher hatten wir Postgresql, MSSQL und MySQl) und stoße dabei ein ein sehr merkwürdiges Problem
Wenn ich ganz normal über die Code-Behind-Datei versuche eine Datenbankabfrage zu machen funktioniert alles einwandfrei. Ich kann die Daten abrufen und bekomme auch ein ergebnis. Versuche ich das aber über die ASPX-Seite mittels einer SQLDataSource dann bekomme ich folgende Fehlermeldung:
Fehlermeldung:
[ArgumentException: Der angeforderte .Net Framework-Datenprovider kann nicht gefunden werden. Er ist ggf. nicht installiert.]
System.Data.Common.DbProviderFactories.GetFactory(String providerInvariantName) +157
System.Web.UI.WebControls.SqlDataSource.GetDbProviderFactory() +66
System.Web.UI.WebControls.SqlDataSource.GetDbProviderFactorySecure() +22
System.Web.UI.WebControls.SqlDataSource.CreateConnection(String connectionString) +12
System.Web.UI.WebControls.SqlDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments) +95
System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +17
DevExpress.Web.Internal.DataHelper.PerformSelect() +203
DevExpress.Web.Internal.GridDataHelper.PerformSelect() +285
DevExpress.Web.Internal.DataContainer.PerformSelect() +136
DevExpress.Web.ASPxDataWebControlBase.DataBindCore() +13
DevExpress.Web.ASPxDataWebControlBase.DataBindInternal() +109
DevExpress.Web.ASPxWebControl.DataBind() +37
DevExpress.Web.Internal.DataHelperBase.EnsureDataBound(Boolean ensureChildControls) +59
DevExpress.Web.Internal.DataContainer.EnsureDataBound() +142
DevExpress.Web.ASPxDataWebControlBase.OnPreRender(EventArgs e) +22
System.Web.UI.Control.PreRenderRecursiveInternal() +166
System.Web.UI.Control.PreRenderRecursiveInternal() +236
System.Web.UI.Control.PreRenderRecursiveInternal() +236
System.Web.UI.Control.PreRenderRecursiveInternal() +236
System.Web.UI.Control.PreRenderRecursiveInternal() +236
System.Web.UI.Control.PreRenderRecursiveInternal() +236
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +4712
In der web.config ist der Server aber korrekt hinterlegt (wie schon gesagt, über die Code-Behind funktioniert es auch). Habe ich irgendwie noch ein Assambly vergessen, welches ich über Nuget installieren muss, bzw. muss ich in der Web.config noch irgendwas zusätzlich konfigurieren?
Derzeit habe ich als Verbindung zur Datenbank lediglich folgendes in der Web.config stehen:
<connectionStrings>
<add name="MainConnectionString" connectionString="Server=127.0.0.1;Port=5432;Database=Intranet;User Id=Intranet;Password=XXX" providerName="Npgsql" />
</connectionStrings>
Als Konfiguration der DataSource benutze ich folgenden Code:
<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:MainConnectionString %>" ProviderName="<%$ ConnectionStrings:MainConnectionString.ProviderName %>" DeleteCommand="query" InsertCommand="query" SelectCommand="query" UpdateCommand="query">
[. .. Diverse Parameter ... ]
</asp:SqlDataSource>
Nicht wundern, dass bei den Commands nur query steht, die wirklichen Querys habe ich rausgenommen, damit das ganze etwas übersichtlicher wird (vor allem funktionieren die auch gar nicht, da die noch nicht auf postgres umgeschrieben wurden.
Kann mir da wohl vielleicht irgendjemand bei meinem Problem weiterhelfen? Mir fällt nämlich so langsam nix mehr ein.
Wow, ASPX. Fast so alt wie die Dinos 😉
Die englische Fehlermeldung lautet > Fehlermeldung:
Unable to find the requested .Net Framework Data Provider. It may not be installed.
mit der sich i.d.R. mehr auf Google finden lässt, als mit deutschen Fehlermeldungen.
Daher ist es auch eher ratsam, auf lokalisierte SDKs zu verzichten.
Damit für den Kontext (bei dieser sehr alten Anwendungsart zumindest) der Provider bekannt ist und als "installiert" gilt, musst Du ihn in der Config-Section DbProviderFactories
registrieren.
Abrufen einer 'DbProviderFactory' - ADO.NET
Sollte eigentlich auch in der Anleitung des Postgre Providers stehen.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Jup. Die Anwendung ist knapp 15 Jahre alt. Da es aber halt nur ne einfache Informationsplattform ist, bekomme ich auch keine Kapazitäten dafür das Ding komplett neu zu machen (vor allem da ASP auch nicht mein Spezialgebiet ist). Über die eingedeutschten Fehlermeldungen bin ich regelmäßig am Fluchen, leider ist das ein Firmenrechner, auf dem halt alles vorinstalliert war. Das mit der Providerfactory werd ich mal ausprobieren.
Tatsächlich hab ich bisher gar keine Anleitung für den Provider gefunden. Hab halt geschaut welchen Provider ich über Nuget registrieren muss und habs dann einfach durch ausprobieren umgesetzt. Hat bisher auch sehr gut geklappt. Nur an dieser Stelle bin ich dann leider hängen geblieben.
Ich probier das jetzt mal über die ProviderFactory und melde mich dann noch mal obs funktioniert hat oder nicht.
EDIT: Scheint funktioniert zu haben. Zumindest bekomme ich jetzt ne PostgresException, dass ich nen Syntaxfehler habe (was wie im Startpost schon geschrieben habe daran liegt, dass ich die Queries selbst noch nicht angepasst habe.
Den Fehler hatte ich auch bei Kunden. Trotz Installation aller Datenbanktreiber.
Nachdem ich umgeschrieben habe von
if (dbprovider == Provider.MicrosoftSQLServer) factory = DbProviderFactories.GetFactory("System.Data.SqlClient");
if (dbprovider == Provider.FirebirdSQLServer) factory = DbProviderFactories.GetFactory("FirebirdSql.Data.FirebirdClient");
conn = factory.CreateConnection();
nach
if (dbprovider == Provider.MySQL) conn = new MySqlConnection();
if (dbprovider == Provider.MariaDB) conn = new MySqlConnection();
klappt es nun auf allen Rechnern.
GetFactory() benutze ich nicht mehr. Geht auch ohne.
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Deine Lösung hätte mir in diesem Fall nix gebracht, da sich die DataSources ja in den ASPX-Dateien befunden haben. Im Code-Behind mache ich es genauso wie du auch gesagt hast. Da erstelle ich direkt eine Connection. Nur funktioniert die halt nicht im "Frondend". Da muss man mit der Factory arbeiten (zumindest wenn ich das jetzt richtig verstanden habe). Und das eintragen der Factory in der web.config hat ja auch die Lösung gebracht. Jetzt läuft das System fast einwandfrei. Ich muss lediglich noch ein paar letzte Querys umschreiben, welche mit Postgresql nicht kompatibel sind (sprich aus getdate() current_date machen und sowas).
EDIT: Falls übrigens sonst noch mal jemand über das Problem stolpert. Folgendes Snippet muss in die web.config:
<system.data>
<DbProviderFactories>
<add name="Npgsql Data Provider" invariant="Npgsql" description=".Net Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7"/>
</DbProviderFactories>
</system.data>