none
Fehler bei der zweiten Anzeige eines Charts RRS feed

  • Frage

  • Hallo Gemeinde,

    ich habe zwar noch keine Antwort auf meine Frage von Gestern aber ich versuche es mal mit diesem Problem:

    Ich lasse in einem MS Chart eine Kurve anzeigen mit Daten aus einer .mdb Tabelle. Die Auswahl des Datensatzes geht über eine ComboBox. Die Anzeige erfolgt dann mit einem Klick Button Event.

    Das funktioniert sehr gut beim ersten Mal. Wenn ich dann aber den Button nochmals drücke (entweder mit dem gleichen Datensatz oder mit einem anderen über die ComboBox ausgewählten Datensatz) bekomme ich den Fehler "A chart element with the name 'Series1' could not be found in the 'SeriesCollection'." Wenn ich das Programm stoppe und wieder neu starte, dann einen neuen Datensatz wähle geht es wieder ...

    Muss ich irgendwas zwischen den beiden Button Click Events löschen oder initialisieren (da es ja wieder funktioniert wenn ich das ganze Programm neu starte...)???

    Über eine Antwort freue ich mich sehr.

    Gruss

    Holger


    hgadm02

    Freitag, 14. September 2012 21:25

Antworten

  • Gerne Robert,

    besonderer Dank gilt Okeanos85 der mich auf die richtige Fährte gesetzt hat und sehr hilfreiche, umfangreiche Erläuterungen gab, die sicher zeitintensiv waren !

    Hier ist zur allgemeinen Verwendung nochmal der fertige Code zur Darstellung von Datensätzen aus einer Access mdb Datenbank gepostet, wobei die Datensätze in der DB in Reihen vorliegen und somit mittels einer DataTable auf das vom MS Chart erwartete Spaltenformat umgesetzt werden. Damit können auch DBs mit einer grossen Anzahl an Datensätzen, sowie Datensätze mit eine Mischung aus numerischen Feldern und Kommentarfeldern (siehe Code) einfach verarbeitet werden. Bzgl. der korrekten Uebertragung von numerischen Daten ins DataSet bzw. die DataTable ist darauf zu achten, dass das Default Zellen-Format der DataTable fuer Zellen, die numerische Werte von der SQL Query aufnehmen sollen von String auf ein numerisches Format (Single oder Double) gesetzt wird, das hat mich fast 2 Stunden gekostet ;)

    Gruss

    Holger

    Private Sub btnLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoad.Click

    Dim con As New OleDb.OleDbConnection

    Dim dbProvider As String

    Dim dbSource As String

    Dim ds1 As New DataSet

    Dim da As OleDb.OleDbDataAdapter

    Dim Sql As String

    dbProvider =

    "PROVIDER=Microsoft.Jet.OLEDB.4.0;"

    dbSource =

    "Data Source = C:/Data/ore_reflectivity.mdb"

    con.ConnectionString = dbProvider & dbSource

    If Not ComboBox1.Text = "" Then

    con.Open()

    'MsgBox("Database is now open")

    Sql =

    "SELECT * FROM reflectivity where mineral='" & ComboBox1.Text & "'"

    da =

    New OleDb.OleDbDataAdapter(Sql, con)

    da.Fill(ds1,

    "RefectivityData")

    con.Close()

    'MsgBox("Database is now Closed")

    DataTable1.Clear()

    DataTable1.Rows.Add(400, ds1.Tables(

    "RefectivityData").Rows(0).Item(4))

    DataTable1.Rows.Add(420, ds1.Tables(

    "RefectivityData").Rows(0).Item(5))

    DataTable1.Rows.Add(440, ds1.Tables(

    "RefectivityData").Rows(0).Item(6))

    DataTable1.Rows.Add(460, ds1.Tables(

    "RefectivityData").Rows(0).Item(7))

    DataTable1.Rows.Add(480, ds1.Tables(

    "RefectivityData").Rows(0).Item(8))

    DataTable1.Rows.Add(500, ds1.Tables(

    "RefectivityData").Rows(0).Item(9))

    DataTable1.Rows.Add(520, ds1.Tables(

    "RefectivityData").Rows(0).Item(10))

    DataTable1.Rows.Add(540, ds1.Tables(

    "RefectivityData").Rows(0).Item(11))

    DataTable1.Rows.Add(560, ds1.Tables(

    "RefectivityData").Rows(0).Item(12))

    DataTable1.Rows.Add(580, ds1.Tables(

    "RefectivityData").Rows(0).Item(13))

    DataTable1.Rows.Add(600, ds1.Tables(

    "RefectivityData").Rows(0).Item(14))

    DataTable1.Rows.Add(620, ds1.Tables(

    "RefectivityData").Rows(0).Item(15))

    DataTable1.Rows.Add(640, ds1.Tables(

    "RefectivityData").Rows(0).Item(16))

    DataTable1.Rows.Add(660, ds1.Tables(

    "RefectivityData").Rows(0).Item(17))

    DataTable1.Rows.Add(680, ds1.Tables(

    "RefectivityData").Rows(0).Item(18))

    DataTable1.Rows.Add(700, ds1.Tables(

    "RefectivityData").Rows(0).Item(19))

    Chart1.Series(

    "Series1").Points.DataBind(DataTable1.DefaultView, "Column1", "Column2", Nothing)

    TextBox1.Text = ds1.Tables(

    "RefectivityData").Rows(0).Item(20)

    End If

    End Sub


    hgadm02

    • Als Antwort markiert hgadm02 Donnerstag, 20. September 2012 05:42
    Donnerstag, 20. September 2012 05:41

