Pobranie danych z MySQL - biblioteka

0

Witam
Piszę prostą aplikację która będzie pobierała i wyświetlanie dane z bazy danych MySQL. Baza danych jest postawiona na XAMPP i dane do niej są wysyłane przez Arduino. Mam już skrypt w php do wyświetlania tych danyh ale nie wiem jak to zrobić w C#. W internecie jest niby dużo informacji na ten temat ale wszędzie widzę, że konfigurowana jest baza danych MS SQL. Proszę o pomoc jak mam rozwiązać ten problem. Dodam jeszcze że dopiero zaczynam programować w C#.

0

Faktycznie może zbyt ogólnie opisałem temat ale największy problem polegał na tym, że nie wiedziałem, że muszę pobrać dodatek Connector / NET i nowością dla mnie było dodanie odwołania do projektu. Doszedłem do mementu gdzie wzorując się tutrialem stworzyłem klasę do komunikacji z bazą danych ale mam problem z wyświetleniem odebranych wartości w Textbox. Tak wygląda moja klasa do komunikacji:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace odczyt_sql
{
    class DBconnect
    {
        private MySqlConnection connection;
        private string server;
        private string database;
        private string uid;
        private string password;

        //konstruktor
        public DBconnect()
        {
            Initialize();
        }

        private void Initialize()
        {
            server = "localhost";
            database = "ethernet";
            uid = "root";
            password = "";
            string connectionString;
            connectionString = "SERVER=" + server + ";" + "DATABASE=" + database + ";" + "UID" + uid + ";" + "PASSWORD=" + password + ";";

            connection = new MySqlConnection(connectionString);
        }

        private bool OpenConnection()
        {
            try
            {
                connection.Open();
                return true;
            }
            catch (MySqlException ex)
            {
                switch (ex.Number)
                {
                    case 0:
                        MessageBox.Show("Cannot connect to server.  Contact administrator");
                        break;

                    case 1045:
                        MessageBox.Show("Invalid username/password, please try again");
                        break;
                }

                return false;

            }
        }

        private bool CloseConnection()
        {
            try
            {
                connection.Close();
                return true;
            }
            catch (MySqlException ex)
            {
                MessageBox.Show(ex.Message);
                return false;
            }
        }

        public List< string >[] Select()
        {
            string query = "SELECT * FROM data ORDER BY id DESC";

            List<string>[] list = new List<string>[5];
            list[0] = new List<string>();
            list[1] = new List<string>();
            list[2] = new List<string>();
            list[3] = new List<string>();
            list[4] = new List<string>();

            //otwarcie połączenia
            if (this.OpenConnection() == true)
            {
                MySqlCommand cmd = new MySqlCommand(query, connection);
                MySqlDataReader dataReader = cmd.ExecuteReader();

                while (dataReader.Read())
                {
                    list[0].Add(dataReader["id"] + "");
                    list[1].Add(dataReader["even"] + "");
                    list[2].Add(dataReader["temperature"] + "");
                    list[3].Add(dataReader["humidity"] + "");
                    list[4].Add(dataReader["head_index"] + "");
                }

                dataReader.Close();

                this.CloseConnection();

                return list;
            }
            else
            {
                return list;
            }
                



        }
    }
}

a wyświetlanie próbuje zrobić w nasypujący sposób:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data.MySqlClient;




namespace odczyt_sql
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            DBconnect DB = new DBconnect();
            dane.Text = DB.Select;
        }
    }
}

Niestety przy DB.Select wyskakuje komunikat że nie można przekonwertować na string.

1

Oszukujesz.

To się nie kompiluje.

0

liste masz typu string a z bazy wyciagasz object
dodaj tam .ToString() i powinno ruszyc.

0

Kolego hipekk ja nie pisałem że to się kompiluje, błąd wyskakiwał już przy wprowadzaniu funkcji.

Zapisałem to tak:

dane.Text = DB.Select().ToString();

Projekt już się kompiluje ale wyskakuje błąd komunikacji z bazą danych : "Cannot connect to server. Contact administrator". Sprawdzałem czy poprawnie są dane logowania, sprawdzałem czy jest zapisane tak jak na przykładach w internecie i nie widzę błędu. Sprawdziłem też na drugim komputerze aby wyeliminować problem z xamppem i cały czas nie łączy się z bazą danych.

0

Z problemem z komunikacją już sobie poradziłem zmieniając connectionString na taki:

connectionString = @"SERVER= localhost; userid = root; password = ; database = ethernet ";

Mam teraz problem z wyświetlaniem danych w textbox bo zamiast danych wyświetla się w nim komunikat: " System.Collections.Generic.List`1[System.String][]"

0

bo konwertujesz cala liste do stringa
spróbuj tak:
usun tego ToString i w liscie juz konwertuj
list[0].Add(dataReader["id"].ToString() + "");

0

Dodałem ToString do listy i usunąłem z wywołania w TextBox i tam taki oto komunikat:
screenshot-20181231134318.png

0

Wynikiem operacji DB.Select() jest lista stringów, a nie jeden string, więc nie możesz przypisać tego do zmiennej typu string. Użyj np. metody First(), aby z tego, co ci zwróci Select() dostać pierwszy element.

0

Niestety nadal nie udało mi się uporać z problemem. Dodałem MessageBoxy w kolejnych krokach aby sprawdzić czy wszystko się wykonuje i zauważyłem że błąd "System.Collections.Generic.List`1" pojawia się Od razu po dodaniu wartości do listy.

while (dataReader.Read())
                {
                    list[0].Add(dataReader["id"].ToString() + "");
                    MessageBox.Show("odczytano pierwszą wartość"+ list[0]);
                    list[1].Add(dataReader["event"].ToString() + "");
                    list[2].Add(dataReader["temperature"].ToString() + "");
                    list[3].Add(dataReader["humidity"].ToString() + "");
                    list[4].Add(dataReader["heat_index"].ToString() + "");
                }

Dodanie metod First() nie zmienia działania programu. A wykonałem to tek:

dane.Text = DB.Select().First().ToString();
0

Nie przepisu słabego kodu php na c#. Poczytaj o tym czym jest klasa i obiekt. Zbuduj z wyników listę obiektów z wartościami pobranymi z db. Podepnij listę do jakiegoś grida.
Kursów w necie dla początkujących jest sporo trzeba się czegoś nauczyć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1