Spisu treści:
- Krok 1: Opsamling danych Af dla Vægt Samt Rejestrowanie Af UID
- Krok 2: Program Arduino
- Krok 3: Węzeł-RED, opóźniony w bazach danych I danych
- Krok 4: Projektowanie bazy danych
- Krok 5: Patelog
- Krok 6: Tabela zamówień
- Krok 7: Tabela klienta
- Krok 8: Tabela zakresów
- Krok 9: Program C#
Wideo: EAL-Industri4.0-RFID Dataopsamling do bazy danych: 10 kroków (ze zdjęciami)
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:32
Dette projekt omhandler opsamling af vægtdata, rejestracja tożsamości vha. RFID, opóźnienia danych w bazie danych MySQL. node-RED, automatyczne przeglądanie i obsługa danych operacyjnych i programu C# w formularzu aplikacji Windows Form. Vi forestiller os følgende:
Vi har en produktionslinje som producen leverpostej i 200g foliebakker. Alle færdigbagte leverpostejer udstyres efter med et RFID tag i plasticlåget/labelen, som indeholder et unikt ID (UID = Unique Identifier, er w 32-bitowym kodzie, 8 znaków szesnastkowych) dla entydig identifikation af hver enkelejt bakke Da færdigvægten af hver enkelt bakke leverpostej kan svinge (afhængig af råvarer, fordampning i ovn mm), og da kunderne hver har et specifikt krav færdigvægten, bruges UID tagget til at knytte hver entilkel hver kugresifikej til leverpostejer til én specifik kunde. Kunderne er supermarkedskæder:
1. Irma. Vægten na Imasie najwyższej pozycji, w której możesz znaleźć +/- 5%, maksymalnie 190g i maksymalny 210g.
2. Brugsen. Vægten på Brugsens leverpostej skal trzymaj sig inden do +/- 10%, altså minimum 180g i maksymalny 220g.
3. Aldi. Vægten på Aldis rabat dźwigniowy skal przechowaj sig inden do +/- 15%, altså minimum 170g i maksymalny 230g.
Der er således følgende sorteringer:
Zakres0: poza zakresem
Zakres1: minimum 190g/maksymalnie 210g
Zakres2: minimum 180g/maksymalnie 220g
Zakres3: minimum 170g/maksymalnie 230g
Krok 1: Opsamling danych Af dla Vægt Samt Rejestrowanie Af UID
Do optymalizacji danych, rejestracji i rejestracji tagów RFID, jest dostarczany za pomocą czytnika/zapisu Arduino MEGA2560 z czytnikiem RFID-RC522. Da vi ikke har nogen vægt, simulerer vi dane dla vægten med et potmeter tilsluttet w analogowym indgang na Arduinoen.
Følgende opstilling do wyboru:
1 szt. potencjometr 25k lineært. Yder-benene er tilsluttet hhv. GND i +5V, pośrednie i doprowadzone do AN0
RFID-RC522 obsługuje karty Arduino dla portu SPI w następujących kolorach:
SDA -> pin 53
SCK -> pin52
MOSI -> pin51
MISO->pin50
IRQ -> NC
GND -> GND
RST -> pin5
3,3 V -> 3,3 V
De opsamlede danych dla hhv. UID i vægten, wysyłany do seryjnego portu, który jest oddzielnym tekstem, jest wyświetlany na węźle-Red, aby uzyskać dodatkowe informacje na desce rozdzielczej i opóźnienia w bazie danych.
Krok 2: Program Arduino
Zaprogramowałem Arduino do bibliotek SPI.h i MFRC522.h dla kunne bruge RFID læseren. Starten af programt initialiseres de anvendte zmiennej. Der laves en instans af MFRC522. I Setup blokken initialiseres den serielle forbindelse, porten SPI i MFRC522. Odracza skanowanie po tagach RFID. Aby uzyskać więcej informacji o tym samym UID i wysłać tę samą liczbę UID, można uzyskać dostęp do kodu, który jest odpowiedni do tego celu. Znajdź tag scannet i UID, ładuje arary nyUID z najświeższym UID sieciowym. Jeśli tablica nyUID jest używana przez oldUID, jest to opowieść o dowolnym identyfikatorze UID, który można wysłać do seryjnego portu. Jeśli chodzi o nyUID i oldUID, jest to opowieść o tym samym tagu UID i UID, a także ignorowane. Hvis der er tale om et nyt UID, wysyła UID'et på den serielle port sammen med en læst værdi fra den serielle port. Den analoge værdi skaleres til området 150-250. Dane wysyła som en komma-separeret tekststreng. Niektóre z głównych zestawów oldUID = nyUID, såleds i kody jasne do odczytu i nowego tagu RFID. Funktionen returnerer true hvis array'ne es, og false hvis array'ne er forskellige.
#włączać
#include // Ten program skanuje karty RFID za pomocą płytki czytnika/zapisu RDIF-RC522. // odczytany jest UID, odczytywany jest pin analogowy. Wartość analogowa 0-1023 jest skalowana do 150-250. // UID i wartość analogowa są wysyłane jako tekst oddzielony przecinkami na porcie szeregowym przy użyciu 9600, N, 8, 1. // Zadbano o wysłanie każdego UID tylko raz z rzędu, // nowy UID musi być obecne przed ponownym wysłaniem tego samego UID. // Ta funkcja jest implementowana w kodzie przez porównanie tablic: oldUIDnyUID w funkcji array_cmp(oldUID, nyUID)
constexpr uint8_t RST_PIN = 5;
constexpr uint8_t SS_PIN = 53; wewn czujnikPin = A0; int Wartość = 0; StringValue = "0000"; bajt staryUID[4] = {}; bajt nyUID[4] = {};
MFRC522 mfrc522 (SS_PIN, RST_PIN); // Utwórz instancję MFRC522.
pusta konfiguracja()
{ Szeregowy.początek(9600); // Zainicjuj komunikację szeregową SPI.begin(); // Zainicjuj magistralę SPI mfrc522. PCD_Init(); // Zainicjuj MFRC522 }
pusta pętla()
{ // Szukaj nowych kart if (! mfrc522. PICC_IsNewCardPresent()) { return; } // Wybierz jedną z kart if (! mfrc522. PICC_ReadCardSerial()) { return; } //załaduj nyUID ze znacznikiem UID for (byte i = 0; i < mfrc522.uid.size; i++) { nyUID = mfrc522.uid.uidByte; } // if staryUIDnyUID if (!array_cmp(staryUID, nyUID)) { // wyślij tag UID na porcie szeregowym for (byte i = 0; i 1000) { Value = 1000; } Wartość = (Wartość / 10) + 150; // wyślij przeskalowaną wartość analogową Serial.print(Value); // wyślij nową linię Serial.println(); //ustaw staryUID = nyUID for (bajt z = 0; z < 4; z++) staryUID[z] = nyUID[z]; } // czekaj 1 s opóźnienia(1000); }
// porównaj 2 tablice…
boolean array_cmp(bajt a, bajt b) { bool test = true; //przetestuj każdy element, aby był taki sam. jeśli tylko jeden nie jest, zwróć false for (byte n = 0; n < 4; n++) { if (a[n] != b[n]) test = false; // jeśli bajt nie jest równy, test = false } if (test == true) return true; w przeciwnym razie zwróć false; }
Krok 3: Węzeł-RED, opóźniony w bazach danych I danych
Følgende flow er lavet i node-RED:
COM4 jest seryjnie łączony z różnymi modyfikacjami danych z płyty Arduino. Funkcjonalny rozdzielacz "Split and Get value" i "Split and Get UID" ma funkcję dzielenia poprzez kommaet i returnere hhv vægten i UID. Wejdź w świat dojrzałości na desce rozdzielczej, wykresie liniowym i skali. Poprawki UID i tekst. Funktionen test_sound advarer verbalt med sætningen "Poza zakresem", hvis vægten er poniżej 170g lub powyżej 230g, dvs i zakres 0.
Podziel i uzyskaj wartość:
var output = msg.payload.split(', ');
temp = {ładunek:(wyjście[1])}; temp. powrotu;
Podziel i uzyskaj UID:
var output = msg.payload.split(", ");
temp = {ładunek:wyjście[0]}; temp. powrotu;
test_sound:
numer zmiennej = parseInt(msg.payload);
if (liczba >230 || liczba<170) { newMsg = {payload:"Poza zakresem"}; powrót nowaWiadom.; } else { nowaWiadomość = {ładunek:""}; powrót nowaWiadom.; }
Funktionen Split string ", " indsætter i timestamp, UID i vægten w bazie danych patedb.patelog.
var output = msg.payload.split(", "); //podziel msg.payload przecinkiem na tablicę
Tag UID = wyjście[0]; //pierwsza część na pierwszej pozycji [0] ValueTag = output[1]; //druga część na drugą pozycję [1]
zmienna m = {
topic: "INSERT INTO patedb.patelog (sygnatura czasowa, UID, waga) VALUES('"+new Date().toISOString()+"', '"+ UIDTag +"', '"+ValueTag+"');" }; powrót m;
patelog er pl Baza danych MySQL forbindelse som er sat op med følgende parametre:
Host: localhost
Port: 3306
Użytkownik: root
Baza danych: patedb
Krok 4: Projektowanie bazy danych
Baza danych patedb indeholder 4 tabeler
logowanie danych do optymalizacji danych, tilskrives dane z programu node-RED i C#
ordertable er en tabel som indeholder data om de genemførte order, tilskrives data af C# programt
Tabela klienta er et kunderegister
rangetable er en tabel som indeholder grænseværdierne for de i C# programt benyttede ranges.
Krok 5: Patelog
Tabellen patelog indeholder folgende 6 kolonner:
pateID (int) er klucz podstawowy i automatyczne zwiększanie.
Znacznik czasu, UID i vægt er af typen varchar (med forskellig max længde)
rangeNr er af typen tinyint (beregnes og tilføjes af C# program)
orderID er af typen int (orderID tilføjes af C# program)
Węzeł-RED podaj ikke værdier kolonnerne rangeNr i orderID. rangeNr og orderID tillader NULL værdier, det bruges i C# programt til at detektere de rækker som skal tilskrives værdier for rangeNr og orderID
Krok 6: Tabela zamówień
ordertable indeholder 5 kolonner:
orderID (int) er det aktualny ordrenummer
orderQuant (mediumint) er ordens pålydende antal
quantProduced (mediumint) er antal der rent faktisk er producet på ordren. (Tabele programu C#)
komentarz (tinytext) er en eventuel kommentar til ordren.
customerID (int) jest aktualnym numerem kundenu na zamówienie.
Krok 7: Tabela klienta
Tabela klienta indeholder 6 kolonner:
customerID (int) er klucz podstawowy i auto inc.
imię i nazwisko, adres, telefon, e-mail (varchar) med forskellig max længde
zakresNr (int)
Krok 8: Tabela zakresów
rangetable indeholder 3 kolonner:
rangeNr (int) er klucz podstawowy og auto inc.
zakresMin (int)
zakresMax (int)
Krok 9: Program C#
Når der producenes en ordre leverpostej, er proceduren følgende:
Kundenummer, ordrenummer, ordreantal og en eventuel kommentar indtastes i C# programt (i praksis overføres det digitalt fra virksomhedens ordresystem. Produktionen startes nu ved tryk på 'start'- knappen. Når en leverpostå er ær æogrdige na i na pasku transportowym) Niezależne informacje o UID i aktualne dane są wysyłane serie do węzła RED, niektóre z nich są wyświetlane na desce rozdzielczej i. Samtidig skrives timestamp, UID i vægt w nowym zestawieniu w nowej tabeli w tabeli. tidspunkt ikke tilskrives værdier til rangeNr i orderID vil de have værdien NULL.
Z uwzględnieniem interwału czasowego w języku C#, program patedb.patelogtabellen dla nowych instrukcji obsługi z wartością NULL i numerem zakresu. Når der er detekteret en række z NULL værdi, beregnes rangeNr i det tilføjes sammen z aktualnym identyfikatorem zamówienia. Når en ordre er produceet, afsluttes ordren ved tryk på”stop”- knappen. Når ordren afsluttes, tilføjes en række til patedb.ordertable med de aktuelle ordredata. Teraz, gdy chcesz zamówić, możesz zbierać dane w zbiorze tabelarycznych tabel i wprowadzać informacje na temat różnych narzędzi i grup Update DataGridview. ordertable kan også vises, og der kan søges ordredata på individueller UID'er eller kundedata på individuelle ordrer.
za pomocą System; za pomocą System. Collections. Generic; przy użyciu System. ComponentModel; za pomocą System. Data; za pomocą System. Drawing; za pomocą System. Linq; za pomocą System. Text; za pomocą System. Threading. Tasks; za pomocą System. Windows. Forms; przy użyciu MySql. Data. MySqlClient;
przestrzeń nazw show_data_from_database
{ public częściowa klasa Form1: Form { MySqlConnection połączenie = new MySqlConnection("datasource=localhost; username=root; password=''"); int NumerWiersza = 0; // Zmienna do przechowywania wartości pateID int RangeNumber = 0; //Zmienna do przechowywania numeru zakresu int weight =0; // Zmienna do przechowywania wagi int OrderNr = 0; // Zmienna do przechowywania OrderNR int QuantProduced = 0; //Zmienna do przechowywania wyprodukowanej ilości int NumberOfRows = 0; //liczba wierszy z wartościami null.. bool ProdRunning = false; //Zmienna wskazująca, czy przyciski start i stop zostały aktywowane int limits = new int[6];// zainicjuj tablicę int CustomerID; // Zmienna do przechowywania identyfikatora klienta public Form1() { InitializeComponent(); load_table(); // wywołanie load_table }
void load_table()
{ MySqlCommand command = new MySqlCommand("WYBIERZ * Z patedb.patelog ORDER BY timestamp DESC;", połączenie); spróbuj { MySqlDataAdapter adapter = new MySqlDataAdapter(); adapter. SelectCommand = polecenie; DataTable dbdataset = new DataTable(); adapter. Fill(dbdataset); BindingSource bsource = new BindingSource(); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; UstawPorządekWiersz(); adapter. Aktualizacja(dbdataset); } catch (wyjątek np.) { MessageBox. Show(ex. Message); } }
private void SetRowOrder()
{ dataGridView1. Kolumny["pateID"]. DisplayIndex = 0; // Her kan rækkefølgen af kolonner ændres dataGridView1. Columns["znacznik czasu"]. DisplayIndex = 1; // Her kan rækkefølgen af kolonner ændres dataGridView1. Columns["UID"]. DisplayIndex = 2; // Her kan rækkefølgen af kolonner ændres dataGridView1. Columns["waga"]. DisplayIndex = 3; // Her kan rækkefølgen af kolonner ændres dataGridView1. Columns["rangeNr"]. DisplayIndex = 4; // Her kan rækkefølgen af kolonner ændres dataGridView1. Columns["orderID"]. DisplayIndex = 5; // Her kan rækkefølgen af kolonner ændres }
private void GetData_Click(object sender, EventArgs e) // Odczytuje tabelę bazy danych i zamówienia według znacznika czasu
{ load_table(); }
private void btnRefreshUID_Click(object sender, EventArgs e) //
{ string timeStr = "SELECT * FROM patedb.patelog ORDER BY UID;"; MySqlCommand polecenie = new MySqlCommand(timeStr, połączenie); spróbuj { MySqlDataAdapter adapter = new MySqlDataAdapter(); adapter. SelectCommand = polecenie; DataTable dbdataset = new DataTable(); adapter. Fill(dbdataset); BindingSource bsource = new BindingSource(); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; UstawPorządekWiersz(); adapter. Aktualizacja(dbdataset); } catch (wyjątek np.) { MessageBox. Show(ex. Message); } }
private void btnRefreshValue_Click (nadawca obiektu, argumenty zdarzenia e)
{ string weightSort = "SELECT * FROM patedb.patelog ORDER BY CAST(weight AS SIGNED INTEGER);"; Polecenie MySqlCommand = new MySqlCommand(weightSort, połączenie); spróbuj { MySqlDataAdapter adapter = new MySqlDataAdapter(); adapter. SelectCommand = polecenie; DataTable dbdataset = new DataTable(); adapter. Fill(dbdataset); BindingSource bsource = new BindingSource(); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; UstawPorządekWiersz(); adapter. Aktualizacja(dbdataset); } catch (wyjątek np.) { MessageBox. Show(ex. Message); } }
private void ChkNullBtn_Click (nadawca obiektu, argumenty zdarzenia e)
{ if (ProdRunning) { CheckTableForNull(); load_table(); } }
private void CheckTableForNull()
{ //Sprawdź/ustaw minimalny interwał timera 100 ms int i; int. TryParse(textTimer1. Text, out i); if (i <100) { timer1. Stop(); i = 100; timer1. Interwał = i; MessageBox. Show("Wartość minimalna i 100mS"); timer1. Start(); } else { timer1. Interwał = i; } textTimer1. Text = timer1. Interval. ToString(); //Sprawdzenie, czy w tabeli są dostępne wiersze z wartością null, zwraca liczbę wierszy w zmiennej:NumberOfRows string weightStr = ""; string chkNull = "SELECT COUNT(*) FROM patedb.patelog GDZIE rangeNR JEST NULL ORDER BY pateID LIMIT 1;"; MySqlCommand polecenie = new MySqlCommand(chkNull, połączenie); spróbuj { połączenie. Otwórz(); NumberOfRows = Convert. ToInt32(command. ExecuteScalar()); połączenie. Zamknij(); } catch (wyjątek np.) { MessageBox. Show(ex. Message); } ostatecznie { if (LiczbaRow != 0) { try { //Wybiera najniższy numer pateID, gdzie numer_zakresu to NULL string readID = "WYBIERZ ID_PATE Z patedb.patelog GDZIE NR_zakresu JEST NULL ORDER BY pateID LIMIT ASC 1;"; MySqlCommand cmdID = new MySqlCommand(readID, połączenie); { połączenie. Otwórz(); NumerWiersza = (int)cmdID. ExecuteScalar(); //liczba całkowita!! połączenie. Zamknij(); } listPateID. Text = RowNumber. ToString(); // odczytaj wybrany numer PateID // wybiera wagę z zaznaczonego ciągu o numerze wiersza wiersz = NumerRzędu. ToString(); string readweight = "SELECT weight FROM patedb.patelog WHERE pateID=" + wiersz; MySqlCommand cmdweight = new MySqlCommand(waga odczytu, połączenie); { połączenie. Otwórz(); wagaStr = (ciąg)cmdwaga. ExecuteScalar(); //Strunowy !! połączenie. Zamknij(); } waga = int. Parse(wagaStr); // przekonwertuj na int txtWeight. Text = weight. ToString(); // drukuj int NumerZakresu = 0; if (waga>= limity[0] && waga = limity[2] && waga = limity[4] && waga <= limity[5]) { RangeNumber = 3; } } txtRange. Text = RangeNumber. ToString(); Dziennik aktualizacji(); } catch (wyjątek np.) { MessageBox. Show(ex. Message); } QuantProduced = QuantProduced + 1; } } } private void btnStart_Click(object sender, EventArgs e) { if (ProdRunning == false) { int valtest; spróbuj { IDKlienta = int. Parse(txtNrKlienta. Tekst); //odczytaj identyfikator klienta } catch { MessageBox. Show("Wprowadź dane produkcyjne i naciśnij przycisk 'start'."); }
string test = "SELECT COUNT(*) FROM patedb.customertable WHERE customerID ="+CustomerID;
MySqlCommand cmdtestcustomer = new MySqlCommand(test, połączenie); { połączenie. Otwórz(); valtest = Convert. ToInt32(cmdtestcustomer. ExecuteScalar()); // zwraca 0 jeśli klient nie istnieje connection. Close(); } if (valtest==1) // jeśli klient istnieje w bazie danych - rozpocznij produkcję { try { OrderNr = int. Parse(txtOrderNr. Text); ProdRunning = prawda; timer1. Start(); textTimer1. Text = timer1. Interval. ToString(); Granice odczytu(); } catch (Wyjątek np.) { MessageBox. Show("Wprowadź dane produkcyjne i naciśnij przycisk 'start'."); } } else MessageBox. Show("Klienta nie ma w bazie danych, spróbuj ponownie"); } //GraniceOdczytu(); }
private void ReadLimits()
{ // Odczytuje limity z tabeli zakresów, zakres od 1 do 3 int counter = 0; for (int rangeNr = 1; rangeNr < 4; rangeNr++) { string readmin = "SELECT rangeMin FROM patedb.rangetable WHERE rangeNr=" + rangeNr; MySqlCommand cmdmin = new MySqlCommand(readmin, połączenie); { połączenie. Otwórz(); limity[licznik] = (int)cmdmin. ExecuteScalar(); licznik = licznik + 1; połączenie. Zamknij(); } // MessageBox. Show(counter. ToString()); string readmax = "SELECT rangeMax FROM patedb.rangetable WHERE rangeNr=" + rangeNr; MySqlCommand cmdmax = new MySqlCommand(readmax, połączenie); { połączenie. Otwórz(); limity[licznik] = (int)cmdmax. ExecuteScalar(); licznik = licznik + 1; połączenie. Zamknij(); } } // koniec pętli }
private void UpdateLog()
{ // AKTUALIZUJNR_zakresu i ciąg IDZamówienia Zakres = Numer_Zakresu. ToString(); string Order = OrderNr. ToString(); string update = "UPDATE patedb.patelog SET rangeNr= "+Range+', ' + "orderID= "+OrderNr+" WHERE pateID="+RowNumber; MySqlCommand updatecmd = new MySqlCommand (aktualizacja, połączenie); spróbuj { połączenie. Otwórz(); updatecmd. ExecuteNonQuery(); połączenie. Zamknij(); } catch (wyjątek np.) { MessageBox. Show(ex. Message); } }
private void btnStop_Click (nadawca obiektu, EventArgs e)
{ if (ProdRunning == true) { timer1. Stop(); ProdRunning = fałsz; AktualizujTabelęZamówień(); } else { MessageBox. Show("Produkcja jeszcze się nie rozpoczęła. Wprowadź dane i naciśnij przycisk 'start'"); } }
private void UpdateOrderTable()
{ string insert = "WSTAW DO patedb.ordertable (orderID, orderQuant, quantProduced, comment, customerID) WARTOŚCI ('" + this.txtOrderNumber. Text + '', '" + this.txtOrderQuant. Text + '', '"+ QuantProduced. ToString()+"', '"+this.txtComment. Text+"', '"+this.txtCustomerNr. Text+"');"; MySqlCommand insertcmd = new MySqlCommand (wstaw, połączenie); spróbuj { połączenie. Otwórz(); insertcmd. ExecuteNonQuery(); połączenie. Zamknij(); Ilość wyprodukowanych = 0; } catch (wyjątek np.) { MessageBox. Show(ex. Message); } }
private void timer1_Tick (nadawca obiektu, EventArgs e)
{ CheckTableForNull(); load_table(); }
private void btnShowOrderTable_Click (nadawca obiektu, argumenty zdarzenia e)
{ if (ProdRunning == false) { MySqlCommand command = new MySqlCommand("SELECT * FROM patedb.ordertable ORDER BY OrderID DESC;", połączenie); spróbuj { MySqlDataAdapter adapter = new MySqlDataAdapter(); adapter. SelectCommand = polecenie; DataTable dbdataset = new DataTable(); adapter. Fill(dbdataset); BindingSource bsource = new BindingSource(); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Aktualizacja(dbdataset); } catch (wyjątek np.) { MessageBox. Show(ex. Message); } } else { MessageBox. Show("Naciśnij stop, aby wyświetlić tabelę zamówień"); } }
private void btnShowOrderDetails_Click (nadawca obiektu, argumenty zdarzenia e)
{ if (ProdRunning == false) { string test = ("SELECT patedb.ordertable.orderID, orderQuant, quantProduced, komentarz, customerID FROM patedb.ordertable INNER JOIN patedb.patelog ON patedb.patelog.orderID= patedb.ordertable.orderID WHERE patedb.patelog. UID = '" + txtShowOrderDetails. Text + "'"); Polecenie MySqlCommand = new MySqlCommand(test, połączenie); spróbuj { połączenie. Otwórz(); Adapter MySqlDataAdapter = nowy MySqlDataAdapter(); adapter. SelectCommand = polecenie; DataTable dbdataset = new DataTable(); adapter. Fill(dbdataset); BindingSource bsource = new BindingSource(); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Aktualizacja(dbdataset); } catch (wyjątek np.) { MessageBox. Show(ex. Message); } połączenie. Zamknij(); } else { MessageBox. Show("Naciśnij stop, aby wyświetlić szczegóły zamówienia"); } }
private void btnShowCustomerDetails_Click (nadawca obiektu, argumenty zdarzenia e)
{ if (ProdRunning == false) { string test = ("SELECT patedb.tabela_klienta. ID_klienta, nazwa, adres, telefon, e-mail, numer_zakresu FROM patedb.tabela_klienta INNER JOIN patedb.ordertable ON patedb.ordertable. ID_klienta= patedb.tabela_klienta. IDKlienta WHERE patedb.ordertable.orderID = '" + txtShowCustomerDetails. Text + "'"); MySqlCommand polecenie = new MySqlCommand(test, połączenie); spróbuj { MySqlDataAdapter adapter = new MySqlDataAdapter(); adapter. SelectCommand = polecenie; DataTable dbdataset = new DataTable(); adapter. Fill(dbdataset); BindingSource bsource = new BindingSource(); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Aktualizacja(dbdataset); } catch (wyjątek np.) { MessageBox. Show(ex. Message); } } else { MessageBox. Show("Naciśnij stop, aby wyświetlić dane klienta"); } } }
}
Zalecana:
Jak podłączyć NodeMCU ESP8266 do bazy danych MySQL: 7 kroków
Jak połączyć NodeMCU ESP8266 z bazą danych MySQL: MySQL to szeroko stosowany system zarządzania relacyjnymi bazami danych (RDBMS), który wykorzystuje ustrukturyzowany język zapytań (SQL). W pewnym momencie możesz chcieć przesłać dane czujnika Arduino/NodeMCU do bazy danych MySQL. W tej instrukcji zobaczymy, jak się połączyć
Utwórz oprogramowanie bazy danych Ms Access, aby przygotować wynagrodzenie w Twojej firmie: 6 kroków
Utwórz oprogramowanie bazy danych Ms Access, aby przygotować wynagrodzenie w Twojej firmie: Dam ci krótką instrukcję, jak utworzyć system płacowy przy użyciu dostępu MS do generowania miesięcznych wynagrodzeń i łatwego drukowania odcinków wynagrodzeń za pomocą tego. W ten sposób możesz przechowywać w bazie danych comiesięczne dane dotyczące wynagrodzeń i edytować lub przeglądać z opóźnieniem
Jak projektować relacyjne bazy danych w programie Microsoft Access dla początkujących: 17 kroków
Jak projektować relacyjne bazy danych w programie Microsoft Access dla początkujących: Poniższy zestaw instrukcji zawiera szczegółowe informacje na temat projektowania relacyjnych baz danych w programie Microsoft Access. Ten przewodnik pokaże najpierw, jak prawidłowo połączyć dwie (2) tabele. Następnie opiszę szczegółowo, jak utworzyć formularz z tej nowej relacji, umożliwiając użytkownikowi wprowadzenie
Jak pobrać dane z bazy danych Firebase na NodeMCU: 7 kroków
Jak pobrać dane z bazy danych Firebase na NodeMCU: W tym celu będziemy pobierać dane z bazy danych w Google Firebase i pobierać je za pomocą NodeMCU w celu dalszego analizowania. WYMAGANIA PROJEKTOWE: 1) NodeMCU lub kontroler ESP82662) G-Mail konto do tworzenia bazy danych Firebase.3) Pobierz
Projekt Arduino: sterowanie elektroniką przez Internet za pomocą Nodejs + bazy danych SQL i strony internetowej.: 6 kroków
Projekt Arduino: Sterowanie elektroniką przez Internet za pomocą Nodejs + bazy danych SQL i strony internetowej.: Projekt: Mahmed.techData wykonania: 14 lipca 2017 r. Poziom trudności: Początkujący z pewną wiedzą programistyczną. Wymagania sprzętowe: - Arduino Uno, Nano, Mega (myślę, że większość MCU z połączeniem szeregowym będzie działać) - Pojedyncza dioda LED i amp; Ograniczenie prądu res