Laden...

SqlDataSource findet den Datenprovider nicht

Erstellt von Maliko vor 2 Jahren Letzter Beitrag vor 2 Jahren 387 Views
M
Maliko Themenstarter:in
117 Beiträge seit 2012
vor 2 Jahren
SqlDataSource findet den Datenprovider nicht

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.

16.806 Beiträge seit 2008
vor 2 Jahren

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.

M
Maliko Themenstarter:in
117 Beiträge seit 2012
vor 2 Jahren

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.

3.825 Beiträge seit 2006
vor 2 Jahren

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

M
Maliko Themenstarter:in
117 Beiträge seit 2012
vor 2 Jahren

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>

Quelle: Installation | Npgsql Documentation