Announcement

Collapse
No announcement yet.

Probleme mit ObjectDatasource bei Update

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit ObjectDatasource bei Update

    Hallo,
    nach Stunden erfolglosen Suchens sehe ich vermutlich den Wald vor Bäumen nicht mehr.
    Problem:
    Ich habe mir eine Class Library (separates Projekt) gebaut, die ein Dataset enthält, welches ganz normal in VS 2008 per Drag and Drop erstellt wurde. Dieses Dataset (insbesondere die Tableadapter) ist getestet und funktioniert auch.
    Nun möchte ich aus einer asp.net Anwendung (wieder separates Projekt aber in der gleichen Solution wie die DAL Libraray) über eine Objectdatasource und die Tableadapter auf die Daten zugreifen. Das klappt soweit auch, solange ich Selects mache. Bisher habe ich alles per Drag and Drop zusammengebaut (Objectdatasource konfiguriert, Gridview an Objectdatasource gebunden).
    Wenn ich in der Gridview einen Wert editiere und anschliessend "Update" betätige, wird das Update des Tableadapters aufgerufen.
    Code:
    public virtual int Update(string ObjektBerichteAktionen_ID, string ObjektBerichte_ID, string Bezeichnung, global::System.Nullable<global::System.DateTime> Angelegt_Am, string Angelegt_Von, global::System.Nullable<global::System.DateTime> Geaendert_Am, string Geaendert_Von, string Original_ObjektBerichteAktionen_ID, string Original_ObjektBerichte_ID, string Original_Bezeichnung, global::System.Nullable<global::System.DateTime> Original_Angelegt_Am, string Original_Angelegt_Von, global::System.Nullable<global::System.DateTime> Original_Geaendert_Am, string Original_Geaendert_Von)
    Das Problem ist nun, dass alle "Original_Values", die an die Update Funktion übergeben werden null sind. Somit kann der Tableadapter niemals wirklich updaten.
    Das Updatecommand im Tabledapter sieht so aus:
    Code:
    UPDATE [Internet].[dbo].[ObjektBerichteAktionen] 
    SET 
    [ObjektBerichteAktionen_ID] = ?, 
    [ObjektBerichte_ID] = ?, 
    [Bezeichnung] = ?, 
    [Angelegt_Am] = ?, 
    [Angelegt_Von] = ?, 
    [Geaendert_Am] = ?, 
    [Geaendert_Von] = ? 
    WHERE 
    (
    ([ObjektBerichteAktionen_ID] = ?) 
    AND 
    ((? = 1 AND [ObjektBerichte_ID] IS NULL) OR ([ObjektBerichte_ID] = ?)) 
    AND 
    ((? = 1 AND [Bezeichnung] IS NULL) OR ([Bezeichnung] = ?)) 
    AND 
    ((? = 1 AND [Angelegt_Am] IS NULL) OR ([Angelegt_Am] = ?)) 
    AND 
    ((? = 1 AND [Angelegt_Von] IS NULL) OR ([Angelegt_Von] = ?)) 
    AND 
    ((? = 1 AND [Geaendert_Am] IS NULL) OR ([Geaendert_Am] = ?)) 
    AND ((? = 1 AND [Geaendert_Von] IS NULL) OR ([Geaendert_Von] = ?)))
    Löst man die Parameter auf und setzt die übergebenen Werte in das automatisch generierte Updatecommand ein, ergibt sich ein Updatecommand in der Form

    Code:
    UPDATE [Internet].[dbo].[ObjektBerichteAktionen] 
    SET 
    [ObjektBerichteAktionen_ID] = '85FCE4D5-EBE7-4A8C-B9AE-B85C0AA226BD', 
    [ObjektBerichte_ID] = 1, 
    [Bezeichnung] = 'Neue Bezeichnung', 
    [Angelegt_Am] = null, 
    [Angelegt_Von] = null, 
    [Geaendert_Am] = null, 
    [Geaendert_Von] = null 
    WHERE 
    (
    ([ObjektBerichteAktionen_ID] = '85FCE4D5-EBE7-4A8C-B9AE-B85C0AA226BD') 
    AND 
    ((1 = 1 AND [ObjektBerichte_ID] IS NULL) OR ([ObjektBerichte_ID] = null)) 
    AND 
    ((1 = 1 AND [Bezeichnung] IS NULL) OR ([Bezeichnung] = null)) 
    AND 
    ((1 = 1 AND [Angelegt_Am] IS NULL) OR ([Angelegt_Am] = null)) 
    AND 
    ((1 = 1 AND [Angelegt_Von] IS NULL) OR ([Angelegt_Von] = null)) 
    AND 
    ((1 = 1 AND [Geaendert_Am] IS NULL) OR ([Geaendert_Am] = null)) 
    AND 
    ((1 = 1 AND [Geaendert_Von] IS NULL) OR ([Geaendert_Von] = null))
    )
    welches nie eine Zeile findet, da alle Original_Value null sind.
    D.h., dass auch nie ein Update stattfindet.
    Meine Frage ist nun: Wie kann es sein, dass in der Objectdatasource alle OriginalValues als null übergeben werden. Mache ich irgendetwas falsch ?
    Danke für Hinweise oder Tipps.
    Hermann

  • #2
    Hallo,

    der Grund für dieses Problem liegt darin, das HTTP zustandslos ist und ASP.NET hinter den Kulissen daher das mit einem WinForm vergleichbare zustandsbehaftete Verhalten simulieren muss. Bei jedem Request-Aufruf durch den Browser (egal ob beim 1. Mal oder beim Postback) werden die Objektinstanzen auf dem Server neu erzeugt. Alle Informationen, die in der Webseite zwischen den Aufrufen erhalten bleiben sollen, müssen daher explizit gesichert werden (entweder in Session-Variablen oder im VIEWSTATE etc.).

    Mache ich irgendetwas falsch ?
    Ja. Wenn das DataSet den Zustand zwischen den einzelnen Request-Aufrufen nicht vergessen soll, muss das DataSet vor jeder Response-Antwort in einer Session-Variable auf dem Server gespeichert werden. Wenn der Anwender dann im Browser einen Wert ändert und einen PostBack auslöst, muss die ASP.NET-Anwendung im Page_Load-Ereignis zuerst das DataSet aus der Session-Variable wiederherstellen, damit der originale Feldinhalt aus dem dann nicht mehr leeren DataSet wieder ausgelesen werden kann.

    Comment


    • #3
      Vielen Dank für die einleuchtende Erklärung. Ich stelle mir jedoch die Frage, warum das ganze mit den Keyvalues (ID) automatisch funktioniert. Für diese Spalten sind doch die Originalvalues auch zwischen Postbacks immer vorhanden.
      Oder ist das vielleicht von den ASP.NET Schöpfern so gewollt, daß nur für die Schlüsselfelder dieser "Aufwand" betrieben wird?
      Hermann

      Comment

      Working...
      X