MySQL Tabelle in Gridview/Tablevie laden

Wie auf MySql und den ganzen Rest zugreifen ...

MySQL Tabelle in Gridview/Tablevie laden

Beitragvon winfu » Di 4. Okt 2011, 19:22

Hallo Gambas Freunde :)

ich bin noch neu hier und habe noch nicht soviel Erfahrungen mit Gambas. Zur Übung möchte ich ein Programm entwickeln um eine MySQL - Tabelle zu editieren. Nun hänge ich schon seit Stunden fest und komme nicht weiter. Die Wiki ist an dieser Stelle unvollständig und über Google wird man nur noch mehr verwirrt.

Ich hänge an folgenden Problem:

ich möchte ganz einfach den Inhalt einer MySQL Tabelle in einem Gridview, Tableview o.ä. darstellen. Aber genau hier fehlt mir der Ansatz. In einer anderen Basic änlichen Sprache hab ich es mit einer Schleife realisiert, wobei als Schleifenbedingung "lese Tabelle aus Datenank bis zum Ende" und dabei nur "füge momentanen Eintrag zum Gridview hinzu" - um das mal auf Anfängersprache zu schreiben.
Das ganze hatte am Ende vieleicht 3 oder 4 Zeilen gut verständlichen Code (Realbasic). In Gambas scheint das etwas komplizierter zu sein, hier muss wohl die Datenbank in ein "result" eingelesen werden?
Ich weiß nicht weiter, alles was ich habe ist:

Code: Alles auswählen
PUBLIC r AS Result

PUBLIC SUB ListBox1_MouseUp()

    r = $Con.Exec("SELECT * FROM " & ListBox1.Current.Text)

END


$Con ist meine Datenbank. die Verbindung zu MySQL war kein großes Problem.

Hier noch ein BIld:
Bild

Uploaded with ImageShack.us
winfu
Foriker
 
Beiträge: 2
Registriert: Di 4. Okt 2011, 18:35

Re: MySQL Tabelle in Gridview/Tablevie laden

Beitragvon yoda » Mi 5. Okt 2011, 17:09

Hallo und willkommen im Forum

schau mal hier vielleicht hilft dir das weiter ;)

viewtopic.php?f=15&t=2220&p=4667&hilit=tuxlog#p4667

mfg Yoda
yoda
Site Admin
 
Beiträge: 423
Registriert: Mo 2. Jan 2006, 22:35
Wohnort: bei Göttinge

Re: MySQL Tabelle in Gridview/Tablevie laden

Beitragvon winfu » Do 6. Okt 2011, 11:04

Hallo yoda,

leider bringt mich das nicht weiter. Ich glaube, dass ich sogar dieses Beispiel schon gelesen habe. Vieleicht habe ich vergessen zu erwähnen, dass bei mir der Inhalt der MySql Tabelle unbekannt ist. Es muss also die Anzahl der Spalten (Columns) mit den dazugehörigen Namen ausgelesen werden und danach der Inhalt der Reihen (Rows). In deinem Beispiel ist beides schon vorher bekannt und kann mit result!Column angesprochen werden, was bei mir aber so nicht funktioniert. Ich kann mir nicht vorstellen, dass ich der Erste bin der dieses Problem hat? In anderen Programmiersprachen wird das mit ein oder mehreren Schleifen gelöst aber in Gambas finde ich einfach kein Ansatz.

in c# habe ich das so realisiert (ohne Schleife) :

Code: Alles auswählen
//daten aus config.ini einlesen - quick & dirty
       StreamReader RStream = new StreamReader(Application.StartupPath + @"\config.ini");
       RStream.ReadLine();
       RStream.ReadLine();
       ServerLoc = RStream.ReadLine();
       ServerDB = RStream.ReadLine();
       ServerUser = RStream.ReadLine();
       ServerPW = RStream.ReadLine();
       ServerPort = Convert.ToString(RStream.ReadLine());
       RStream.Close();
       try
       {
         //Verbindung aufbauen und Table in Datatable einlesen anschließend an Grid übergeben
         string myConnectionString = "SERVER=" + ServerLoc + ";DATABASE=" + ServerDB + ";UID=" + ServerUser + ";PWD=" + ServerPW + ";Port=" + ServerPort + ";";
         MySqlConnection connection = new MySqlConnection(myConnectionString);
         MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM " + listboxselect, connection);
         DataTable data = new DataTable();
         da.Fill(data);
         dataGridView1.DataSource = data;
         dataGridView1.Show();
        }
        catch
        {
          MessageBox.Show("Something goes wrong, check your connection!", "Info", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
winfu
Foriker
 
Beiträge: 2
Registriert: Di 4. Okt 2011, 18:35

Re: MySQL Tabelle in Gridview/Tablevie laden

Beitragvon Ray65 » Fr 7. Okt 2011, 19:38

Hi winfu,

Für eine Datenbankverbindung verwende ich folgende Klasse:
Code: Alles auswählen
STATIC sql_open AS Boolean
STATIC PUBLIC conn AS NEW Connection
STATIC PUBLIC sLogin AS String
STATIC PUBLIC sPWD AS String
STATIC PUBLIC sDBName AS String
PUBLIC dummy AS Integer

PUBLIC SUB _new()
  IF (sql_open = FALSE) THEN make_connection
END

STATIC PUBLIC FUNCTION sql_query(query AS String) AS result
  DIM res AS Result
  DIM sql AS String
  sql = query
  res = conn.Exec(sql)
  RETURN res
  CATCH
  Message.Error("Fehler: " & Error.Text & " " & Error.Where)
END

STATIC FUNCTION make_connection() AS Boolean

  WITH conn
    .Type = "mysql"
    .Host = "localhost"
    .Login = "root"
    .Password = PASSWORD
    .Name = DBNAME
    TRY conn.Open
    IF ERROR THEN
      Message("Datenbank kann nicht geöffnet werden. Fehler: " & Error.Text)
      RETURN FALSE
    END IF
    sql_open = TRUE
    RETURN TRUE
  END WITH

END

Ich glaube der Code stammt sogar von yoda. Ich habe diese für meine Zwecke 'CSQL.class' getauft.
Eingebunden wird der Klasse in deiner Projekt-Startklasse wie folgt:
Code: Alles auswählen
DIM clsSQL AS NEW CSQL

Damit musst Du das Rad nicht jedesmal neu erfinden...

Nun zu deinem eigentlichen Problem. Du wirst Wohl oder Übel zwei Schleifen brauchen. In der erste Schleife kannst Du mittels
Code: Alles auswählen
$Query = "SHOW COLUMNS FROM TABELLENNAME FROM DATENBANK"
$RecordSet = CSQL.sql_query($Query)

und mit
Code: Alles auswählen
SPALTEARRAY[i] = $RecordSet!"Field"

deine Spalten auslesen bzw. die Ergebnisse in ein Array speichern.

In der 2. Schleife dann wie gewohnt mit SELECT etc. deine Daten ermitteln und mit ' $RecordSet!SPALTENARRAY[i] ' auslesen.

Gruß Raymond
Ubuntu 12.04 - Gnome 3.4.1 - Gambas 3.3.3

"Man kann kein Programm idiotensicher machen, weil die Idioten so erfinderisch sind!"
Benutzeravatar
Ray65
Foriker
 
Beiträge: 113
Registriert: Fr 3. Okt 2008, 15:00
Wohnort: Königseggwald, Ba-Wü

Re: MySQL Tabelle in Gridview/Tablevie laden

Beitragvon Honsek » Sa 8. Okt 2011, 07:46

Guten Tag Raymond,

setzt SPALTEARRAY[i] = $RecordSet!"Field" voraus, dass man jeden Feldnamen kennen und angeben muss, um ihn dort einzusetzen?

Welche Gambas-Version setzt Du ein? Die angegebene Klasse CSQL.class werde ich mir genauer ansehen, weil ich bisher immer nur mit einem DB-Modul arbeite und hier sicher für mich neue Informationen zum Aufbau und zum Einsatz einer eigenen Klasse zu finden sind. Eigene Klassen sind für mich immer noch ein Buch mit mindestens einem Siegel ... .

Ich werde hier mal meine Lösungen zur o.a. Aufgabe von winfu vorstellen und diese in ein vollständiges SQLite3-Projekt einbinden. Damit hat winfu sofort Einsicht in den Quelltext und die Datenbank ist mit dabei. Aber zuerst warte ich Deine Antwort ab.

Das fällt mir jetzt erst auf:
Winfu, warum nutzt Du nicht die Komponente DataSource mit eingebettetem DataBrowser ? Deine Aufgabe hattest Du doch so definiert: ... ich möchte ganz einfach den Inhalt einer MySQL Tabelle in einem Gridview, Tableview o.ä. darstellen , denn der DataBrowser ist ein Gitter-Komponente, wie man zum Beispiel beim Festlegen der Spaltenbreite und der angezeigten (!) Spaltenüberschrift im Gitter mit

Code: Alles auswählen
DataBrowser1.GridView.Columns[3].Width = 110
DataBrowser1.GridView.Columns[3].Title = "Heimatort" ' An Stelle von Feldname "Wohnort" in der DB-Tabelle

sehen kann.

Mit freundlichem Gruß

Honsek
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!
Benutzeravatar
Honsek
Foriker
 
Beiträge: 330
Registriert: Do 4. Okt 2007, 17:01

Re: MySQL Tabelle in Gridview/Tablevie laden

Beitragvon Ray65 » Sa 8. Okt 2011, 08:12

Hallo Hans,

Ich Frage ja mit $Query = "SHOW COLUMNS FROM TABELLENNAME FROM DATENBANK" die Spaltennamen der Tabelle ab. Anschließend kann ich mit $RecordSet.Count die Anzahl der Spalten ermitteln. Über SPALTEARRAY[i] = $RecordSet!"Field" habe ich dann die Spaltennamen in mein Array.

Das fällt mir jetzt erst auf: Winfu, warum nutzt Du nicht die Komponente DataSource mit eingebettetem DataBrowser ?

Würde ich für einfache Problemlösungen auch Empfehlen. Wenn er allerdings aufwendige Anwendungen programmieren will rate ich zu selbst gefertigte Lösungen.
Vielleicht kan winfu etwas mehr Code posten, dann können wir mal ein Blich drauf werfen.

Mein Gambas Version ist übrigens immer noch 2.21.

Gruß Raymond
Ubuntu 12.04 - Gnome 3.4.1 - Gambas 3.3.3

"Man kann kein Programm idiotensicher machen, weil die Idioten so erfinderisch sind!"
Benutzeravatar
Ray65
Foriker
 
Beiträge: 113
Registriert: Fr 3. Okt 2008, 15:00
Wohnort: Königseggwald, Ba-Wü

Re: MySQL Tabelle in Gridview/Tablevie laden

Beitragvon Honsek » So 9. Okt 2011, 08:21

Hallo Raymond,

Dank für die Antwort. Ich sehe das genau so - Standard-Komponenten für Standard-Anwendungen, während spezielle Aufgaben auch spezielle, aufgabenangepasste Lösungen erfordern. Zu folgender Zeile von Dir Über SPALTEARRAY[i] = $RecordSet!"Field" habe ich dann die Spaltennamen in mein Array. meine Nachfrage: Wie realisierst Du das Füllen des Arrays SPALTEARRAY[k] genau in Verbindung mit $Query = "SHOW COLUMNS FROM TABELLENNAME FROM DATENBANK" ?

Mit freundlichem Gruß

Honsek
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!
Benutzeravatar
Honsek
Foriker
 
Beiträge: 330
Registriert: Do 4. Okt 2007, 17:01

Re: MySQL Tabelle in Gridview/Tablevie laden

Beitragvon Honsek » So 9. Okt 2011, 15:37

Hallo winfu,
guten Tag Raymond,

wie versprochen stelle ich hier meinen Ansatz zur Lösung der von winfu gestellten Aufgabe vor, DB-Daten in einem Gitter - hier GridView - anzuzeigen. Zuerst werde ich die beiden wichtigsten Prozeduren vorstellen und dann folgt das Quellcode-Archiv des Projektes zum Download, um die Lösung mit geeigneten DB-Daten nachvollziehen zu können sowie alle Projekt-Details zu sehen. Als Datenbank-Engine dient SQLite3.

Teil1:
Code: Alles auswählen
PUBLIC SUB btnDatenImGitterAnzeigen_Click()
  DIM iDatensatzNummer, iSpaltenNummer, k AS Integer
 
  sSQL_Anweisung = "SELECT * FROM " & sDB_TabellenName
' sSQL_Anweisung = "SELECT ID,Vorname,Nachname,Wohnort FROM " & sDB_TabellenName
' sSQL_Anweisung = "SELECT ID,Vorname,Nachname,Wohnort,PLZ,Strasse,EMailAdresse FROM " & sDB_TabellenName
' sSQL_Anweisung = "SELECT * FROM " & DataSource1.Table & " WHERE ID>3 ORDER BY Nachname"
 
  MDataBase.rDBResult = MDataBase.cDBVerbindung.Exec(sSQL_Anweisung)
 
  IF MDataBase.rDBResult.Count = 0 THEN
     Message.Info("Die Anzahl der selektierten Datensätze ist Null!")
     RETURN
  ENDIF
 
  FMain.Mouse = Mouse.Wait
  Reset()
 
  IF MDataBase.rDBResult.Available THEN
     ' Zur Kontrolle: PRINT "Anzahl der Datensätze = " & MDataBase.rDBResult.Count
     ' Zur Kontrolle: PRINT "Anzahl der Felder = " & MDataBase.rDBResult.Fields.Count
     aFeldnamenListe.Resize(MDataBase.rDBResult.Fields.Count) ' Variante mit Resize
     FOR iSpaltenNummer = 0 TO MDataBase.rDBResult.Fields.Count - 1
          aFeldnamenListe[iSpaltenNummer] = MDataBase.rDBResult.Fields[iSpaltenNummer].Name
          ' Zur Kontrolle: PRINT "Feldname[" & iSpaltenNummer & "] = " & aFeldnamenListe[iSpaltenNummer]
     NEXT
         
     MDataBase.rDBResult.MoveFirst
     
     FOR iDatensatzNummer = 0 TO MDataBase.rDBResult.Count - 1
         aDatensatz = NEW Variant[]
         FOR iSpaltenNummer = 0 TO MDataBase.rDBResult.Fields.Count - 1
             ' Variante ohne Resize ---> dann funktioniert die Methode .Add
             aDatensatz.Add(MDataBase.rDBResult[iSpaltenNummer])
             ' Zur Kontrolle: PRINT aDatensatz[iSpaltenNummer]
         NEXT ' Feld
         aDBDatenMatrix.Add(aDatensatz)
         MDataBase.rDBResult.MoveNext
     NEXT ' Datensatz
  ENDIF '  MDataBase.rDBResult.Available 
 
  FMain.Mouse = Mouse.Default 

  grdWerteTabelle.Columns.Count = MDataBase.rDBResult.Fields.Count
  grdWerteTabelle.Columns[0].Width = 25
  FOR iSpaltenNummer = 0 TO MDataBase.rDBResult.Fields.Count - 1
      grdWerteTabelle.Columns[iSpaltenNummer].Title = aFeldnamenListe[iSpaltenNummer]
  NEXT ' Feldname aus der Liste
 
  grdWerteTabelle.Rows.Count = aDBDatenMatrix.Count ' Jetzt wird das Gitter gezeichnet!
  grdWerteTabelle.SetFocus
' Sprung in die erste Datenzeile --->
' grdWerteTabelle.MoveTo(0, 0) 
' Sprung in die letzte Datenzeile --->
  grdWerteTabelle.MoveTo(MDataBase.rDBResult.Count - 1, 0)
 
' Navigation durch die Anzeige im GridView mit 6 Möglichkeiten:
' Pos1-Taste ---> 1. Zeile
' Ende-Taste ---> letzte Zeile
' Bild-nach-unten-Taste ---> letzte Zeile im GridView
' Bild-nach-oben-Taste  ---> erste Zeile im GridView
' Nach-oben-Taste  ---> Scrollen nach oben
' Nach-unten-Taste ---> Scrollen nach unten

' Erweiterungen:
' Mit dem Ereignis grdWerteTabelle_ColumnClick(Column AS Integer)
' kann man realisieren, die Daten im Gitter zu sortieren.
' LINK: http://old.nabble.com/-ASK--How-to-sort-Gridview--to29958078.html#a29959457
' Das setzt aber voraus, dass man den Programmablauf neu gestaltet!

END ' btnDatenImGitterAnzeigen

Teil2:
Code: Alles auswählen
PUBLIC SUB grdWerteTabelle_Data(Row AS Integer, Column AS Integer)
 
  grdWerteTabelle.Data.Text = aDBDatenMatrix[Row][Column]
 
  IF row MOD 2 = 0 THEN grdWerteTabelle.Data.Background = Color.RGB(224, 224, 224) ' hellgrau
 
' Bestimmte Felddaten hervorzuheben:

' IF Val(aMatrix[Row][Column]) = 0 THEN
'    grdWerteTabelle.Data.Background = Color.RGB(255, 95, 95) ' hellrot
'    grdWerteTabelle.Data.Foreground = Color.White
' ENDIF ' Feldinhalt = Zahl 0?
 
  IF aDBDatenMatrix[Row][Column] = "Osterburg" OR aDBDatenMatrix[Row][Column] = "Berlin" THEN
     grdWerteTabelle.Data.Background = Color.RGB(255, 95, 95) ' hellrot
     grdWerteTabelle.Data.Foreground = Color.White
  ENDIF ' Feldinhalt =  ausgewählter Wohnort?
 
END ' grdWerteTabelle_Data

Download:

DBGridView-1.0.54.tar.gz
Projekt DBGriedView
(39.22 KiB) 442-mal heruntergeladen

Interessanter als die Ausgabe der Datenbankdaten im Formular in einem eigenen, nicht datensensitiven Gitter sind die Ausgaben der Datenbankdaten in eine XML-Datei verbunden mit geeigneten Styleanweisungen, in eine (X)HTML-Datei oder mit eigenen DB-Report-Formaten oder auf einen Drucker.

Mit freundlichem Gruß

Honsek
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!
Benutzeravatar
Honsek
Foriker
 
Beiträge: 330
Registriert: Do 4. Okt 2007, 17:01

Re: MySQL Tabelle in Gridview/Tablevie laden

Beitragvon tux_ » So 9. Okt 2011, 20:15

Hi,

also du möchtest den kompletten Inhalt einer Tabelle anzeigen?
Ich hatte mal einen besseren Schnipsel, aber diesen hier konnte ich auf die Schnelle zusammenstellen, er wird sicher nicht optimal sein, aber er funktioniert und kann eventuell als Ausgangspunkt für deine weiteren Untersuchungen dienen:

Code: Alles auswählen
PUBLIC SUB Button1_Click()

  DIM hR AS Result
  DIM hT AS Table
  DIM hF AS Field
  DIM iI AS Integer
  DIM iJ AS Integer

  hT = hConnection.Tables["test"]
  hR = hConnection.Exec("select * from test")
  GridView1.Columns.Count = hT.Fields.Count
  GridView1.Rows.Count = hR.Count + 1
  iI = 0
  FOR EACH hF IN hT.Fields
    GridView1[0, iI].Text = hF.Name
    INC iI
  NEXT
  iI = 0
  FOR EACH hR
    iJ = 0
    FOR EACH hF IN hT.Fields
      GridView1[iI + 1, iJ].Text = hR[hF.Name]
      INC iJ
    NEXT
    INC iI
  NEXT

END
Achtung: Es passiert, dass ich einen frisch geschrieben Beitrag innerhalb von 10 Minuten noch 3-4 Mal aendere!
tux_
Site Admin
 
Beiträge: 941
Registriert: Di 11. Nov 2008, 20:05


Zurück zu Datenbankzugriff

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast