vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Schützen Sie Ihre Software vor Software-Piraterie - mit sevLock 1.0 DLL!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

ADO.NET / Datenbanken
Problem mit IDENTITY zw. DataSet und DB 
Autor: eisenstuck
Datum: 11.05.07 14:54

Servus miteinander!

Ich stehe vor einem großen Problem.

Ich habe in meiner DB sowie DataSet zwei Tabellen, die eine Beziehung miteinander haben. Beí beiden ist der PK auf IDENTITY gesetzt.

Wenn ich z.Bsp. in der übergeordneten Tabelle im DataSet meherere (!) Datensätze einfüge. Dann anschließend in der untergeordneten zu diesen Datensätzen ebenfalls welche hinzufüge (FK wird durch das Programm ermittelt und eingefügt), bekomme ich bei TabelleTableAdapter.Update(DataSet.Tabelle) Probleme:

1. Wenn bei der übergeordneten Tabelle (die als erstes in der DB upgedated wird) die DB den Schlüsselwert nicht gleich wie im DataSet vergibt. (Hier z.Bsp. um 1 höher) Dann kommt entsprechend die Fehlermeldung beim updaten des zweiten Datensatz, das der Schlüsselwert aus dem DataSet schon in der DB vergeben ist.

2. Wenn es mit den Datensätzen aus der übergeordneten Tabelle keine Probleme gab, dann sagt die Fehlermeldung, das die Beziehung verletzt wird, bzw. das der FK der untergeordneten Datensätze nicht mehr mit den PK der übergeordneten übereinstimmt.

Was kann ich dagegen tun. Muß ich z.Bsp. bei letzteren etwas bei den Beziehungen im DataSet verändern.

Für Eure Hilfe wäre ich sehr dankbar.

Viele Grüße
eisenstuck
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit IDENTITY zw. DataSet und DB 
Autor: ModeratorFZelle (Moderator)
Datum: 11.05.07 17:48

Du hast 2 möglichkeiten.

1.
Die Identityspalten von der DB verwalten lassen.
Hierzu musst direkt beim anlegen des Datensatzes die PK aus der Datenbank beziehen.

2.
Du benutzt eine GUID als PK und nicht eine Identity.


Wenn Du mal ein bischen in diesem Forum suchst, findest Du genug Beispiele hierzu.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit IDENTITY zw. DataSet und DB 
Autor: eisenstuck
Datum: 11.05.07 21:28

Vielen Dank erst einmal!

Ich habe ja eigentlich auch den PK aus der DB bezogen, Aber wenn die DB einen neuen Datensatz anlegte und nicht den höchstem PK+1 sondern z. Bsp. +2 vergab, weil beispielsweise ein vorhergehender Datensatz bei einer anderen Transaktion nicht richtig übertragen wurde, kommt es zu dem Problem.

Erstes Problem habe ich dadurch gelößt, daß ich beim PK AutoIncrementStep = -1 gesetzt habe. Dadurch werden in der DataSet-Tabelle negative PKs erst einmal vergeben und bei .Update() gibt es dann mit den von der DB zurückgegebenen und überschrieben PKs keine Überschneidungen mit noch nicht gesendeten Datensätzen mehr.

Denn Tipp habe ich nach längerem Suchen in der MSDN gefunden. Falls der Link interessant sein sollte, kann ich ihn am Montag bekanntgeben.

Beim zweiten Problem habe ich noch keine richtige Lösung. Mit dem GUID muß ich mich erst einlesen. Ich versuche gerade die Beziehung im DataSet so zu gestallten, daß CASCADE möglich ist. Vielleicht klappt es.


Jetzt taucht aber ein neues Problem auf. Wenn ich einen Datensatz der untergeordneten Tabelle im DataSet lösche, wird dies aber nicht mit .Update() in der DB gelöscht. Es kommt auch keine Fehlermeldung, daß die Transaktion abgebrochen wurde. Im Debugger läuft eigentlich alles nach Plan. Catch springt auch nicht an. Sehr seltsam...

