.NET DataAdapter und FoxPro Tabelle mit Autoincrementfeld

03/10/2008 - 13:40 von Heinz Tuppinger | Report spam
Hallo!

Ich habe dieses Problem:

Ich holen ein DataSet in .NET über OLEDB aus einer FoxPro Tabelle mit .NET
DataAdapter wobei ein Integer/autoinc feld (EPOSID) besteht, welches von dem
insert commands nicht befüllt wird! (überlasse ich der FoxPro Datenbank)

Nach dem Holen des Datasets ist das Feld nicht als Autoinc gesetzt!
(EPosDataSet.Columns(0).AutoIncrement=false)

Schreibt man nun einen neuen Satz in das Dataset so wird die EPOSID nicht
erhöht.
beim zurückschreiben wird in FoxPro tabelle zwar richtig eine neue EPOSID
erzeugt, aber mit dem Dataset nicht synchronisiert (Dataset EPOSID ist noch
immer 0)

Das führt dann zu einem spàteren Fehler beim Delete dieses neu angelegten
Satzes auf die Datenbank geschrieben wird:
DataSet Delete diesen Satz
Mit Datenbank synchronisieren (Fehler: Der DeleteCommand hat sich auf 0 der
erwarteten 1 Datensàtze ausgewirkt)

Man müsste (wie in Foren beschrieben) den OnBeforeInsert-Trigger als
umgehungslösung nutzen um wàhrend des InsertCommands die EPOSID der FoxPro
Tabelle wieder in den DataSet zurückzuschreiben!

gibt es da keine andere lösung? Vielleicht neueren FoxPro Provider der das
kann!
SQLServer kann das nàmlich schon!

Setzt man nach dem Holen des Datasets das feld auf Autoinc
(EPosDataSet.Columns(0).AutoIncrement=true)
beginnt der Dataset bei neuen Zeilen mit 0 und foxpro schreibt beim
writeback wieder andere eposid's rein -> gleiches problem wie oben!

Danke für die Mühe im Voraus!
 

Lesen sie die antworten

#1 Olaf Doschke
03/10/2008 - 23:55 | Warnen spam
Im VFP Cursoradapter gibt es ein Event AfterInsert,
außerdem gibt es eine Eigenschaft RefreshCmd, in der
man einen Befehl eintragen kann, der zum Refresh
genutzt wird.

Soweit nur zum neidisch machen. :oD

Nein, Spaß beiseite, aber unabhànig davon angelt man sich
mit SELECT EposID From EposTabelle;
Where EposID = GetAutoIncValue(0)
den neu generierten Autoincwert.

Kling blödsinnig, der SQL-Select stellt aber noch sicher, daß
der Wert auch wirklich als ID in der EposTabelle gelandet ist
und ist eine einfache Variante für das RefreshCmd des
Cursoradapters.

Man kann auch z.B. per ADODBCommand
GetAutoIncValue(0) ausführen.

Der Parameter 0 stellt schon sehr gut sicher, daß Du
den letzten in dem aktuellen Kontext generierten
Wert kriegst:

0
Specifies that the last autoincremented field value returned
is derived from the current scope (function, method,
procedure). Use this to prevent events outside of that current
code block.

Tschüß, Olaf.

Ähnliche fragen