Autor |
Beitrag |
m-s
      
Beiträge: 149
Erhaltene Danke: 7
Win 10
C# (VS 2015)
|
Verfasst: Di 18.01.11 00:28
Hallo Zusammen,
ich habe drei Tabellen als SQL Express in meinem kleinen Programm.
Zwei der Tabellen funktionieren korrekt, eine nicht und zwar kann ich Daten anlegen, aber nicht ändern. Ich bekomme dann eine Ausnahme, s.o.
Besonderheit an der nicht funktionierenden, Sie ist mit den anderen beiden verbunden.
In der nicht funktionierenden Tabelle gibt es, wie bei den beiden anderen, einen primären Schlüssel und zwei Felder die nicht Null sein dürfen. Eines davon ist ein Feld aus einer der anderen Tabellen, das andere der Name.
Ich fange erst an mit C# zu programmieren, bin also schon allein beim Beschreiben des Problems unsicher
Ich hoffe Ihr könnt Euch trotzdem eindenken.
Ich habe mit dem Designer die Verbindung zwischen den Tabellen hergestellt, dann die Tabelle in der Detailansicht auf ein Form gezogen und in die beiden verbundenen Felder jeweils die dazugehörige Tabelle. Angezeigt wird in den Felder der Name, ValueMember ist der PrimaryKey, also die Nummer.
Speicherung der neuen Datensätze, bzw. der Änderungen geht über den vom System erstellten Code:
Quelltext 1: 2: 3:
| this.Validate(); this.pferdBindingSource.EndEdit(); this.tableAdapterManager.UpdateAll(this._PHO_SODataSet); |
Ich lese jetzt schon zwei Tage, suche und frage Leute, aber alle Ansätze führen mich nicht weiter. Was sicherlich auch daran liegt, das ich so wenig von C# und SQL verstehe.
Bin für jede Anregung dankbar, bitte auf AnfängerNiveau 
|
|
m-s 
      
Beiträge: 149
Erhaltene Danke: 7
Win 10
C# (VS 2015)
|
Verfasst: Sa 22.01.11 02:51
Hi Zusammen,
ist meine Frage so schlecht gestellt?
Hat denn niemand ne Idee?
Gruß Markus
|
|
Trashkid2000
      
Beiträge: 561
Erhaltene Danke: 137
|
Verfasst: Sa 22.01.11 11:07
Hallo und
Also, die Problembeschreibung von Dir ist schon ziemlich schwer zu verstehen, wie ich finde.
m-s hat folgendes geschrieben : |
Besonderheit an der nicht funktionierenden, Sie ist mit den anderen beiden verbunden.
In der nicht funktionierenden Tabelle gibt es, wie bei den beiden anderen, einen primären Schlüssel und zwei Felder die nicht Null sein dürfen. Eines davon ist ein Feld aus einer der anderen Tabellen, das andere der Name. |
Ist dann die Tabelle, bei der der UpdateCommand nicht funktioniert, nicht nur mit einer anderen Tabelle verbunden?
Aus Deinem Code habe ich erlesen, dass Du mit einem DataSet arbeitest.
m-s hat folgendes geschrieben : |
Ich habe mit dem Designer die Verbindung zwischen den Tabellen hergestellt...
|
Ich denke, genau hier liegt das Problem. Denn der Designer legt die Relationen zwischen den Tabellen selbstständig an, sofern sie denn auch in der Datenbank angelegt sind. Ich denke, das ist bei Dir nicht der Fall. Die Commands, die im generierten Code gebildet werden, werden ja aus dem Tabellenschema gebildet. Und wenn das Schema im DataSet vom Schema in der Datenbank abweicht, knallt es da. Also müsstest Du zuerst einmal das Datenbankschema überarbeiten, und dort die Relationen hinzufügen, dann mal Dein DataSet aktualisieren, neu erstellen (oder wie auch immer), und dann klappt das schon!
LG, Marko
|
|
m-s 
      
Beiträge: 149
Erhaltene Danke: 7
Win 10
C# (VS 2015)
|
Verfasst: Sa 22.01.11 13:14
Hallo Marko,
das meine Beschreibung so schlecht ist, liegt sicherlich daran das ich noch so wenig verstehe. Danke das Du trotzdem antwortest.
Ich weiß leider gar nicht, wie ich Deinen Rat umsetzen soll. Ich beschreibe mal wie ich vorgegangen bin, vielleicht kannst Du da einhaken.
Ich bin in VSE 2010 in den Datenbank-Explorer gegangen und habe über die Funktion "Mit Datenbank verbinden" eine neue Datenbank erstellt.
Microsoft SQL-Server-Datenbankdatei / .Net Framework-Datenanbieter für SQL Server
Dann habe ich die Datenbank "geöffnet (also einfach auf den schwarzen Pfeil links neben dem Namen) und mit Rechtsklick auf Tabellen eine neue Tabelle angelegt.
Bisher sind wie gesagt drei Tabellen in der Datenbank die habe ich nach und nach erstellt. Jede Tabelle hat ein Feld für den Primärschlüssel, das heißt unter "Identitätsspezifikation" -(Ist Identity) ist ja angegeben.
In der Tabelle, die keine Änderungen zulässt, sondern eben den oben genannten Fehler macht, gibt es neben den normalen Feldern zwei, die die Schlüssel der anderen Tabellen aufnehmen können sollen. Ein Feld davon darf nicht NULL sein.
Wenn ich Dich richtig verstanden habe, soll ich schon hier im Datenbank-Explorer die Verbindung anlegen, ich habe aber keine Ahnung wie das geht.
Deswegen bin ich so vorgegangen:
Ich bin auf Datenquellen gegangen und habe über den Punkt neue Datenquellen hinzufügen die vorher erstellte Datenbank eingefügt. Da hier, beim Hinzufügen erst nur eine Tabelle enthalten war, habe ich dann später über den "Assistenten zum Konfigurieren von Datenquellen" die neu angelegten Tabellen der Datenbank hinzugefügt.
Ich bin dann über die Funktion "DataSet mit Designer bearbeiten" auf die Felder gegangen, die Felder gegangen die Primärschlüssel sein sollen und habe über die rechte Maustaste "Primärschlüssel festlegen" ausgewählt. Um die Beziehung zwischen den Tabellen herzustellen, habe ich den Primärschlüssel der einen Tabelle auf das entsprechende Feld der besagten Tabelle gezogen und als Beziehung "Sowohl Beziehung- als auch Fremschlüsseleinschränkung" ausgewählt. Bei den Regeln unten, jeweils "None".
Das gleiche habe ich dann noch mit der anderen Tabelle gemacht. So das es also zwischen der Tabelle, die die Probleme macht und den anderen Beiden Tabellen, jeweils eine Beziehung gibt.
Das ganze habe ich dann gespeichert und das entsprechende Form angelegt, die Felder als Details draufgezogen usw.
Kannst Du sehen an welcher Stelle ich den Fehler gemacht habe?
Gruß Markus
|
|
Trashkid2000
      
Beiträge: 561
Erhaltene Danke: 137
|
Verfasst: Sa 22.01.11 20:35
Hallo,
Gut, dass Du Schritt für Schritt geschrieben hast, wie Du vorgegangen bist.
Okay, nachdem also die Tabellen angelegt wurden fehlt ja nun also nurnoch das anlegen der Relationen zwischen den Tabellen. Denn es ist ja eine relationale Datenbank. Ich erkläre mal, wie man da vorgeht (arbeite sonst immer mit dem Management Studio, da ist es konfortabler):
1. Wähle die Tabelle aus, die die Spalten für die Fremdschlüssel aus den anderen Tabellen besitzt
2. Wähle die Tabelleneigenschaften aus
3. Beziehungen hinzufügen
4. Gebe einen Namen für die Beziehung an. Schema in etwa: FK_<Tabellennname mit dem Primärschlüssel>_<diese Tabelle>
5. Wähle unter "Primärschlüsseltabelle" die Tabelle aus, die den Primärschlüssel der Relation hat
6. Wähle unter "Primärschlüsseltabellenspalte" und unter "Fremdschlüsseltabellenspalte" die richtigen Felder aus
7. Spalten hinzufügen
8. Beziehungen hinzufügen
9. Du erhältst eine Info, dass die Einschränkungen hinzugefügt wurden
10. Wiederhole Schritt 4 - 8
Gut, die Relationen wurden somit erstellt. Das Ganze kann man auch schnell mit 2 SQL-Statements erledigen, aber als Anfänger sollte man es lieber so machen. Nun muss nur noch das DataSet aktualisiert werden. Oder neu angelegt werden. Wie Du dies machst, sei Dir überlassen. Und dann dürfte es mit dem UpdateCommand auch funktionieren. Mit der Einschränkung natürlich, dass in den Fremschlüssel-Spalten Werte drin stehen, die es in den andern beiden Tabellen gibt. Aber dazu sind ja Relationen schließlich da.
Viel Erfolg dabei und LG,
Marko
|
|
m-s 
      
Beiträge: 149
Erhaltene Danke: 7
Win 10
C# (VS 2015)
|
Verfasst: So 23.01.11 01:09
Hallo Marko,
ich bin etwas unsicher ob ich die Stellen gefunden habe, die Du meintest.
Ich kann den Tabellen nur eine Relation hinzufügen, wenn ich Designer bin. Im Datenbankbrowser finde ich keine entsprechende Funktion.
Dort hatte ich die Relationen schon angelegt, nur eben mit Drag&Drop, statt über das Menü.
Wenn ich alles richtig verstanden habe, auch so wie Du es beschrieben hast. Hier mal nen Screenshot.
Wenn ich das Form starte das die Fehler macht, dann kann ich einen neuen Datensatz anlegen und kann über die ComboBox auch den Datensatz aus der verbundenen Tabelle lesen. (Screenshot2)
Ich kann dann das Form verlassen und wieder aufrufen und die Daten, auch von mehreren Datensetzen werden korrekt, also wie angelegt, angezeigt.
Ich kann nur keinerlei Änderungen an den Datensätzen vornehmen. Egal in welchem der Felder ich etwas ändere, bekomme ich beim Speichern die o.g. Fehlermeldung.
Kannst Du genauer beschreiben wo ich die Relation noch anlegen könnte, oder fällt Dir noch etwas ein?
Gruß Markus
P.S. Bei den Einschränkungen, habe ich aus Verzweiflung so einiges versucht. Zuerst hatte ich "Sowohl Beziehungs- als auch Fremdschlüsseleinschränkungen". Und bei Regel Aktualisieren , Regel löschen und Regel akzeptieren jeweils None.
Einloggen, um Attachments anzusehen!
|
|
Trashkid2000
      
Beiträge: 561
Erhaltene Danke: 137
|
Verfasst: So 23.01.11 11:55
Hallo,
also mit dem anlegen der Relationen in der Datenbank: Habe mal eine gute Seite gefunden, wo dies genau erklärt wird (mit Bildern):
www.codeplanet.eu/tu...compact.html?start=1
Klar geht es auch, wenn Du die Relationen im DataSet hinzufügst, aber das ist nur halbe Sicherheit. Denn wenn man sich direkt mit der Datenbank verbinden würde, könnte man trotzdem fehlerhafte Daten eintragen, und die referenzielle Integrität wäre nicht mehr gewährleistet. Also sollten die Relationen in der DB angelegt sein, und das DataSet sollte diese dann übernehmen.
Was allerdings noch nicht den ungültigen UpdateCommand erklärt... bin da auch gerade ein bisschen ratlos
Ferndiagnose ist immer schwer. Wäre es möglich, dass Du das Projekt und die .sdf mal zippst und hier hochlädtst? Du kannst ja die Daten in der Datenbank, sofern sie irgendwie vertraulich sind, vorher löschen. Das würde die Problembehebung sehr viel erleichtern.
LG, Marko
|
|
m-s 
      
Beiträge: 149
Erhaltene Danke: 7
Win 10
C# (VS 2015)
|
Verfasst: So 23.01.11 14:49
Trashkid2000 hat folgendes geschrieben : | Hallo,
also mit dem anlegen der Relationen in der Datenbank: Habe mal eine gute Seite gefunden, wo dies genau erklärt wird (mit Bildern):
www.codeplanet.eu/tu...compact.html?start=1
Klar geht es auch, wenn Du die Relationen im DataSet hinzufügst, aber das ist nur halbe Sicherheit. Denn wenn man sich direkt mit der Datenbank verbinden würde, könnte man trotzdem fehlerhafte Daten eintragen, und die referenzielle Integrität wäre nicht mehr gewährleistet. Also sollten die Relationen in der DB angelegt sein, und das DataSet sollte diese dann übernehmen.
|
Hallo Marko,
da liegt wahrscheinlich unser Missverständnis. Ich habe die Datenbank nicht mit SQL Compact sondern SQL Express angelegt. Die Anleitung und die Bilder beziehen sich aber auf SQL Compatkt. Deswegen konnte ich vermutlich auch Deine Anweisungen nicht ganz nachvollziehen.
Gruß Markus
|
|
Trashkid2000
      