Achso, vielleicht ist von Interesse: Ich benutzt SQL Server 2000.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit IDENTITY zw. DataSet und DB 
Autor: ModeratorFZelle (Moderator)
Datum: 12.05.07 11:06

Bei eigenständigen Datensätzen ist das immer kein problem.

Es gibt noch andere möglichkeiten ( Adapter.rowupdated..) aber dafür sollte man schon wissen was man tut.

Und wie löscht Du die Datensätze?

Tja DB-Programme mit .NET sind im gegensatz zur landläufigen meinung
doch nicht einfach so zusammen zu clicken.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit IDENTITY zw. DataSet und DB 
Autor: eisenstuck
Datum: 12.05.07 12:53

ich lösche die Datensätze folgendermaßen:
me.DataSet.Tabelle.RemoveTabelleRow(DataRow)
wie gesagt, aus dem DataSet sind sie dann raus. Nur TableAdapter.Update(DataSet.Tabelle) führt es nicht aus bzw. die DB.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit IDENTITY zw. DataSet und DB 
Autor: ModeratorFZelle (Moderator)
Datum: 12.05.07 12:59

Ist ja auch die falsche funktion.

Remove löscht die Row aus der Tabelle, danach ist sie weg, und niemand weiss
das sie mal da war.

Wenn Du die Delete Funktion nimmst, wird die zeile als gelöscht markiert,
und der Adapter kann beim nächsten Update entsprechend handeln.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit IDENTITY zw. DataSet und DB 
Autor: eisenstuck
Datum: 12.05.07 13:48

DANKE!

jetzt funktioniert es mit dem löschen.

jetzt muß ich nur noch das mit dem CASCADE des FK im DataSet beim updaten hinbekommen.

man lernt halt nie aus.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit IDENTITY zw. DataSet und DB 
Autor: eisenstuck
Datum: 14.05.07 12:55

Servus FZelle!

So, ich habe nun, dank auch Deiner Hilfe, alles hinbekommen.

zu 1.
einfach den AutoIncrementStep auf "-1" setzen, und es gibt keine Konflikte. siehe MSDN-Link:
http://msdn2.microsoft.com/de-de/library/33y2221y(VS.80).aspx

zu 2.
Ich hatte im SQL-Skript zum Erstellen der DB genau bei dieser einen Beziehung CASCADE vergessen...


Ich hätte da noch eine weitere Frage:
Ich zeige mir die Datenstruktur in einem TreeView an.
Wenn ich Datensätze aus der untergeordneten Tabelle per .Delete() aus dem DataSet lösche, habe ich keine Probleme beim neuem füllen des TreeView. Wenn ich aber einen DatenSatz aus der übergeordneten Tabbelle lösche, kommt eine Fehlermeldung
"Auf gelöschte Zeileninformationen kann nicht über die Zeiel zugegriffen werden."
Hm..., dann müßte eigentlich auch beim gelöschten Datensatz der untergeordneten Tabelle gemeckert werden... Zu dem Datensatz kommt der Code über die Beziehung (übergeordnete Tabelle hat eine Beziehung mit sich selber)

Ich schliese das Ganze jetzt im Code über die Zeilenstatusüberprüfung aus.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit IDENTITY zw. DataSet und DB 
Autor: eisenstuck
Datum: 15.05.07 15:03

noch eine Anmerkung zu Zweitens:

Ich hatte CASCADE gar nicht vergessen. Es wurde das SQL-Skript nicht richtig ausgeführt. Es hing an den landläufigen Problemen mit SQL Server 2000.
Für wirklich komplexe Datenmodelle ist er halt eine schlechte Wahl. Aber ich habe hier nichts anderes zur Verfügung.

kein CASCADE bei rekursiven/reflexiven Beziehung möglich, sowie wenn eine Tabelle zwei untergeordnete hat, die wieder hierarschisch verknüpft sind, ist nur mit einer der beiden CASCADE möglich.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel