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#.
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.
Oszukujesz.
To się nie kompiluje.
liste masz typu string a z bazy wyciagasz object
dodaj tam .ToString() i powinno ruszyc.
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.
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][]"
bo konwertujesz cala liste do stringa
spróbuj tak:
usun tego ToString i w liscie juz konwertuj
list[0].Add(dataReader["id"].ToString() + "");
Dodałem ToString do listy i usunąłem z wywołania w TextBox i tam taki oto komunikat:
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.
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();
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ć.