Beiträge: 561
Erhaltene Danke: 137
|
Verfasst: So 23.01.11 20:00
m-s hat folgendes geschrieben : | Ich habe die Datenbank nicht mit SQL Compact sondern SQL Express angelegt |
Ups, sorry, mein Fehler  Habe da wohl was missverstanden.
Und noch etwas, was mir entgangen ist: Du hast zwar in der Datenbank bei den Spalten, die Primärschlüssel sein sollen, zwar ein AutoIncrement gesetzt, aber sie sind nicht automatisch Primärschlüssel, sondern müssen erst als solche markiert werden. Wenn das geschehen wäre, hättest Du sie im DataSet-Designer nämlich nicht nachträglich kennzeichnen müssen. Und deswegen schlägt nämlich auch das Update fehl.
Kurzum: Gehe mal im Server-Explorer auf den Ordner "Datenbankdiagramme". Lege dann ein neues Datenbankdiagramm an, und füge die Tabellen dazu. Setze danach erst einmal alle Primärschlüssel. Dann die Relationen. Diese kannst Du einfach per Ziehen vom Primärschlüssel einer Tabelle zum Fremdschlüssel der anderen erledigen.
Sollte es unter dem Express-Server keine Datenbankdiagramme geben (kenne mich mit dem Express nicht sonderlich aus), musst Du das Ganze per SQL erledigen:
Setzen der Primärschlüssel:
SQL-Anweisung 1:
| ALTER TABLE <Tabellenname> ADD PRIMARY KEY (<Primärschlüsselspalte>); |
Und die Relationen:
SQL-Anweisung 1:
| ALTER TABLE <Tabelle mit Fremdschlüssel> WITH CHECK ADD CONSTRAINT <Name der Relation> FOREIGN KEY(<Fremdschlüsselspalte>) REFERENCES <Tabelle mit Primärschlüssel> (<Primärschlüsselspalte>) | Gut, das waren dann die Sachen an der Datenbank. Fehlt also nur noch das DataSet. Wie man dies aktualisiert, keine Ahnung. Würde es einfach löschen und neu erstellen.
Wenn das alles glatt gegangen ist, solltest Du nun im DataSet gleich die Primärschlüssel und die Relationen haben, ohne manuell was zu ändern. Und dann muss es auch mit dem Update klappen!
LG, Marko
Für diesen Beitrag haben gedankt: m-s
|
|
m-s 
      
Beiträge: 149
Erhaltene Danke: 7
Win 10
C# (VS 2015)
|
Verfasst: So 23.01.11 21:46
Hallo Marko,
ja Klasse das war's.
Ich wusste gar nicht das man im Datenbank-Explorer die Datenbank schon so weit definieren kann, deswegen habe ich das immer im Designer des DataSets gemacht.
Aktualisieren des Datasets hat nichts gebracht, weswegen ich es gelöscht und neu erstellt habe.
Dabei habe ich zwar gleich die eine oder andere Abfrage mit gelöscht  Aber nun speichert die Datenbank wie sie soll und die Updates funktionieren ohne Fehlermeldung.
Ganz generell noch die Frage, wenn ich jetzt weitere Tabellen dazu nehme, muss ich dann das DataSet immer neu machen?
Mit zunehmendem Umfang des Programms wäre das ja dann doch irgendwann schmerzhaft.
Gruß Markus
|
|
m-s 
      
Beiträge: 149
Erhaltene Danke: 7
Win 10
C# (VS 2015)
|
Verfasst: Mo 31.01.11 13:25
Mittlerweile habe ich noch ne neue Erkenntnis zu meinem Problem.
Was ich eigentlich falsch gemacht hatte war, dass ich im Datenbank-Explorer in der Tabelle den Primärschlüssel nicht gesetzt habe.
Die Verbindungen (Relationen) hätte ich dann wohl auch im DataSet-Designer setzen können.
Also mindestens den Primärschüssel schon in der Tabelle setzen, dann klappt's
Gruß Markus
|
|
Trashkid2000
      
Beiträge: 561
Erhaltene Danke: 137
|
Verfasst: Mo 31.01.11 18:54
Ja okay, aber trotzdem ist es wie schonmal geschrieben gut, die Relationen in der Datenbank zu haben, und sie dann vom DataSet übernehmen zu lassen. Denn ansonsten ist die referentielle Integrität nur in der Anwendung gesichert. Aber darum sollte sich meines Erachtens die Datenbank kümmern, da ich auch ausserhalb der Anwendung an die Datenbank könnte, und dann irgendwelchen Müll eintragen könnte. Nur mal so...
LG, Marko
|
|
|