Alle Antworten

  • Dear all

    how do I connect to an mdb table with MS Chart in VB 2008 where X values are fixed (400 to 700 in steps of 20) and Y values are taken from the mdb file?

    How do I create the fixed X-values? Can I use a String array? 

    I want to create a display of ore reflectivity values where the mdb data table contains a row for each mineral and a column for each reflection value at the different wavelength, ie. 400-700 (nm) in 20 steps.

    I am struggling as all example I have found are using column 1 for X data and column 2 for Y data, but I need the columns for the different wavelengths and one rows for each mineral :(

    Many thanks

    Holger

    Donnerstag, 13. September 2012 20:14
  • Hallo,

    ist so erstmal schwierig von der ferne aus etwas zu sagen... Der Code dazu wäre nicht schlecht.Deine Fehlermeldung sagt mehr oder Weniger aus das Du wohl schon etwas löschst, nämlich Series1. Genaueres könnt ich jetzt aber nur mit Code sagen.

    Viele Grüße

    Okeanos85

    Freitag, 14. September 2012 22:43
  • Hallo Okeanos85, danke für die rasche Antwort !

    Hier ist der code (das MS Chart habe ich überwiegend im Designer konfiguriert).

    Vielen Dank

    Holger

    Public Class Form1

        Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)

        End Sub

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'TODO: Diese Codezeile lädt Daten in die Tabelle "Ore_reflectivityDataSet.reflection_simple". Sie können sie bei Bedarf verschieben oder entfernen.
            Me.Reflection_simpleTableAdapter.Fill(Me.Ore_reflectivityDataSet.reflection_simple)

        End Sub

        Private Sub Chart1_AnnotationPositionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Chart1.AnnotationPositionChanged

        End Sub

        Private Sub Chart1_AxisViewChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataVisualization.Charting.ViewEventArgs) Handles Chart1.AxisViewChanged

        End Sub

        Private Sub Chart1_AxisViewChanging(ByVal sender As Object, ByVal e As System.Windows.Forms.DataVisualization.Charting.ViewEventArgs) Handles Chart1.AxisViewChanging
           
        End Sub

        Private Sub Chart1_BindingContextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Chart1.BindingContextChanged

        End Sub

        Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
            Chart1.ChartAreas(0).AxisY.Minimum = 0
            Chart1.ChartAreas(0).AxisY.Maximum = 100
            Chart1.ChartAreas(0).AxisX.Minimum = 400
            Chart1.ChartAreas(0).AxisX.Maximum = 700
            Chart1.ChartAreas(0).AxisY.Interval() = 5
            Chart1.ChartAreas(0).AxisX.Title = "Wavelength [nm]"
            Chart1.ChartAreas(0).AxisX.TitleFont = New System.Drawing.Font("Arial", 10, System.Drawing.FontStyle.Bold)
            Chart1.ChartAreas(0).AxisY.Title = "Reflection [%]"
            Chart1.ChartAreas(0).AxisY.TitleFont = New System.Drawing.Font("Arial", 10, System.Drawing.FontStyle.Bold)
        End Sub

        Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            If Not ComboBox1.Text = "" Then
                Chart1.Series("Series1").BorderWidth = 3
                Chart1.Series("Series1").XValueMember = "wavelength"
                Chart1.Series("Series1").YValueMembers = ComboBox1.Text
                Chart1.Series("Series1").Name = ComboBox1.Text
                If Not ComboBox2.Text = "" And Not ComboBox2.Text = ComboBox1.Text Then
                    Chart1.Series("Series2").BorderWidth = 3
                    Chart1.Series("Series2").XValueMember = "wavelength"
                    Chart1.Series("Series2").YValueMembers = ComboBox2.Text
                    Chart1.Series("Series2").Name = ComboBox2.Text
                Else
                    Chart1.Series("Series2").BorderWidth = 0
                End If
            End If
        End Sub
    End Class


    hgadm02

    Freitag, 14. September 2012 22:55
  • Hallo,

    lass mal die zeile " Chart1.Series("Series1").Name = ComboBox1.Text" und die Zeile "Chart1.Series("Series2").Name = ComboBox2.Text" weg. Dann funktionierts.

    Hintergrund: Du verwendest die Name eigenschaft des Objektes um es anzusprechen (Series1)
    In den beiden genannten Zeilen jedoch veränderst Du den Name des Objektes, müsstest es also mit dem neuen namen ansprechen in etwa so: Chart1.Series([Vorher ausgewählter Comboboxtext]).[Eiugenschaft]

    Wäre Ziemlich Kompliziert das so zu machen, nicht? Arbeite doch Statt der Name Eigenschaft mit LegendText, diese Eigenschaft der Series ändert nur die sichtbare Bezeichung.

    Chart1.Series("Series1").LegendText= ComboBox1.Text
    und
    Chart1.Series("Series2").LegendText= ComboBox2.Text

    Viele Grüße
    Okeanos85

    Freitag, 14. September 2012 23:18
  • Cool - das hat geklappt !! Ist ja super - ganz vielen Dank :)

    Ich habe gestern noch ein Problem gepostet, aber noch keine Antwort erhalten. Ich habe hier mal versucht, den Sachverhalt visuell in dem eingefügten Bild darzustellen: 

    Alle Beispiele, die ich zu Datenbankanbindungen finden konnte arbeiten nach dem Prinzip 1. Spalte = X-Achse, 2. Spalte = Y Achse, 3. Spalte = 2. Y Achse usw. (siehe A & B im Bild). So mache ich es daher auch noch im Moment.

    Ich möchte aber anders vorgehen da ich das logischer finde und ich dann mit den vielen zu erwartenden Datensätzen nicht auf die 255 Spalten in Access beschränkt bin (D & E in der Abbildung): X Achse: Bezeichnung der Spalten 5 - 20 (kann aber auch im Code "fest verdrahtet" werden, da die X-Werte immer gleich sind: 400 bis 700 in Schritten von 20). Y Werte dann für jeden über die ComboBox ausgewählten Datensatz (row) die entsprechenden Werte der Spalten 5 - 20 dieser Zeile. 

    Mit der Konfiguration des MS Chart im Designer lässt sich das nicht machen ...

    Irgendeine Idee?

    Herzliche Grüsse

    Holger


    hgadm02

    Freitag, 14. September 2012 23:54
  • Hallo,

    Na so eigentlich geht das anders... Spaltenaufbau: ID, Serienname, XWert, YWert

    dadurch sind in der DB theoretisch belibig viele Datensätze möglich.

    Das sieht dann z.b. so aus:

    1;Serie1;0,5;
    2;Serie1;3,9;
    3;Serie1;5,1;
    ...
    19432;Serie38;992,72;
    19433;Serie38;994,4;

    Schriite in VB wie folgt:

    1. Datatable erstellen. und mit den Spalten Serienname, Xwert, YWert befüllen.
    (SELECT Serienname, XWert, YWert from Tabelle WHERE 1)

    2. DataView erstellen und mit dem Datatable besfüllen
    (Dim dv as DataView = new Dataview(dt))

    3. Und jetzt wird DataBindCrossTable verwendet.
    (Chart1.DataBindCrossTable(dv,"Serienname","XWert","YWert")

    Der rest ist formatierungssache...

    Viele Grüße
    Okeanos85

    Samstag, 15. September 2012 08:52
  • Hmmm.... ich dachte Version D, E in meinem Bild ist der richtige DB Aufbau?

    Ich habe dann das DB Design stehen und muss nur Zeilen ergänzen. Bei dem von Dir vorgeschlagen Weg muss ich in Access (mit dem ich die DB erstelle) jedesmal in den DB Designer da ich ja für jeden neuen Datensatz ein neues Datenfeld, sprich eine neue Spalte erstellen muss - oder habe ich einen Knoten im Gehirn??

    Ausserdem hat das Kontextmenü in der VB IDE zum Aktualisieren des Datasets nicht gebracht, neue Spalten werden nicht aufgenommen. Ich muss erst das alte Dataset löschen, diverse Fehlermeldungen vom Code ignorieren, und dann eine neue Datenverbindung im MS Chart design view herstellen .... Das alles könnte ich mir sparen wenn ich in der Access mdb keine Spalten sondern für jeden neuen Datensatz nur eine neue Zeile einfügen würde, da ich dann das DB Design ja nicht ändere ... aber wie gesagt, vielleicht habe ich einen Knoten im Gehirn??

    Herzliche Grüsse

    Holger


    hgadm02

    Samstag, 15. September 2012 10:00
  • Hallo,

    Also D und E kommen wenn überhaupt nur dann in frage falls sich niemals irgend etwas ändern wird, weder jetzt bis in alle ewigkeit. Eher ist es so das Du bei deinem in D und E dargestellten Tabellenaufbau  immer wieder manuell reinschreiben wirst müssen. Beispiel, ich möchte jetzt spontan X Werte bis 800 Darstellen... -> Tabellenschema muss erweitert werden. Nächste Woche bis 900 ... u.s.w.

    Bei meinem Beispiel (ID, Serienname, XWert, YWert) ist es so das ich Werte, auch wenn Sie außerhalb deiner bisherigen Skala liegen sollten, einfach als Datensatz Zeile einfüge Bsp: 99;5;880;93;

    Jede Zeile ist also ein Wertepaar. in dem Fall X: 880 Y:93

    Wenn Du dann einen neuen Satz Messwerte eingibst / aufnimmst Setzt Du Serienname eins hoch oder vergibst nen entsprechenden namen. musst also keine Spalten zum Schema hinzufügen.

    ich hab mal ein Beispiel programmiert. Vielleicht kannst Du mir daran erklären was Du wesshalb anders machen würdest.

    Hier dazu der Quelltext:

    Imports System.Windows.Forms.DataVisualization.Charting
    
    Public Class Form1
        Private dt As DataTable
        Private dv As DataView
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
        End Sub
    
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            Dim YWert As Integer = 0
            Dim iD As Integer = 1
    
            dt = New DataTable("Messreihe")
            dt.Columns.Add("ID")
            dt.Columns.Add("Serie")
            dt.Columns.Add("XWert")
            dt.Columns.Add("YWert")
    
            '3 Messreihen sollen angelegt werden
            For i As Integer = 1 To 3
    
                'repräsentiert die X werte bei Dir 
                For XWert As Integer = 400 To 700 Step 20
    
                    'Generierung eines zufälligen Y  Wertes
                    YWert = Rnd() * 100 + 1
                    dt.Rows.Add(iD, i, XWert, YWert)
                    iD = iD + 1
                Next
    
            Next
            dv = New DataView(dt)
            DataGridView1.DataSource = dv
    
        End Sub
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Chart1.Series.Clear()
            Chart1.DataBindCrossTable(dv, "Serie", "XWert", "YWert", "")
    
    
            For Each s As Series In Chart1.Series
                s.ChartType = SeriesChartType.Line
            Next
    
        End Sub
    End Class
    

    Probiere es mal aus, es funktioniert eigentlich ganz gut. Im Bild oben hab ich die Steuerelemente gekennzeichnet.

    Viele Grüße
    Okeanos85

    Samstag, 15. September 2012 12:41
  • Vielen Dank, das Beispiel ist so wie Du es darstellst sehr gut umgesetzt. Ich habe Deinen "Kniff" verstanden: Du hast einfach eine 3. Spalte fest eingerichtet und diese ermöglicht dann die Eingabe von neuen Datensätzen ohne dass das bestehende Design von nun 4 Spalten verändert werden muss.

    Bei meiner aktuellen Anwendung würde ich dann Deine Spalte "Serie" nicht numerisch sondern als Text anlegen und mit dem Namen des Erzes belegen also statt 1, 2, etc in Deinem Bild würden die Spalteninhalte bei mir dann so aussehen: Millerit, Ullmannit, ... etc.

    Im Gegensatz zu meinem Design D, E müsste ich dann den Namen jedes Erzes in alle 20 Reihen kopieren für die Werte von 400-700 (was natürlich mit copy und paste machbar ist, aber nicht sehr elegant erscheint).

    Ausserdem möchte ich zu jedem Erz noch ein Kommentarfeld einfügen. Das würde ich in meinem Design D, E ganz einfach so machen dass ich als letzte Spalte ein Textfeld vorsehe. Diese Problem sehe ich in Deinem Design so nicht zu verwirklichen.

    Zu Deinem Punkt der Flexibilität: Für meine Anwendung ist das DB Design in der Tat fix  (für alle Ewigkeit, wenn Du so willst), was die Spalten, also DB Felder angeht. Ich würde dann also je Datensatz die folgenden Spalten = Datenbankfelder brauchen:

    ID (auto num), erzname (txt), Felder für spektrale Werte für 400-700 nm (20 Spalten float,2), ein comment feld (txt)

    Ist so etwas einfach mit dem MS Chart zu machen? Im Gegensatz zu Deinem Design wären Spalten und Reihen des DB Designs ja quasi transponiert, also vertauscht.

    Herzliche Grüsse

    Holger


    hgadm02

    Samstag, 15. September 2012 13:05
  • Hallo,

    Da kommen wir zeu einem anderen Punkt, der Normalisierung der Tabellen. Natürlich kann man statt mit zahlen auch mit den Erznamen arbeiten. Das hat, wie Du richtig festgestellt hast, den Copy & Past Nachteil. Dies zu umgehen ist eine Frage der Eingabemaske bzw. dafür gibt es bei Datenbanken Normalformen. In der Spalte Serie bleibt nach der Normalisierung der Zahlenwert(indexwert) erhalten. Dieser Zahlenwert ist ein Fremdschlüssel sprich der Primärschlüssel aus einer anderen Tabelle (tbl_Info_Erze zum Beispiel) welche alle anderen wichtigen informationen enthält.

    Ein solches DB Schema kann z.B. so aussehen:

     

    Wenn Dir das zu umständlich oder aufwändig sein sollte, kann man das Ganze natürlich auch von Deiner Tabellenform in die vom Chart Control benötigte Form bringen.

    Ich muss mit dem jetzt geschriebenen nicht zwangsläufig richtig liegen, denn ich mache das immer nach dem obrigen schema...

    Prinzipiell funktioniert es dann wie folgt.

    im Selection_changed ereigniss deiner combobox muss folgendes rein.

    -Aktuelles Dataset auslesen
    -Chart1.Series.clear()
    -Chart1.Series.Add("Erzname aus Datensatz")
    -Chart1.Series(0).Points.AddXY(400, feld aus dem Dataset)
    -Chart1.Series(0).Points.AddXY(420, feld aus dem Dataset)
    -Chart1.Series(0).Points.AddXY(440, feld aus dem Dataset)
    ...

    denn soweit ich weiss kann man nicht automatisch einen bestimmten Bereich eines Datasets transponieren und dann binden. Das Chart Control erwartet die Daten einfach in der oben von mir beschriebenen Form. Wenn ich damit falsch liegen sollte darf man mich natürlich gern verbessern.

    Viele Grüße
    Okeanos85

    Samstag, 15. September 2012 15:51
  • Vielen Dank, 

    das war ebenfalls sehr hilfreich ! Ich werde mir jetzt überlegen, welche Methode die für mich am sinnvollsten ist:

    (a) - mit dem Datenformat des MS Chart leben und für jeden neu einzugebenden Datensatz die DB und den Code anpassen (Spalte pro neuem Erz ergänzen, databinding in der IDE neu erstellen) - ich glaube die Access DB macht nur max. 255 Spalten - oder? Kann SQL-Server mehr Spalten?? Ich rechne mit max. 400 Datensätzen, wobei die 255 wichtigsten aber auch schon gut wären. (Kommentar in einer über den Erznamen relational verknüpften weiteren Tabelle)

    (b) - mit dem Datenformat des MS Chart leben und copy & paste wie oben angegeben. (Kommentar in einer über den Erznamen relational verknüpften weiteren Tabelle)

    (c) - mit dem Datenformat des MS Chart leben und statt copy & paste des namens den Erznamen UND den Kommentar in einer über den Erznamen relational verknüpften weiteren Tabelle)

    (d) - mit meinem ursprünglichen Tabellendesign D, E gehen, aber keine relational verknüpften Tabellen verwenden sondern die Transposition im Selection_changed Event der ComboBox (oder in einem Button_Click Event) über den Zwischenschritt eines Datagrids implementieren.

    Im 2D Datagrid würden dann zur Laufzeit nur für das selektierte Erz die X und Y Spaltendaten aus der .mdb ausgelesen und im MS Chart Format abgelegt. Ich würde dann einfach das Datagrid (mit seinen dann fest vorgebbaren Spaltenbezeichnungen) in der IDE an das MS Chart binden.

    Ich finde Version (d) im Moment am elegantesten - wäre meine Idee umzusetzen ?

    Herzliche Grüsse & nochmals ganz vielen Dank für die sehr interessante Diskussion in diesem Thread, ich habe hier in den letzten 20 Stunden schon viel gelernt :)

    Holger


    hgadm02

    Samstag, 15. September 2012 16:24
  • So, ich habe jetzt mal begonnen, Version (d) zu probieren. Bevor ich ein DataSet fülle (was dann später mit dem MS Chart verbunden ist), wollte ich erst mal den SQL Syntax probieren, aber der Code unten gibt nichts aus.

    Ich hätte erwartet, dass TextBox1.Text den String "15" annimt, er bleibt aber leer - eine Fehlermeldung bekomme ich auch nicht !!??

    Die DB Tabelle (alles alphanumerisch, da ich irgendwo gelesen habe dass die Übertragung numerischer Werte via SQL in ein DataTable Probleme machen kann ...?) und das Code-Snippet sind unten angehängt.

    Vielen Dank & herzliche Grüsse

    Holger

            Dim con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\admin\Documents\ore_reflectivity.mdb")
            Try
                Dim dr As OleDbDataReader
                Dim command As New OleDbCommand("SELECT 400 FROM a_reflectivity where mineral = 'ullmannite'")

                con.Open()
                command.Connection = con
                dr = command.ExecuteReader
                TextBox1.Text = dr("400")
                con.Close()

            Catch ex As Exception

            End Try



    hgadm02


    • Bearbeitet hgadm02 Sonntag, 16. September 2012 20:50
    Sonntag, 16. September 2012 20:49
  • Wenn Du mit dem Datareader arbeitest, muss auch ein Read ausgeführt werden. Nach dem Zuweisen des DataReaders steht der Datensatzzeiger VOR dem ersten Datensatz. Erst mit dem Read wird auf der nächste Datensatz bereitgestellt. Das wird mit dem Rückkehrcode True beim Read bestätigt. Wenn kein nächster Datensatz mehr vorhanden ist, ist der Rückkehrcode False.
     
    --
    Viele Gruesse
    Peter
    Montag, 17. September 2012 04:25
  • Ja natürlich, Peter:

                con.Open()
                command.Connection = con
                dr = command.ExecuteReader
                While dr.Read()
                    TextBox1.Text = dr(0)
                End While

                con.Close()

    Allerdings steht danach in TextBox1.Text '400' und nicht der erwartete Wert '15' ???

    Herzliche Grüsse

    Holger


    hgadm02

    Montag, 17. September 2012 07:33
  • Da wird wohl im letzten vom Datenbankserver gelieferten Datensatz das Feld-Objekt implizit als 14 umgewandelt werden.
     
    Schalte mal Option Strict On ein und beseitige die Fehler. Das erspart Dir in Zukunft eine Menge Stress.
     
    Willst Du wirklich den letzten Datensatz sehen?
     
    Wenn ja, dass sortiere absteigend und nimm den ersten Datensatz.
     
    --
    Viele Gruesse
    Peter
    Montag, 17. September 2012 10:18
  • Also ich kriege langsam graue Haare mit diesem MS Chart.

    Ich habe es mittlereweile geschafft, meine Daten im von mir bevorzugten DB Design D,E (Datensatz = row) via SQL auszulesen und daraus eine DataTable mit 2 SPALTEN zu basteln, wobei Column1 die X-Werte, Column2  die Y-Werte enthält (da das MS chart die Daten ja in Spaltenform erwartet ...).

    Das Grid View zeigt die daten auch in den korrekten x,y Paaren an, aber wenn ich die DataTable dann an das Chart binde, wird irgend ein Datenmischmasch angezeigt, aber nicht  meine x,y Paare !!?????

    Ein Screenshot folgt nach dem Code.

    Kann mir jemand bitte auf die Spruenge helfen ?

    Vielen Dank und herzliche Gruesse

    Holger

    Private Sub btnLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoad.Click

    Dim con As New OleDb.OleDbConnection

    Dim dbProvider As String

    Dim dbSource As String

    Dim ds1 As New DataSet

    Dim da As OleDb.OleDbDataAdapter

    Dim Sql As String

    dbProvider =

    "PROVIDER=Microsoft.Jet.OLEDB.4.0;"

    dbSource =

    "Data Source = C:/Data/ore_reflectivity.mdb"

    con.ConnectionString = dbProvider & dbSource

    'con.ConnectionString = "PROVIDER=Microsoft.Jet.OLEDB.4.0;C:\Data\ore_reflectivity.mdb"

    If Not ComboBox1.Text = "" Then

    con.Open()

    'MsgBox("Database is now open")

    Sql =

    "SELECT * FROM reflectivity where mineral='" & ComboBox1.Text & "'"

    da =

    New OleDb.OleDbDataAdapter(Sql, con)

    da.Fill(ds1,

    "RefectivityData")

    con.Close()

    'MsgBox("Database is now Closed")

    txtMineral.Text = ds1.Tables(

    "RefectivityData").Rows(0).Item(1)

    txt400.Text = ds1.Tables(

    "RefectivityData").Rows(0).Item(4)

    DataTable1.Clear()

    DataTable1.Rows.Add(400, ds1.Tables(

    "RefectivityData").Rows(0).Item(4))

    DataTable1.Rows.Add(420, ds1.Tables(

    "RefectivityData").Rows(0).Item(5))

    DataTable1.Rows.Add(440, ds1.Tables(

    "RefectivityData").Rows(0).Item(6))

    DataTable1.Rows.Add(460, ds1.Tables(

    "RefectivityData").Rows(0).Item(7))

    DataTable1.Rows.Add(480, ds1.Tables(

    "RefectivityData").Rows(0).Item(8))

    DataTable1.Rows.Add(500, ds1.Tables(

    "RefectivityData").Rows(0).Item(9))

    DataTable1.Rows.Add(520, ds1.Tables(

    "RefectivityData").Rows(0).Item(10))

    DataTable1.Rows.Add(540, ds1.Tables(

    "RefectivityData").Rows(0).Item(11))

    DataTable1.Rows.Add(560, ds1.Tables(

    "RefectivityData").Rows(0).Item(12))

    DataTable1.Rows.Add(580, ds1.Tables(

    "RefectivityData").Rows(0).Item(13))

    DataTable1.Rows.Add(600, ds1.Tables(

    "RefectivityData").Rows(0).Item(14))

    DataTable1.Rows.Add(620, ds1.Tables(

    "RefectivityData").Rows(0).Item(15))

    DataTable1.Rows.Add(640, ds1.Tables(

    "RefectivityData").Rows(0).Item(16))

    DataTable1.Rows.Add(660, ds1.Tables(

    "RefectivityData").Rows(0).Item(17))

    DataTable1.Rows.Add(680, ds1.Tables(

    "RefectivityData").Rows(0).Item(18))

    DataTable1.Rows.Add(700, ds1.Tables(

    "RefectivityData").Rows(0).Item(19))

    Chart1.DataSource = DataTable1

    Chart1.Series(

    "Series1").XValueMember = "Column1"

    Chart1.Series(

    "Series1").YValueMembers = "Column2"

    Chart1.DataBind()

    End If

    End Sub


    hgadm02

    Dienstag, 18. September 2012 15:26
  • Erster Fehler identifiziert:

    Beim Auslesen der DB werden Dezimalstellen nicht richtig umgewandelt: 48,2 ergibt im Chart dann 482 ! Ist das schon bei der SQL Query abzufangen??

    Danke

    Holger


    hgadm02

    Dienstag, 18. September 2012 17:32
  • Got it !

    Musste den Datentyp in den beiden Spalten der DataTable von String auf Single ändern :)


    hgadm02

    Dienstag, 18. September 2012 17:38
  • Hallo hgadm02,

    Ich möchte Dich bitte folgendes lesen und die Beiträge die Dir geholfen haben zu bewerten. Vielen Dank.

    Nutzen Sie die Bewertungsfunktionen ("Antwort" und "Hilfreich") in den MSDN Foren! Unter anderem können andere später eine Lösung schneller finden. Es ist also wünschenswert, dass die fragenden (Benutzer) die Postings anderer Beantworter bewerten.
    Hier dazu die wichtigsten Anhaltspunkte aus den
    Forenregeln und FAQs.

    Lösungsbeiträge als „Die Antwort“ markieren
    Bitte markieren Sie den Beitrag, der zur Lösung geführt hat, als "Die Antwort". Durch Bewerten eines Beitrags als "Die Antwort" können andere Teilnehmer die Lösung schneller finden. Außerdem können Sie dem Benutzer, der die Antwort eingereicht hat, für seinen Beitrag danken und zur Steigerung der Antwortqualität in der Diskussionsgruppe beitragen.
    [Quelle:
    Forenregeln]

    Bitte markiere den/die Beiträge als Antwort, die dir geholfen haben, dein Problem zu lösen. Das ist zum einen eine Anerkennung für die Autoren dieser Beiträge, zum anderen hilft es zukünftigen Lesern, sich in diesem Thread besser zu orientieren und Antworten auf ihre Fragen schneller zu identifizieren.

    Wie zeige ich an, dass meine Frage durch einen Beitrag beantwortet wurde?

    Wie bewerte ich einen Beitrag als hilfreich? Um einen Beitrag als hilfreich zu bewerten, klicken Sie in einem beliebigen Beitrag auf Als hilfreich bewerten. Sie können Ihre Stimme nur einmal für einen Beitrag abgeben.
    [Quelle:
    Häufig gestellte Fragen]

    Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 19. September 2012 17:13
    Moderator
  • Gerne Robert,

    besonderer Dank gilt Okeanos85 der mich auf die richtige Fährte gesetzt hat und sehr hilfreiche, umfangreiche Erläuterungen gab, die sicher zeitintensiv waren !

    Hier ist zur allgemeinen Verwendung nochmal der fertige Code zur Darstellung von Datensätzen aus einer Access mdb Datenbank gepostet, wobei die Datensätze in der DB in Reihen vorliegen und somit mittels einer DataTable auf das vom MS Chart erwartete Spaltenformat umgesetzt werden. Damit können auch DBs mit einer grossen Anzahl an Datensätzen, sowie Datensätze mit eine Mischung aus numerischen Feldern und Kommentarfeldern (siehe Code) einfach verarbeitet werden. Bzgl. der korrekten Uebertragung von numerischen Daten ins DataSet bzw. die DataTable ist darauf zu achten, dass das Default Zellen-Format der DataTable fuer Zellen, die numerische Werte von der SQL Query aufnehmen sollen von String auf ein numerisches Format (Single oder Double) gesetzt wird, das hat mich fast 2 Stunden gekostet ;)

    Gruss

    Holger

    Private Sub btnLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoad.Click

    Dim con As New OleDb.OleDbConnection

    Dim dbProvider As String

    Dim dbSource As String

    Dim ds1 As New DataSet

    Dim da As OleDb.OleDbDataAdapter

    Dim Sql As String

    dbProvider =

    "PROVIDER=Microsoft.Jet.OLEDB.4.0;"

    dbSource =

    "Data Source = C:/Data/ore_reflectivity.mdb"

    con.ConnectionString = dbProvider & dbSource

    If Not ComboBox1.Text = "" Then

    con.Open()

    'MsgBox("Database is now open")

    Sql =

    "SELECT * FROM reflectivity where mineral='" & ComboBox1.Text & "'"

    da =

    New OleDb.OleDbDataAdapter(Sql, con)

    da.Fill(ds1,

    "RefectivityData")

    con.Close()

    'MsgBox("Database is now Closed")

    DataTable1.Clear()

    DataTable1.Rows.Add(400, ds1.Tables(

    "RefectivityData").Rows(0).Item(4))

    DataTable1.Rows.Add(420, ds1.Tables(

    "RefectivityData").Rows(0).Item(5))

    DataTable1.Rows.Add(440, ds1.Tables(

    "RefectivityData").Rows(0).Item(6))

    DataTable1.Rows.Add(460, ds1.Tables(

    "RefectivityData").Rows(0).Item(7))

    DataTable1.Rows.Add(480, ds1.Tables(

    "RefectivityData").Rows(0).Item(8))

    DataTable1.Rows.Add(500, ds1.Tables(

    "RefectivityData").Rows(0).Item(9))

    DataTable1.Rows.Add(520, ds1.Tables(

    "RefectivityData").Rows(0).Item(10))

    DataTable1.Rows.Add(540, ds1.Tables(

    "RefectivityData").Rows(0).Item(11))

    DataTable1.Rows.Add(560, ds1.Tables(

    "RefectivityData").Rows(0).Item(12))

    DataTable1.Rows.Add(580, ds1.Tables(

    "RefectivityData").Rows(0).Item(13))

    DataTable1.Rows.Add(600, ds1.Tables(

    "RefectivityData").Rows(0).Item(14))

    DataTable1.Rows.Add(620, ds1.Tables(

    "RefectivityData").Rows(0).Item(15))

    DataTable1.Rows.Add(640, ds1.Tables(

    "RefectivityData").Rows(0).Item(16))

    DataTable1.Rows.Add(660, ds1.Tables(

    "RefectivityData").Rows(0).Item(17))

    DataTable1.Rows.Add(680, ds1.Tables(

    "RefectivityData").Rows(0).Item(18))

    DataTable1.Rows.Add(700, ds1.Tables(

    "RefectivityData").Rows(0).Item(19))

    Chart1.Series(

    "Series1").Points.DataBind(DataTable1.DefaultView, "Column1", "Column2", Nothing)

    TextBox1.Text = ds1.Tables(

    "RefectivityData").Rows(0).Item(20)

    End If

    End Sub


    hgadm02

    • Als Antwort markiert hgadm02 Donnerstag, 20. September 2012 05:42
    Donnerstag, 20. September 2012 05:41