Announcement

Collapse
No announcement yet.

MySQL abfrage mit MySQL (Connector/NET)

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

  • MySQL abfrage mit MySQL (Connector/NET)

    Hallo Leute,

    mein Problem ist folgendes. Ich habe eine Datenbankabfrage die jede Sekunde aktualisiert werden muss. Momentan
    wird jede Sekunde die Datenbankverbindung hergestellt, die Abfrage ausgeführt und anschließend beendet.
    Das ist aber irgendwie leider recht Prozersor belastend. Ich habe mir also überlegt, dass es besser wäre die Datenbankverbindung herzustellen,
    jede Sekunde die Abfrage auszuführen und dann beim Schließen des Programms die Verbindung zu beenden.
    Leider hab ich keine Ahnung wie ich das machen soll. Hoffe ihr könnt mir helfen.
    Hier noch mein Quellcode um zu sehen was ich gemacht habe.

    Code:
    Private Sub oertimer_Tick(ByVal sender As System.Object, ByVal e As _
      System.EventArgs) Handles oertimer.Tick
     
            ReadMyData("server=" & serverIp & ";" _
            & "user id=" & serverUser & ";" _
            & "password=" & serverPasswd & ";" _
            & "database=" & serverData & ";pooling=false;Max Pool Size=10;connect" & _
            "timeout=3")
            lblLadeJetzt2.Visible = False
     
    End Sub
     
    Public Sub ReadMyData(ByVal myConnString As String)
     
            Dim mySelectQuery As String = "SELECT `programm_id` AS 'id'," & _
              "`sendungen`.`titel` AS 'title', UNIX_TIMESTAMP(`startzeit`) -" & _
              "UNIX_TIMESTAMP(now( )) AS 'countdown', `startzeit` AS 'start'," & _
              "DATE_ADD(`startzeit`, INTERVAL `laenge` SECOND) AS 'end', `laenge`" & _
              "AS 'length', `datei` AS 'mediafile', IFNULL( `logo` , NULL ) AS" & _
              "'osd', `audio_stereo` AS 'stereo', `quellen`.`bezeichnung` AS" & _
              "'bezeichnung', NOW( ) AS 'sqltime', IFNULL( `untertitel` , NULL ) AS" & _
              "'untertitel' FROM `programm` LEFT JOIN `sendungen` USING (" & _
              "`sendung_id`) LEFT JOIN `sendungen_kategorien` USING (" & _
              "`sendung_kategorie_id`) LEFT JOIN `programm_kategorien` USING (" & _
              "`programm_kategorie_id`) LEFT JOIN `quellen` USING (`quelle_id`)" & _
              "WHERE `startzeit` > NOW() AND DATE_ADD(now(), INTERVAL 24 HOUR) >" & _
              "`startzeit` AND (((`sndkat_fs_eng_req` = '1' AND `prgkat_fs_eng_req`" & _
              "= '1') AND NOT ISNULL(`fs_datum`) AND NOT ISNULL(`eng_nr`)) OR NOT (" & _
              "`sndkat_fs_eng_req` = '1' AND `prgkat_fs_eng_req` = '1')) AND ((" & _
              "`mediafile_required` = '1' AND NOT ISNULL(`datei`)) OR" & _
              "`mediafile_required` = '0') ORDER BY `startzeit`"
            Dim myConnection As New MySqlConnection(myConnString)
            Dim myCommand As New MySqlCommand(mySelectQuery, myConnection)
            myConnection.Open()
            Dim myReader As MySqlDataReader
            myReader = myCommand.ExecuteReader()
            ' Always call Read before accessing data.
     
            ' Prüft ob was zurückkommt vom SQL Command
            If myReader.HasRows Then
     
                ' While myReader.Read()
                myReader.Read()
     
                lblTitel1.Text = "Titel: " & myReader.GetString(1)
     
                lblCoundown.Text = "Nächste Sendung in: " & _
                  myConverter.FormatSeconds(myReader.GetString(2))
     
                lblStartzeit1.Text = "Startzeit: " & myReader.GetString(3)
     
                If Not myReader.IsDBNull(4) Then
                    lblEndzeit1.Text = "Endzeit: " & myReader.GetString(4)
                End If
     
                lblLänge1.Text = "Länge: " & myConverter.FormatSeconds( _
                  myReader.GetString(5))
                lblQuelle1.Text = "Quelle: " & myReader.GetString(9)
                stripLblTime.Text = "Aktueller UNIX-Timestamp: " & _
                  myReader.GetString(10)
     
                If Not myReader.IsDBNull(11) Then
                    lblUntertitel1.Text = "Untertitel: " & myReader.GetString(11)
                Else
                    lblUntertitel1.Text = "Untertitel: NULL"
                End If
     
                ' always call Close when done reading.
                myReader.Close()
                ' Close the connection when done with it.
                myConnection.Close()
     
                myConnection.Dispose()
            Else
                stripLblTime.Text = stripLblTime.Text & " KEINE NÄCHSTE SENDUNG" & _
                  "BITTE DATENBAK ÜBERPRÜFEN !!!!"
            End If
     
        End Sub 'ReadMyData

    Hoff mir kann jemand helfen

    MFG Jens

  • #2
    Bist du dir sicher das deine Belastung vom Aufbau der Datenverbindung herrührt? Das würde ich eher bezweifeln. Für den Anfang solltest du eventuell einfach mal das Connection Pooling wieder einschalten. Wieso hast du das überhaupt abgeschaltet?

    Comment


    • #3
      Ja das pooling hab ausgeschaltet weil ich einen error bekomemn habe, leider kann ich nicht mehr sagen welchen fehler ich bekomemn hatte. wes auch gar net genau was dieses pooling bedeutet. also sobald ich den timer von 1 sekunde auf 3 sekunden stell läuft das programm flüssig.

      Comment


      • #4
        Pooling bedeutet das wenn du die Connection liest diese eben nicht wirklich beendet wird sondern in einen Pool zurückgelegt wird. Sobald du wieder eine Connection anforderst muss also nicht wirklich eine neue erzeugt werden sondern du bekommst eine bereits existierende aus dem Pool.

        Das ist besser(und sauberer) als selbst die Connection zu verwahren.

        Comment


        • #5
          ok danke für die erklärung.

          kann es sein das ich den verbindung in einem backgroundworker aufrufen muss, damit mein programm nicht mehr so rumlackt?

          Comment


          • #6
            Da das was du da holst nur nach Statusinformationen aussieht und nicht direkt von User zu bearbeiten ist wäre das eine gute Möglichkeit.

            Besser als ein Backgroundworker wäre in diesem Fall aber wohl einfach auf einen anderen Timer umzusteigen dessen TimerEvent in einem anderen Thread ausgeführt wird. Das wären zum Beispiel System.Timers.Timer oder System.Threading.Timer. Ersterer ist etwas leichter zu benutzen. Bedenke aber das du dann noch den Zugriff auf die GUI (wegen dann vorhanden Crossthread Calls) synchronisieren musst. Und zweitens musst du bedenken das wenn deine Abfrage in Timer Event länger als deine eingestellte 1 Sekunde dauert du du gleichzeitig multiple Timer Threads laufen haben kannst die gleichzeitig die Datenbnak abfragen.

            Comment


            • #7
              okay ich hab ganz ehrlich gesagt keien ahnung davon wie das was du gesagt hast funktioniert.
              könntest du mir bitte erklären wie ich ein timerevent in einem anderen theard aufrufe und den zugriff auf die GUI ermögliche. wär echt nett von dir.

              MFG Jens

              Comment


              • #8
                Stichwörter Multithreading, Invoke etc. Such mal im Forum und im Internet gibt viel gute Literatur dazu
                Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

                Comment


                • #9
                  hi also ich hab das jetzt mal so geändert, jedoch sagt er mir jetzt das ich net auf die steuerelemente zugreifen darf. hab schon gegoogelt hab aber nix gefunden was ich versteh. is das überhaupt so richtig wie ich es geschrieben hab?

                  Code:
                  Private Sub oertimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles oertimer.Tick
                  
                          Dim t As Thread
                          t = New Thread(AddressOf Me.ReadMyData)
                          t.Start()
                  
                      End Sub
                  
                      Public Sub ReadMyData()
                  
                          Dim myConnString As String
                          myConnString = "server=" & serverIp & ";" _
                          & "user id=" & serverUser & ";" _
                          & "password=" & serverPasswd & ";" _
                          & "database=" & serverData & "; pooling=true;Max Pool Size=10;connect timeout=1"
                  
                          Dim mySelectQuery As String = "SELECT `programm_id` AS 'id', `sendungen`.`titel` AS 'title', UNIX_TIMESTAMP(`startzeit`) - UNIX_TIMESTAMP(now( )) AS 'countdown', `startzeit` AS 'start', DATE_ADD(`startzeit`, INTERVAL `laenge` SECOND) AS 'end', `laenge` AS 'length', `datei` AS 'mediafile', IFNULL( `logo` , NULL ) AS 'osd', `audio_stereo` AS 'stereo', `quellen`.`bezeichnung` AS 'bezeichnung', NOW( ) AS 'sqltime', IFNULL( `untertitel` , NULL ) AS 'untertitel' FROM `programm` LEFT JOIN `sendungen` USING (`sendung_id`) LEFT JOIN `sendungen_kategorien` USING (`sendung_kategorie_id`) LEFT JOIN `programm_kategorien` USING (`programm_kategorie_id`) LEFT JOIN `quellen` USING (`quelle_id`) WHERE `startzeit` > NOW() AND DATE_ADD(now(), INTERVAL 24 HOUR) > `startzeit` AND (((`sndkat_fs_eng_req` = '1' AND `prgkat_fs_eng_req` = '1') AND NOT ISNULL(`fs_datum`) AND NOT ISNULL(`eng_nr`)) OR NOT (`sndkat_fs_eng_req` = '1' AND `prgkat_fs_eng_req` = '1')) AND ((`mediafile_required` = '1' AND NOT ISNULL(`datei`)) OR `mediafile_required` = '0') ORDER BY `startzeit`"
                          Dim myConnection As New MySqlConnection(myConnString)
                          Dim myCommand As New MySqlCommand(mySelectQuery, myConnection)
                          myConnection.Open()
                          Dim myReader As MySqlDataReader
                          myReader = myCommand.ExecuteReader()
                          ' Always call Read before accessing data.
                  
                          ' Prüft ob was zurückkommt vom SQL Command
                          If myReader.HasRows Then
                  
                              ' While myReader.Read()
                              myReader.Read()
                  
                              lblTitel1.Text = "Titel: " & myReader.GetString(1)
                  
                              lblCoundown.Text = "Nächste Sendung in: " & myConverter.FormatSeconds(myReader.GetString(2))
                  
                              lblStartzeit1.Text = "Startzeit: " & myReader.GetString(3)
                  
                              If Not myReader.IsDBNull(4) Then
                                  lblEndzeit1.Text = "Endzeit: " & myReader.GetString(4)
                              End If
                  
                              lblLänge1.Text = "Länge: " & myConverter.FormatSeconds(myReader.GetString(5))
                              lblQuelle1.Text = "Quelle: " & myReader.GetString(9)
                              stripLblTime.Text = "Aktueller UNIX-Timestamp: " & myReader.GetString(10)
                  
                              If Not myReader.IsDBNull(11) Then
                                  lblUntertitel1.Text = "Untertitel: " & myReader.GetString(11)
                              Else
                                  lblUntertitel1.Text = "Untertitel: NULL"
                              End If
                  
                              ' always call Close when done reading.
                              myReader.Close()
                              ' Close the connection when done with it.
                              myConnection.Close()
                  
                              myConnection.Dispose()
                              lblLadeJetzt2.Visible = False
                          Else
                              stripLblTime.Text = stripLblTime.Text & " KEINE NÄCHSTE SENDUNG BITTE DATENBAK ÜBERPRÜFEN !!!!"
                          End If
                  
                      End Sub

                  Comment


                  • #10
                    Originally posted by trendmedia View Post
                    könntest du mir bitte erklären wie ich ein timerevent in einem anderen theard aufrufe und den zugriff auf die GUI ermögliche. wär echt nett von dir.

                    MFG Jens
                    Kleines Beispiel (Uhrzeit Anzeige) für Threaded Timer und synchronisierten Aufruf in die UI. Die Stichwörter zum Suchen (insbesondere Invoke) hat das-d bereits gegeben. Die Transferleistung auf dein konkretes Problem solltest du damit hinbekommen.

                    [Highlight=C#]using System;
                    using System.Drawing;
                    using System.Windows.Forms;
                    using System.Timers;

                    namespace MeineKleineFeineUhr
                    {
                    public partial class UhrForm : Form
                    {
                    private Label _lblTime = new Label();

                    public UhrForm()
                    {
                    this.ControlBox = false;
                    Size = new Size(60, 50);
                    Text = "Uhr";

                    // label zur Anzeige vorbereiten
                    _lblTime.Dock = DockStyle.Fill;
                    this.Controls.Add(_lblTime);

                    // timer vorbereiten
                    System.Timers.Timer timer = new System.Timers.Timer();
                    timer.Interval = 1000;
                    timer.Elapsed += timer_Elapsed;
                    timer.Enabled = true;
                    }

                    private void timer_Elapsed(object sender, ElapsedEventArgs e)
                    {
                    // event läuft in einem anderen Thread -> in die UI Aufrufe synchronisieren
                    _lblTime.Invoke(new MethodInvoker(delegate { _lblTime.Text = DateTime.Now.ToString(); }));
                    }

                    [STAThread]
                    static void Main()
                    {
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(fals e);
                    Application.Run(new UhrForm());
                    }
                    }
                    }[/Highlight]

                    Edit: Mist du sprichst ja VB.NET. Ich versuch mal das zu übersetzen.

                    folgendes ohne Gewähr

                    [Highlight=VB.Net]Public Class UhrForm
                    Inherits Form

                    Private _lblTime As Label = New Label

                    Public Sub New()
                    Me.ControlBox = False
                    Me.Size = New Size(60, 50)
                    Me.Text = "Uhr"

                    Me._lblTime.Dock = DockStyle.Fill
                    Me.Controls.Add(Me._lblTime)

                    Dim timer As New Timer { .Interval = 1000 }
                    AddHandler timer.Elapsed, New ElapsedEventHandler(AddressOf Me.timer_Elapsed)
                    timer.Enabled = True
                    End Sub

                    <STAThread> _
                    Private Shared Sub Main()
                    Application.EnableVisualStyles
                    Application.SetCompatibleTextRenderingDefault(Fals e)
                    Application.Run(New UhrForm)
                    End Sub

                    Private Sub timer_Elapsed(ByVal sender As Object, ByVal e As ElapsedEventArgs)
                    Me._lblTime.Invoke(Function
                    Me._lblTime.Text = DateTime.Now.ToString
                    End Function)
                    End Sub
                    End Class
                    [/Highlight]
                    Zuletzt editiert von Ralf Jansen; 06.01.2010, 17:34.

                    Comment


                    • #11
                      danke für deine hilfe!

                      mfg jens

                      Comment

                      Working...
                      X