Dataset only -> DB / Welches System und wie?

  • VB.NET
  • .NET 4.0

Es gibt 72 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

    OK, bevor ich da alles zerpflücken muss...
    'ne Idee, warum bei x86 das DataSet nicht geladen wird?

    Dann würde ich den weg über das "alte" Access mal testen (mdb) und schauen ob dazu keine Runtimes gebraucht werden..
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    prima - hab ich jetzt mit einer Anwendung machen können, und hatte kein Problem damit, das Dataset zu speichern und zu laden.
    Nach der Umstellung hat er aber eine neue DatenDatei angelegt - ich bin dem aber nicht nachgegangen.
    Vielleicht iwie ein anneres AusgabeDirectory oder neue Settings.
    Jdfs. als ich wieder zurück auf AnyCpu bin, war mein Dataset wieder da.

    ErfinderDesRades schrieb:

    Jdfs. als ich wieder zurück auf AnyCpu bin, war mein Dataset wieder da.

    das Phänomen hab' ich auch - aber der Datenpfad wird doch Codeseitig festgelegt, wie kommt er dann drauf was anneres zu nehmen?
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    naja, sowas etwa:

    VB.NET-Quellcode

    1. Dts.DataFile("..\..\DataStuff\dts_DatasetTemplate.xml").Register(Me).Fill
    legt einen relativen Pfad zum Ausführungsverzeichnis fest.
    Ich vermute, unter x86 ist das Ausführungsverzeichnis ein anderes.
    kannste dir ja ausgeben lassen, mal so mal so kompiliert:

    VB.NET-Quellcode

    1. debug.print(dts.DataFile().Fullname
    oder so.
    Jupp, stimmt so... er hat in nem anderen Verzeichnis nach der Datendatei gewühlt.
    Hab's nun vorerst wie folgt gefixed:

    VB.NET-Quellcode

    1. If Environment.Is64BitProcess Then
    2. _fi = New FileInfo("..\..\Daten\dtsLogistik.xml")
    3. Else
    4. _fi = New FileInfo("..\..\..\Daten\dtsLogistik.xml")
    5. End If


    damit laufen beide Varianten (AnyCPU und X86) :thumbsup: dann kann ich heut abend testen ob die "alte" access-variante mit MDB funzt
    ohne Runtimes draufbügeln zu müssen.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    @ErfinderDesRades:

    Hast du eine Idee, wie ich rausfinden kann welchen Eintrag er gerade an die Datenbank überspielen will?


    Ich mach' das über deine OleDbPersistance wie folgt (extra mit Tabellenauswahl, damit ich das nach und nach machen kann):

    Der Fehler kommt hier (Zeile 6):

    VB.NET-Quellcode

    1. ''' <summary> on Insert-Statements requery the database-generated primary-key. This is not neccessary on in-/out-DbParameters supporting Databases </summary>
    2. Private Sub Table_RowUpdated(sender As Object, e As OleDbRowUpdatedEventArgs)
    3. If e.StatementType <> StatementType.Insert Then Return
    4. Dim primCol = e.Row.Table.PrimaryKey(0)
    5. Dim primVal = _RequeryIdCommand.ExecuteScalar
    6. e.Row(primCol) = Convert.ChangeType(primVal, primCol.DataType)
    7. End Sub


    Es gibt aber keine doppelten ID-Werte in meinen Mitarbeitern... für andere Tabellen klappt alles

    VB.NET-Quellcode

    1. Public Sub SaveAll()
    2. _Con.Open()
    3. Dim tb = selectTable()
    4. Dim rows = tb.Select("", "")
    5. Try
    6. _Adapters(tb).Update(rows)
    7. Catch ex As Exception
    8. Msg(ex.Message)
    9. End Try
    10. Dim skipSubOrderedRowsConfig = New _AcceptruleCascadeConfig(_dts)
    11. skipSubOrderedRowsConfig.Restore()
    12. _Con.Close()
    13. End Sub
    14. Private Function selectTable() As DataTable
    15. Dim tblname As String = Nothing
    16. Using dlg As New dlgListbox
    17. For Each tb In _RankedTables
    18. dlg.ListBox1.Items.Add(tb.TableName)
    19. Next
    20. If dlg.ShowDialog = DialogResult.OK Then
    21. tblname = dlg.ListBox1.SelectedItem.ToString
    22. Return _dts.Tables(tblname)
    23. End If
    24. End Using
    25. Return Nothing
    26. End Function
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    MIr scheint, die Datenbank hat einen PrimKey-Wert vergeben, den du schon hast in deim Dataset.
    Normal werden Dataset-Primkeys ja immer negativ generiert - Datenbank-Primkeys aber positiv - da kann so eine Kollision nicht auftreten.
    Also DataTable.INcrementStep und .IncrementSeed täte ich als erstes nachgucken: beide müssen negativ sein, um solche Kollisionen auszuschliessen.

    Alle Primkeys deines kompletten Datasets müssen, wenn sie noch nicht in eine DB geupdated wurden, negativ sein. (gilt natürlich nicht für String-PKs, aber mit denen haste ja annere Probleme - :P )

    Tritt das im laufenden Betrieb auf, oder ist das ein Problem bei deiner Migration Dataset->Datenbank?
    Bei der Migration..
    Ich weiß, um welchen Mitarbeiter es geht - aber egal was ich ändere, hilft nix

    ErfinderDesRades schrieb:

    Alle Primkeys deines kompletten Datasets müssen, wenn sie noch nicht in eine DB geupdated wurden, negativ sein

    sind sie

    ErfinderDesRades schrieb:

    Also DataTable.INcrementStep und .IncrementSeed täte ich als erstes nachgucken: beide müssen negativ sein

    ist beides negativ

    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „tragl“ ()

    Hmm - eine Mitarbeiter.Id kann nur positiv geworden sein, wenn sie gleichzeitig auch als ForeignKey missbraucht wird. Weil dann würde das Speichern eines übergeordneten Datensatz auch die MA.Id ins positive drehen.
    Ist das Dataset noch dasselbe wie früher, oder magst du lieber ein aktuelles anhängen?

    Hab jetzt geguckt - nix verdächtiges gefunden.
    Du kannst einen bedingten Haltepunkt auf den Property-Setter setzen, der anschlägt, wenn ein positiver Wert zugewiesen wird.
    Muss ja irgendwann passieren, und zwar bevor die Mitarbeiter-Tabelle selbst abgespeichert wird.
    (Oder ich hab iwie ein Bug verzapft)

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    Ist das Dataset noch dasselbe wie früher, oder magst du lieber ein aktuelles anhängen?


    reicht dir ein leeres Dataset? Sind ja Live-Daten drin - ansonsten muss ich die Daten tauschen gegen irgendwas Dummy-mäßiges, das dauert aber
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    ErfinderDesRades schrieb:

    Ist nicht einfach zu finden, weil ist im generierten Code.


    meinst du das hier?:


    kann mir aber nicht vorstellen dass das was damit zu tun hat - er füllt ja erstmal nur die database und bekommt noch garkeine Positiven
    ID's zurück - das wird ja erst passieren wenn ich aus der Database, anstatt der XML die Daten lade..
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    ErfinderDesRades schrieb:

    sondern MitarbeiterRow.ID

    dann meinst du folgenden Abschnitt:


    bis dahin kommt er aber garnicht. wie gesagt, die richtung hier ist erstmal NUR DataSet -> Datenbank
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Ganz sicher wird beim

    tragl schrieb:

    NUR DataSet -> Datenbank
    in irgendeinem Moment eine MitarbeiterRow.ID auf 25 gesetzt.
    Und zwar bevor die MitarbeiterTabelle selbst dran ist mit abspeichern.

    Allerdings hast du vmtl recht - an der typisierten generierten Property geht das vorbei, weil der DataAdapter direkt auf die untypisierte DataTable zugreift.
    Also könnteste das Table_ColumnChanged-Event abonnieren - das geht vom untypisierten Dataset aus.

    ErfinderDesRades schrieb:

    in irgendeinem Moment eine MitarbeiterRow.ID auf 25 gesetzt.

    ja, aber in der database und nicht im dataset, genau da ist ja mein Problem - trotz dass alle ID's im Dataset negativ und eindeutig sind findet er angeblich doppelte
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup: