Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
SqlDataSource findet den Datenprovider nicht
Maliko
myCSharp.de - Member



Dabei seit:
Beiträge: 112

Themenstarter:

SqlDataSource findet den Datenprovider nicht

beantworten | zitieren | melden

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:
Fehler
[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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Maliko am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16147

beantworten | zitieren | melden

Wow, ASPX. Fast so alt wie die Dinos ;-)
Die englische Fehlermeldung lautet
Fehler
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 - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Maliko
myCSharp.de - Member



Dabei seit:
Beiträge: 112

Themenstarter:

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Maliko am .
private Nachricht | Beiträge des Benutzers
BerndFfm
myCSharp.de - Team

Avatar #nZo9Gyth4VPDSxGqM4sT.jpg


Dabei seit:
Beiträge: 3782
Herkunft: Frankfurt a.M.

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Maliko
myCSharp.de - Member



Dabei seit:
Beiträge: 112

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Maliko am .
private Nachricht | Beiträge des Benutzers