none
Updaten von Rowguid Spalten nicht mehr möglich! RRS feed

  • Frage

  •  

     

     

    Hi zusammen,

     

    wir haben ein komisches problem. es hat mal alles super funktioniert, nur seit neuem nicht mehr.

    wir haben in unseren Tabellen, spalten bei denen das rowguidcol-Property gesetzt ist. wenn man nun eine neue publication anlegt und auf der clientseite in einem Datagridview einen bestehenden eintrag editiert, kann man diesen eintrag nicht mehr speichern. man bekommt die fehlermeldung : "updating columns with the rowguidcol-property is not allowed. the transaction ended in the trigger. the batch has been aborted!

     

    und wir haben die stelle in dem trigger gefunden die das verursacht :

     

     if
     update
     ([ROWGUID])
     begin
    
    
     if
     @@trancount
     > 0
     rollback
     tran
    
    RAISERROR (20062, 16, -1) end

     

    das ganze passiert in einem trigger der durch die publication angelegt wird : MSmerge_upd_xxx

    das komische daran ist, dass das alles vor 2 wochen einwandfrei funktionierte. wir mussten lediglich die publication einmal löschen und eine tabelle kurz editieren und die publication erneut anlegen. doch nach dem neuen anlegen klappte das updaten nicht mehr. man kann zwar in dem datagridview einen neuen eintrag machen und speichern aber nicht updaten. zu erwähnen wäre auch noch, dass das update auf der datenbankseite selbst aber möglich ist.

     

    wir kommen an dieser stelle leider nicht mehr weiter. was den Code auf der clientseite angeht, der dafür sorgt dass die einträge gespeichert werden, haben wir keine änderungen vorgenommen. es ist der selbe code wie vor 2 wochen. wir haben lediglich eine tabelle modifiziert (eine spalte vom typ numeric in int umgewandelt) und die publication neu angelegt. seit dem kracht alles zusammen.

     

    C# Code zum speichern der daten :

     

     

     this
    
    
    .Validate();
     this
    
    
    .i_INSTRS_DEFBindingSource.EndEdit();
     try
    
    
    
     {
      this
    
    
    .i_INSTRS_DEFTableAdapter.Update(this
    
    
    .idbInstrs.I_INSTRS_DEF);
      this
    
    
    .i_INSTRS_DEFTableAdapter.Fill(this
    
    
    .idbInstrs.I_INSTRS_DEF);
     }
     catch
    
    
     (Exception ex)
     {
      MessageBox.Show(ex.Message);
     }
    

     

    Die Exception wird bei xxx.Update(xxx) ausgelöst...

    Donnerstag, 14. Oktober 2010 09:18

Antworten

  • Hallo,

    eine Spalte mit der  ROWGUIDCOL Eigenschaft kann nicht geändert werden,
    weil dann die Replikation die Zeile nicht mehr identifizieren kann
    und  eine Änderung aus Sicht der Replikation zu einer neuen Zeile (und Konflikten) führen würde.
    Siehe auch Erstellen und Ändern von Bezeichnerspalten

    Das einfachste wäre: Lasst die Spalte beim SqlDataAdapter weg,
    so dass sie mit dem hinterlegten Default erzeugt wird
    und  bei späteren Updates nicht neu gesetzt wird.

    Gruß Elmar

     

    • Als Antwort markiert Deeeeeeeeeeee Donnerstag, 14. Oktober 2010 11:15
    Donnerstag, 14. Oktober 2010 10:26
    Beantworter

Alle Antworten

  • Hallo,

    eine Spalte mit der  ROWGUIDCOL Eigenschaft kann nicht geändert werden,
    weil dann die Replikation die Zeile nicht mehr identifizieren kann
    und  eine Änderung aus Sicht der Replikation zu einer neuen Zeile (und Konflikten) führen würde.
    Siehe auch Erstellen und Ändern von Bezeichnerspalten

    Das einfachste wäre: Lasst die Spalte beim SqlDataAdapter weg,
    so dass sie mit dem hinterlegten Default erzeugt wird
    und  bei späteren Updates nicht neu gesetzt wird.

    Gruß Elmar

     

    • Als Antwort markiert Deeeeeeeeeeee Donnerstag, 14. Oktober 2010 11:15
    Donnerstag, 14. Oktober 2010 10:26
    Beantworter
  • Danke für die Antwort. es klappt natürlich so...

    aber so einfach es auch ist, bei uns ist das sehr mühsam, denn wir haben viele tabellen und jede von ihnen besitzt ein rowguid-feld. wenn man durch den datasource-wizard die anbindung zur DB durchführt, übernimmt der wizard natürlich alle felder. d.h. wir müssen im nachhinein hergehen bei jeder einzelnen tabelle, im data source manager von VS das feld mit der rowguidcol-eigenschaft rausnehmen...

     

    gibt es vlt an dieser stelle eine bessere lösung?

     

    besten dank im voraus

    Donnerstag, 14. Oktober 2010 11:17
  • Hallo,

    die "Assistenten" haben keine Ahnung von Spezialfällen im allgemeinen und Replikation im besonderen.
    Und ohne manuelle Anpassung wird es dort nicht gehen.

    Sofern die Anwendung nicht mit der rowguidcol arbeitet, sollte bei der Auswahl ein Abwählen
    der Spalte direkt nach dem Auswählen der Tabelle fürs DataSet reichen,
    was dann zwei Mausklicks mehr wären.
    Alles andere dürfte einiges mehr an Aufwand bedeuten.

    Gruß Elmar

    Donnerstag, 14. Oktober 2010 14:23
    Beantworter