none
TableAdapter Query liefert kein Ergebnis, obwohl gleiche SQL Abfrage in Access richtiges Ergebnis liefert RRS feed

  • Frage

  • Hallo liebe Forenmitglieder,

    versuche seit längerem mal wieder in C# zu programmieren und bin auf folgendes Problem und trotz Recherche auf keine Lösung gestoßen.

    Ausgangsbedingungen:

    Ich habe eine Accessdatei in ein Dataset eingebunden. Darin enthalten die entsprechenden Tableadapter für jede Tabelle und darin wiederum entsprechende Querys.

    Die Standardquerys (Fill) funktionieren auch. Jetzt wollte ich für einen Adapter eine neue Query, mit 3 Parametern hinzufügen und habe den SQL String in Access erstmal probiert. Access liefert mir akkurat das gewünschte Ergebnis, aber wenn ich mit in der Dataset.xsd eine Datenvorschau ansehen will, erhalte ich kein Ergebnis. Allerdings auch keine Fehlermeldung.

    Noch rätselhafter wird die Sache beim Aufruf der Query zur Laufzeit. Da erhalte ich folgende Fehlermeldung:

    System.Data.ConstraintException ist aufgetreten.
      HResult=0x8013192A
      Nachricht = Einschränkungen konnten nicht aktiviert werden. Mindestens eine Zeile enthält Werte die die Einschränkungen non-null, unique or foreign-key verletzen.
      Quelle = <Die Ausnahmequelle kann nicht ausgewertet werden.>

    Die SQL-Anweisung lautet:

    SELECT tblLösungsvorschläge.Lösungsvorschlag
    FROM     (((tblHauptThemen LEFT OUTER JOIN
                      tblUnterThemen ON tblHauptThemen.HTID = tblUnterThemen.HTID) LEFT OUTER JOIN
                      tblFragensammlung ON tblUnterThemen.UTID = tblFragensammlung.UTID) LEFT OUTER JOIN
                      tblLösungsvorschläge ON tblFragensammlung.FID = tblLösungsvorschläge.FID)
    WHERE  (tblFragensammlung.Frage = ?) AND (tblHauptThemen.Thema = ?) AND (tblUnterThemen.Unterthema = ?)

    Der Aufruf der Query lautet:

    this.tblLösungsvorschlägeTableAdapter.ZeigePassendeVorschläge(this.skpDataSet.tblLösungsvorschläge, cboFrage.Text,cboHT.Text,cboUT.Text  );
                bindingNavigator.BindingSource = tblLösungenBindingSource;

    Wie gesagt, in Access bekomme ich das gewünschte Ergebnis. Kann mir bitte jemand sagen, warum der Tabeladapter
    damit ein Problem hat und wie ich das beheben kann?

    Danke!

    Ralf








    • Bearbeitet Ralf A Donnerstag, 5. Juli 2018 14:24
    Donnerstag, 5. Juli 2018 14:16

Antworten

  • Hallo Ralf,

    EnforceConstraints gibt es auf Ebene des (Standard-)Datasets.

    Hier wird es aber das Einfachste sein, eine weitere DataTable hinzuzufügen, die nur das gewünschte Spalte aber ohne jede Verknüpfung zu anderen Tabellen im Dataset enthält.

    Denn gibt es Fremdschlüssel wäre es ansonsten immer erforderlich, die notwendigen Tabellen ebenfalls zu laden - was bei der Anzahl deiner Joins einige sein könnte. IMHO zu viel des Guten um nur ein Set von IDs zu erhalten ;)

    Gruß Elmar

    • Als Antwort markiert Ralf A Freitag, 6. Juli 2018 17:13
    Freitag, 6. Juli 2018 16:32
    Beantworter

Alle Antworten

  • Hallo Ralf,

    prüfe bitte ob die Spalte Lösungsvorschlag deiner DataTable Nullwerte zulässt. Denn durch die vielen Linksverknüpfungen könnten auch eine NULL dabei herauskommen. Die würdest du auch in Access sehen, dort wird das aber als Fehler angesehen.

    Auch solltest du prüfen, ob die äußeren Verknüpfungen (LEFT JOIN) nicht durch ein INNER JOIN ersetzt werden können. Nicht nur, dass Nullen damit eliminiert werden, solche Abfrage sind  im allgemeinen auch fixer.

    Gruß Elmar

    Donnerstag, 5. Juli 2018 16:13
    Beantworter
  • Hallo Elmar,

    vielen Dank für Deine Antwort!

    Die Spalte Lösungsvorschlag lässt Nullwerte zu. Zumindest interpretiere ich die Original Einstellungin Access

    "Eingabe erforderlich = Nein" als zulassen von Nullwerten. Oder irre ich da?

    Im Tableadapter steht für die Vorschlagsspalte unter AllowDBNull ja auch ein True. Das dürfte also nicht die Ursache sein.

    Den Vorschlag mit dem Inner Join werde ich morgen dennoch mal ausprobieren.

    VG Ralf



    • Bearbeitet Ralf A Donnerstag, 5. Juli 2018 21:46
    Donnerstag, 5. Juli 2018 21:44
  • Hallo Ralf,

    die Access Einstellungen sind hier nicht von Bedeutung, wobei eine Primärschlüssel-Spalte in Access keine Nullwerte erlauben sollte. Wichtig wäre nur ob die Spalten der DataTable es zulassen und ggf. auch, dass es keine Fremdschlüsseleinschränkungen im DataSet gibt, die Nullwerte verhindern. Um letzteres zu prüfen, solltest Du EnforceConstraints auf False setzen.

    Auch führe die Abfrage probehalber mit einem DataReader aus, um zu sehen, was zurückgeliefert wird.

    Gruß Elmar

    Freitag, 6. Juli 2018 07:06
    Beantworter
  • Hallo Elmar,

    habe den Tabellennamen tblLösungsvorschläge abgeändert  in tblLoesungen und den Spaltennamen Lösungsvorschläge in Vorschlag abgeändert, weil ich vermutete, dass evtl. die Umlaute das Problem sein könnten. Das war es aber auch nicht. Auch die Änderung in einen Inner Join hat das Problem nicht wirklich gelöst...

    Habe die Abfrage so abgeändert:

    SELECT tblLoesungen.Vorschlag
    FROM     (tblFragensammlung INNER JOIN
                      tblLoesungen ON tblFragensammlung.FID = tblLoesungen.FID)
    WHERE  (tblFragensammlung.Frage = ?)

    In Acces und auch im Abfragegenerator des VS erhalte ich die gewünschten Ergebnisse. Sobald ich aber das Programm starte, erhalte ich beim Aufruf der Abfrage

    this.tblLoesungenTableAdapter.FillByVorschlagAufFrage(this.skpDataSet.tblLoesungen , cboFrage.Text);

    die Fehlermeldung

    System.Data.ConstraintException: "Einschränkungen konnten nicht aktiviert werden. Mindestens eine Zeile enthält Werte die die Einschränkungen non-null, unique or foreign-key verletzen."

    Deine Vermutung mit den Nullwerten trifft also zu.

    Das Dilemma ist, in der Abfrage selbst verwende ich keine Primär- oder Fremdschlüssel. Die Tabellen sind zwar über das Feld FID (Fremdschlüssel in tblLoesungen, Primärschlüssel in tblFragensammlung ) miteinander verknüpft, aber wie gesagt, den Schlüssel verwende ich in der Abfrage nicht. Jedenfalls nicht als auszugebende Werte, sondern nur zum Vergleich...

    Wo genau setze ich EnforceConstraints auf false? Hab die Einstellung weder im Tableadapter, noch im Feld Vorschlag gefunden.

    Kann es sein, dass ich für diese Abfrage eine extra Tabelle anlegen sollte, die das Feld FID nicht enthält? Erklärt aber immer noch nicht die Frage, weshalb es in Access und im Abfragegenerator funktioniert...

    Danke für Deine Zeit, die Du mir widmest!

    Ralf




    • Bearbeitet Ralf A Freitag, 6. Juli 2018 10:39
    Freitag, 6. Juli 2018 10:16
  • Hi Ralf,
    mit dem "FillByVorschlagAufFrage" lädst du daten in das DataSet ("skpDataSet") in die Tabelle "tblLoesungen". Diese Tabelle steht im DataSet mit einer anderen Tabelle in Beziehung. Die geladenen Daten passen aber nicht zu dieser Bezeihung. Die Ursache kann sein, dass die andere Tabelle keine Datensätze enthält (weil sie als Master-Tabelle angelegt ist).

    Zeig mal die Struktur des DataSets, insbesondere die DataRelations und die diesbezüglichen Feldinhalte.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Freitag, 6. Juli 2018 12:28
  • Hallo Peter,

    "Zeig mal die Struktur des DataSets, insbesondere die DataRelations und die diesbezüglichen Feldinhalte."

    Meintest Du damit die xsd Datei? Wie krieg ich die hier hochgeladen?

    VG Ralf

    Freitag, 6. Juli 2018 12:57
  • Hallo Ralf,

    EnforceConstraints gibt es auf Ebene des (Standard-)Datasets.

    Hier wird es aber das Einfachste sein, eine weitere DataTable hinzuzufügen, die nur das gewünschte Spalte aber ohne jede Verknüpfung zu anderen Tabellen im Dataset enthält.

    Denn gibt es Fremdschlüssel wäre es ansonsten immer erforderlich, die notwendigen Tabellen ebenfalls zu laden - was bei der Anzahl deiner Joins einige sein könnte. IMHO zu viel des Guten um nur ein Set von IDs zu erhalten ;)

    Gruß Elmar

    • Als Antwort markiert Ralf A Freitag, 6. Juli 2018 17:13
    Freitag, 6. Juli 2018 16:32
    Beantworter
  • ...ah! Danke!

    2 Bemerkungen dazu:

    1. EnforceConstraints gefunden, auf false gesetzt und siehe da, es funktioniert.
    2. Nachdem das Ergebnis sichtbar wurde, wurde auch klar, weshalb der Fehler geworfen wurde.

    Mein Irrtum war, dass ich glaubte, es würden nur die Felder angezeigt, die ich in der Select Anweisung der Query angegeben hatte. Also in meinem Fall nur das Feld Vorschlag. Tatsächlich werden aber alle im Adapter vorhandenen Felder angezeigt. Und da da auch andere Fremdschlüssel enthalten sind, die aber in der Abfrage keine Werte übergeben bekommen hatten, wurde der Fehler geworfen.

    Somit werde ich die Abfrage anpassen und EnforceConstraints wieder auf True setzen.

    Wieder was dazu gelernt! Danke und ein schönes Wochenende!

    Ralf




    • Bearbeitet Ralf A Freitag, 6. Juli 2018 17:21
    Freitag, 6. Juli 2018 17:13