Announcement

Collapse
No announcement yet.

BindingSource, aber wie?

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

  • BindingSource, aber wie?

    Hi,
    ich habe eine VB6 'uralt Version' die ich zu konvertieren versuche.
    Eines der letzten Knackpunkte ist die 'Übersetzung' des folgenden Teil-Codes das seinerzeit das einfache Navigieren mit dem Datensatzzeiger ermöglichte:
    Code:
    	'tdRs = godb.OpenRecordset("SELECT * FROM [Daten] ORDER BY [ID] ASC", dbOpenDynaset)
    	'With tdRs
    	'	If .RecordCount > 0 Then .MoveFirst()
    	'	JumpTo = y - 1
    	'	.Move(JumpTo)
    	'	.Edit()
    	'	.Fields("nTrend") = lMaxCount(n)
    	'	.Update()
    	'End With
    Kurzbeschreibung:
    Ich habe eine Reihe von Tabellen, die ich per (ByVal y As Integer) anspreche, dort Daten abfrage und das Ergebnis in die Tab Daten übertrage.
    Die Version JumpTo akzeptiert .Net nicht. Die Update-Methode incl. der handgestrickten Bindingsource-Methode ist kein Problem, lediglich die Move-Methode
    Wie wäre das zu lösen?
    Ich habe mir auch schon überlegt, ob ich nicht alle Ergebnisse in Array's schreibe und mit Update gegen die Tab fahre. Welche Lösung auch immer, ich bin für jede zu haben
    Jetzt schon Danke!

  • #2
    Hallo Alfred,

    mit Deinem VB-Code kann ich nichts anfangen, ich erkläre es deshalb mit Worten.

    Mit einem DbDataAdapter (passend zum DB-System) holst Du die Daten ab und packst sie in ein DataSet und dort in eine DataTable. (Vergiss ganz schnell die Idee mit Arrays; die DataTable ist doch genau für die Datenverarbeitung vorgesehen.) Auch das Update geht am einfachsten über einen DbDataAdapter.

    Die BindingSource wird über DataSource/DataMember an eine DataTable gebunden, um das Navigieren zu ermöglichen und einen bestimmten Datensatz auszuwählen.

    Die Standardmethoden sind natürlich MoveFirst, MoveLast, MoveNext, MovePrevious. Wenn Dir das nicht genügt, weil Du aus irgendwelchen Gründen Deines Programms gezielt "irgendwohin" springen willst, kannst Du Position abfragen und setzen.

    Ich hoffe, dass ich Dich richtig verstanden haben und Dir einen passenden Weg zeigen konnte. Frohe (Rest-) Weihnachten noch! Jürgen

    Comment


    • #3
      Originally posted by Jürgen Thomas View Post
      Wenn Dir das nicht genügt, weil Du aus irgendwelchen Gründen Deines Programms gezielt "irgendwohin" springen willst, kannst Du Position abfragen und setzen.

      Ich hoffe, dass ich Dich richtig verstanden haben und Dir einen passenden Weg zeigen konnte. Frohe (Rest-) Weihnachten noch! Jürgen
      Du hast...! Das war genau das, was ich meinte. Allerdings bin ich überrascht, wie einfach das ist. Ich hab mich da auf mehr Zeilen eingestellt.
      Code:
      	  Dim com1 As New MySqlCommand("SELECT * FROM ORDER BY ID ASC", myconn)
      	  bs.MoveFirst()
      	  bs.Position = y - 1
      	  'Kontrolle!
      	  'MessageBox.Show(y - 1 & "  " & lMaxCount(n))
      ... und es funktionert, was mich am meisten überrascht!
      Vielen Dank und herzliche Grüße

      Comment


      • #4
        Hallo Jürgen,
        ich habe den Mund 'zu voll genommen'.
        Die Daten werden zwar übernommen und eingetragen, erhalte aber beim letzten Eintrag die Meldung:
        Parallelitätsverletzung: Der UpdateCommand hat sich auf 0 der erwarteten 1 Datensätze ausgewirkt.
        Zugleich bekomme ich bei der Fehlerliste die Meldung:
        Warnung 1 Die XML-Dokumentationsdatei "C:\Dokumente und Einstellungen\Papa\Eigene Dateien\Visual Studio 2008\obj\Debug\xxxx.Net.xml" konnte nicht erstellt werden: Der Vorgang wurde erfolgreich beendet.
        Anbei noch den 'Übertragungscode'
        Code:
        Dim com2 As New MySqlCommand("SELECT * FROM daten ORDER BY ID ASC", myconn)
        	  bs.Position = y - 1
        	  Dim mySQL As String = "UPDATE trenddaten SET nTrend =?nTrend WHERE ID ='" & y & "'"
        	  Dim cmd As New MySqlCommand(mySQL, myconn)
        	  cmd.Parameters.Add("?nTrend", MySqlDbType.Double)
        	  cmd.Parameters("?nTrend").Value = lMaxCount(n)
        
        	  MessageBox.Show(y - 1 & "  " & lMaxCount(n))	  'Kontrolle!
        
        	  cmd.ExecuteNonQuery()
        Dass BindingSource mit 0 beginnt ist mir klar und wird mir auch in der Box angezeigt.
        Was habe ich hier falsch gemacht?
        Herzliche Grüße Alfred

        Comment


        • #5
          ähhm wenn du schon mit Parametern Arbeitest ziehs doch ganz durch und mach ID auch noch als Parameter ;-)

          Und bei der MySql Klasse glaub ich werden Parameter net mit ? sondern mit einem @ signalisiert
          Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

          Comment


          • #6
            Hallo das-d

            Einverstanden damit ("wenn schon" ist zu zurückhaltend, das sollte allgemeiner Grundsatz sein: immer mt Parametern arbeiten):
            ähhm wenn du schon mit Parametern Arbeitest ziehs doch ganz durch und mach ID auch noch als Parameter ;-)
            Nur teilweise richtig:
            Und bei der MySql Klasse glaub ich werden Parameter net mit ? sondern mit einem @ signalisiert
            Das hängt vom verwendeten MySql-Provider ab:

            Beim MySQL Connector/Net mit dem Namespace MySql.Data.MySqlClient werden Parameter mit '?' und Namen gekennzeichnet.

            Beim dotConnect for MySQL (früher CoreLab) mit dem Namespace Devart.Data.MySql werden unbenannte Parameter mit '?' gekennzeichnet, benannte Parameter wahlweise mit '@' oder mit ':'.

            @Alfred
            Bitte trenne die Probleme und damit auch die Code-Ausschnitte: Der Select-Befehl gehört nur zum Einlesen der Daten. Die BindingSource gehört nur zum Navigieren (allenfalls noch zum Bearbeiten) in der Datenmenge. Der Update-Befehl gehört zu einer eigenen DB-Aktion.

            Bei dem jetzt geschilderten Problem kann ich überhaupt nicht erkennen, was das mit der BindingSource zu tun haben soll und wo/wie/unter welchen Umständen der Update-Befehl ausgeführt werden soll (abgesehen natürlich vom cmd.Execute-Aufruf).

            Gruß Jürgen

            PS. Übrigens gehören Fragen zur DB-Anbindung (also insbesondere alle Data-Klassen) besser ins Unterforum ADO.NET, unabhängig von der verwendeten Sprache.

            PS2. Jede DbConnection soll nur kurzzeitig - meistens für eine Aktion - geöffnet werden. Dein Code-Auszug lässt mich befürchten, dass Du sie dauerhaft offen hast; das widerspricht der Konstruktion von ADO.NET. Eine Einführung findest Du in den OpenBooks zu VB.

            Comment


            • #7
              Hallo Jürgen,
              Originally posted by Jürgen Thomas View Post
              Bei dem jetzt geschilderten Problem kann ich überhaupt nicht erkennen, was das mit der BindingSource zu tun haben soll und wo/wie/unter welchen Umständen der Update-Befehl ausgeführt werden soll (abgesehen natürlich vom cmd.Execute-Aufruf).
              Gruß Jürgen
              nicht umsonst ist eine gediegene Ausbildung von Vorteil, wie man an Deinen - sehr nachsichtigen 'Bemängelungen' - sieht. In der Zwischenzeit bin ich auch dahintergekommen, dass der 'BindingSource' in VB.Net nicht notwendig ist, weil sich meinen Vermutungen nach, der Eintrag auf die Übereinstimmung y mit ID ausrichtet. Da es eine Desktopanwendung ist und dieser Code-Teil in zehntelsekunden abgearbeitet ist, ist das Offenhalten der DB-Conncection läßlich. Aber ich gebe Dir recht. Wenn es die Regeln einer ordnungsgemäßen Programmierung erfordern, dann ist es eben so.
              Ich werde den Teil Berechnungsmodus und den Teil Eintragungsmodus trennen.
              Vorerst herzlichen Dank, Alfred

              Comment

              Working...
              X