Announcement

Collapse
No announcement yet.

Autowert und Multiuser

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

  • Autowert und Multiuser

    Hallo, ich habe ein problem mit meinem Autowert meiner access datenbank und einer multiuser anwendung.

    in form:

    Code:
        me.mds.Tables("Tab").Columns("Col1").AutoIncrement = True
        me.mds.Tables("Tab").Columns("Col1").AutoIncrementStep = -1
        me.mds.Tables("Tab").Columns("Col1").AutoIncrementSeed = 0
    Code:
    Private Sub RowUpdated(ByVal sender As Object, _
                                          ByVal e As Data.OleDb.OleDbRowUpdatedEventArgs) Handles da.RowUpdated
    
        Dim tmp_tabc_pos As Integer
    
        Dim newID As Integer = 0
        Dim idCMD As Data.OleDb.OleDbCommand = New Data.OleDb.OleDbCommand("SELECT @@IDENTITY", m_AccessDB.cn)
        If e.StatementType = StatementType.Insert Then
    
          ' Retrieve the identity value and store it in the CategoryID column.
          newID = CInt(idCMD.ExecuteScalar())
    
          ' row - table columns
          For Each col As DataColumn In e.Row.Table.Columns
    
            If col.AutoIncrement = True Then
              e.Row(col.ColumnName) = newID
              Exit Sub
            End If
          Next
    
        End If
    
      End Sub
    ich versuche während des einfügens den aktuellen wert wieder zurück zu erhalten.

    allerdings funktioniert das nicht richtig. ich bekomme immer nur eine 0 zurück anstatt den wert, den ich bräuchte.

    ich trage die werte in eine datagridview ein, das ich über ein bindingsource an mein dataset verbunden habe.

    in diesem dataset leigt dann meine tabelle.

    allerding sfunktioniert das update des keys einfach nicht.
    Zuletzt editiert von anno; 11.03.2009, 14:06.

  • #2
    hier ist mal noch mein gesamter quellcode:
    Attached Files

    Comment


    • #3
      Hallo anno,
      das mit @@IDENTIT funktioniert meines Erachtens nach nur mit dem MS SQL-Server. Ich hab das gleiche Problem und muß mit einer Krücke leben. Ich habe ein typisiertes Dataset (vom Designer kreiert) von meiner Access DB. Wenn ich in einer Tabelle mit Autoinkrementfeld einen neuen Datensatz erzeuge, führe ich sofort über den Tableadapter ein Update aus. Unmittelbar im nächsten Befehl hole ich mir den Maxwert des Autoinkrementfeldes aus der DB und weise ihn dem Autoinkrementfeld im Dataset zu. Bis jetzt hat es immer geklappt.
      Das sieht dann ungefähr so aus:

      ListerDataSet.Artikel.Rows.Add(newArtikel) 'neue Zeile an Datatable anhängen
      Me.ArtikelTableAdapter.Update(newArtikel) 'neue Zeile in Datenbanktabelle schreiben
      newArtikel.Artikel_ID = newArtikelID 'neue Artikel_ID aus der Datenbanktabelle holen
      newArtikel.AcceptChanges()

      vielleicht kannst Du damit was anfangen?
      Gruß Conny

      Comment


      • #4
        ich habe gerade noch heruasgefunden, dass ich eine andere access version nehmen musste, mit der es funktioniert. zumindest geht es jetzt



        ich habe jetzt aber in meinem multi user programm ein problem mit meinen editierten daten.

        bsp.:

        benutzer 2 hat die daten von der datenbank geholt
        benutzer 1 hat die datenbank geöffnet und werte geändert.
        benutzer 2 möchte seine werte abspeichern => ich bekomme eine paralellitätverletzung bei der abspeicherung. das gleiche passiert, wenn man einen datensatz löschen möchte. wie bekommt man das für ein multiuser programm hin?

        da bekomme ich dann eben immer so eine meldung :

        Parallelitätsverletzung : Der DeleteCommand hat sich auf 0 der erwarteten 1 Datensätze ausgewirkt.


        es ist mir zwar klar, wenn der datensatz in der datenbank nicht mehr existiert, kann der datadapter diesen datensatz auch nicht mehr aus der datenbank löschen, doch irgendwie muss ich diesen fehler abfangen.
        Zuletzt editiert von anno; 11.03.2009, 17:39.

        Comment


        • #5
          wie werden deine Befehle generiert? Es gibt mehrere Möglichkeiten die Parallelitätsverletzungen zu vermeiden.
          Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

          Comment


          • #6
            ich habe es so gemacht, das ich meinem dataadapter einen commandbuilder zuweise.

            Comment


            • #7
              meines wissens sind die selbst generierten Befehle so gestrickt

              Update Feld1='blablub', Feld2='blabliblub' Where Feld1= and Feld2=

              so er befülllt also die Felder nur neu wenn alle alten Felder gleich sind. Da er in der Where Klausel die Original Werte von vor deiner Änderung im Datatable reinschreibt. Hat jemand den Datensatz geändert siehst du alt aus!.

              Deshalb schreibe doch deinen Update Befehl selber und frage in der Where Klausel nur den PrimaryKey ab. Oder du lebst damit und informierst den Benutzer wenn dieser Fall eintritt, da es unter Umständen sehr Interessant und von Relevanz sein kann wenn jemand was ändert während ich es auch ändere.
              Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

              Comment


              • #8
                stimmt, das mit dem Fehler abfangen könnte ich machen. Allerdings weiß ich nicht genau wo ich den fehler abfangen soll.

                ich hatte mal das rowupdating handle probiert, doch das programm steigt schon direkt bei der update methode des datadapters aus und nicht erst bei dem updating handle vom adapter.

                hast du d ane idee?

                Comment


                • #9
                  nun es wird ja eine exception geworfen, entweder du fängst die oder du schaust mal im OpenBook bei den Datenbankanwendungen da wird auch schön beschrieben was man machen kann
                  Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

                  Comment


                  • #10
                    in welchem buch? galileo openbook?

                    Comment


                    • #11
                      "OpenBook" kenne ich nur bei Galileo; aber den Hinweis hast Du doch schon längst bekommen (von das-d). openbook visualbasic 2008

                      Jürgen

                      Comment

                      Working...
                      X