Kazalo:

EAM-Industri4.0-RFID zbirka podatkov do baze podatkov: 10 korakov (s slikami)
EAM-Industri4.0-RFID zbirka podatkov do baze podatkov: 10 korakov (s slikami)

Video: EAM-Industri4.0-RFID zbirka podatkov do baze podatkov: 10 korakov (s slikami)

Video: EAM-Industri4.0-RFID zbirka podatkov do baze podatkov: 10 korakov (s slikami)
Video: Веб-программирование – информатика для руководителей бизнеса 2016 2024, Julij
Anonim
EAL-Industri4.0-RFID zbirka podatkov do baze podatkov
EAL-Industri4.0-RFID zbirka podatkov do baze podatkov

Dette projekt omhandler opsamling af vagtdata, registering identiteter vha. RFID, zaostajanje podatkov v bazi podatkov MySQL vha. node-RED, samostojno obnašanje in ravnanje z opsamlede podatki v programu et C# v obliki programa Windows Form Application. Vi forestiller os følgende:

Vi har en produktionslinje som proizvajalca leverpostej in 200g foliebakker. Vsi vzvodni vzvodi, ki so nameščeni po vzporedniku z oznako RFID in plastično/označeno, kot imetnik imetnika in enotni ID (UID = edinstven identifikator, so v 32 -bitnem kodu, 8 šestnajstiških znakov) za identifikacijo enotne številke. 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 enkelt leverposter leverposterj leverposterj leverposterj leverpostejer til én specik kunde. Kunderne er supermarkedskæder:

1. Irma. V tem primeru morate za +/- 5%vnesti kozarec lesa, ki ne presega 190 g ali največ 210 g.

2. Brugsen. Vrednost za Brugsens leverpostej skal holde sig inden za +/- 10%, najmanj 180 g in največ 220 g.

3. Aldi. Vrednost za popust v višini Aldis je le +/- 15%, najmanj 170 g ali največ 230 g.

Der er således følgende sorteringer:

Razpon 0: izven dosega

Razpon 1: najmanj 190 g/največ 210 g

Razpon 2: najmanj 180 g/največ 220 g

Razpon 3: najmanj 170 g/največ 230 g

Korak 1: Pregledovanje podatkov za Vgg Samt Registracija pri UID

Opsamling Af Podatki za Vgg Samt Registrering Af UID
Opsamling Af Podatki za Vgg Samt Registrering Af UID

Če želite pregledati podatke za prenos, se registrirate pri oznakah RFID in preverite v Arduinu MEGA2560 in bralniku/zapisovalniku RFID-RC522. Da vi ikke har nogen vægt, simulator vi podatkov za vægten med et potmeter tilsluttet and analog indgang på Arduinoen.

Følgende opstilling er anvendt:

1 stk potmeter 25k lineært. Yder-benene er tilsluttet hhv. GND og +5V, vmesni vmesnik z napetostjo AN0

RFID-RC522 je opremljen s priključki SPI za Arduino, ki so na voljo za:

SDA -> pin 53

SCK -> pin52

MOSI -> pin51

MISO-> pin50

IRQ -> NC

GND -> GND

RST -> pin5

3.3V -> 3.3V

De opsamlede podatki, za hhv. UID in vggten, pošljete v serijski vmesnik kot kom-ločeno besedilo, ki ga prenašate do vozlišča-rdeči som, da ga predstavite na nadzorni plošči in v zbirki podatkov.

2. korak: Arduino-program

I Arduino programmet vključen v biblioteker SPI.h og MFRC522.h for in kunne bruge RFID læseren. Začel sem s programsko inicializacijo spremenljivke. Der laves en instans af MFRC522. I Nastavitev blokken initialiseres den serielle forbindelse, SPI porten og MFRC522. Derefter skenira efter oznake RFID. Za ikke at sende det samme UID afsted flere gange efter hinanden, er der lavet en stump kode som tjekker for dette. Når er er scannet et UID tag, naloži arary nyUID med det netop læste UID. Hvisov niz nyUID je nameščen iz oldUID -a ali je v njem prikazan UID, ki ga lahko pošljete v serijska vrata. Hvis nyUID og oldUID er ens, er der tale om samme UID tag og UID'et skal ignoresres. HIS der er tale om et nyt UID, pošilja 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. Podatki so poslani kot komma-separeret tekststreng. Som det sidste sættes oldUID = nyUID, sleded at koden klart til and læse et nyt RFID tag.. Sidste funktion and programmet er den funktion in sammenligner 2 arrays. Funktionen povratnik true hvis array'ne er ens, og false hvis array'ne er forskellige.

#vključi

#include // Ta program skenira kartice RFID z uporabo bralne/zapisovalne plošče RDIF-RC522. // UID se bere, analogni pin se bere. Analogna vrednost 0-1023 je pomanjšana na 150-250. // UID in analogna vrednost se pošljeta kot besedilo, ločeno z vejicami, na serijskih vratih z uporabo 9600, N, 8, 1. // Poskrbljeno je bilo, da se vsak UID pošlje le enkrat zapored, // nov UID je treba poslati prisotna, preden je mogoče znova poslati isti UID. // Ta funkcija je implementirana v kodo s primerjavo nizov: oldUID nyUID v funkciji array_cmp (oldUID , nyUID )

constexpr uint8_t RST_PIN = 5;

constexpr uint8_t SS_PIN = 53; int sensorPin = A0; int Vrednost = 0; Niz StringValue = "0000"; bajt oldUID [4] = {}; bajt nyUID [4] = {};

MFRC522 mfrc522 (SS_PIN, RST_PIN); // Ustvari primerek MFRC522.

void setup ()

{Serial.begin (9600); // Začetek serijske komunikacije SPI.begin (); // Zagon vodila SPI mfrc522. PCD_Init (); // Zagon MFRC522}

void loop ()

{// Poiščite nove kartice if (! Mfrc522. PICC_IsNewCardPresent ()) {return; } // Izberite eno od kartic if (! Mfrc522. PICC_ReadCardSerial ()) {return; } // naloži nyUID z oznako UID za (bajt i = 0; i <mfrc522.uid.size; i ++) {nyUID = mfrc522.uid.uidByte ; } // če oldUID nyUID if (! array_cmp (oldUID, nyUID)) {// pošlje oznako UID na serijska vrata za (bajt i = 0; i 1000) {Vrednost = 1000; } Vrednost = (Vrednost / 10) + 150; // pošiljamo pomanjšano analogno vrednost Serial.print (Value); // pošlji novo vrstico Serial.println (); // nastavimo oldUID = nyUID za (bajt z = 0; z <4; z ++) oldUID [z] = nyUID [z]; } // počakajte 1 sekundo zamude (1000); }

// primerjamo 2 matriki …

logični niz_cmp (bajt a , bajt b ) {bool test = true; // preizkusimo, da je vsak element enak. če samo ena ni, vrnite false za (bajt n = 0; n <4; n ++) {if (a [n]! = b [n]) test = false; // če bajt ni enak, test = false} if (test == true) vrne true; else vrni false; }

Korak 3: Node-RED, podatkovna zbirka podatkov I zaostaja

Node-RED, podatkovna zbirka podatkov I zaostaja
Node-RED, podatkovna zbirka podatkov I zaostaja
Node-RED, podatkovna zbirka podatkov I zaostaja
Node-RED, podatkovna zbirka podatkov I zaostaja

Følgende flow er lavet in node-RDEČA:

COM4 je serijsko nameščen za shranjevanje podatkov o spremembah podatkov Arduino boardet. Funkcija "Razdelite in pridobite vrednost" in "Razdelite in pridobite UID" razdelitelne tekste in povratne informacije o vračanju hhv v UID. Vægten bruges til fremvisning på dashboardet et et linechart og en scale. UID fremvises in et tekstfelt. Funkcionalnost test_sound advarer verbalt med sætningen "Out of range", višja od 170 g ali več kot 230 g, DVS in razpon 0.

Razdelite in pridobite vrednost:

var output = msg.payload.split (',');

temp = {koristna obremenitev: (izhod [1])}; povratna temperatura;

Razdelite in pridobite UID:

var output = msg.payload.split (",");

temp = {koristna obremenitev: izhod [0]}; povratna temperatura;

test_zvok:

var number = parseInt (msg.payload);

if (število> 230 || število <170) {newMsg = {koristna obremenitev: "Izven dosega"}; vrni novo sporočilo; } else {newMsg = {payload: ""}; vrni novo sporočilo; }

Funkcionalnost Razdeljeni niz "," vstavljen časovni žig, UID in vhgten in en baza podatkov patedb.patelog.

var output = msg.payload.split (","); // razdeli msg. naloži z vejicami v matriko

UIDTag = izhod [0]; // prvi del na prvo mesto [0] ValueTag = output [1]; // drugi del na drugo mesto [1]

var m = {

topic: "INSERT INTO patedb.patelog (časovni žig, UID, teža) VALUES ('"+nov datum (). toISOString ()+"', '"+UIDTag+"', '"+ValueTag+"');" }; vrnitev m;

patelog je sl bazo podatkov MySQL, ki je bila nastavljena na nekaj parametrov:

Gostitelj: localhost

Pristanišče: 3306

Uporabnik: root

Baza podatkov: patedb

4. korak: Oblikovanje baze podatkov

Oblikovanje baze podatkov
Oblikovanje baze podatkov

Podatkovna zbirka patedb indeholder 4 tabeller

patelog er dataopsamlingstabellen, tilskrive podatke o vozlišču-RED og C# programmet

ordertable er en tabel som indeholder data om de genemførte ordrer, tilskrives data af C# programmet

ertable kunderegister

rangetable er en tabel som indeholder grænseværdierne for de i C# programmet benyttede range.

5. korak: Patelog

Patelog
Patelog

Tabellen patelog indeholder folgende 6 kolonner:

pateID (int) je primarni ključ in vklopljen samodejni disk.

Časovni žig, UID in oznaka tipa type varchar (z največjo dolžino)

rangeNr er af typen tinyint (bereg og tilføjes af C# programmet)

orderID je natipkan int (orderID je na voljo v programski opremi C#)

Node-RED tilføjer ikke værdier til kolonnerne rangeNr og orderID. rangeNr in orderID tillader NULL værdier, det bruges in C# programmet do detektere de rækker som skal tilskrives værdier for rangeNr og orderID

6. korak: Možnost naročanja

Možnost naročanja
Možnost naročanja

naročniški imetnik imetnikov 5 kolonner:

orderID (int) er det aktuelle ordrenummer

orderQuant (mediumint) er ordens pålydende antal

quantProduced (mediumint) er antal der rent faktisk er produceret på ordren. (Nastavitve programa C#)

comment (tinytext) er en eventuel komentar til ordren.

customerID (int) er det aktuelle kundenummer på ordren.

7. korak: uporabnikom na voljo

Za stranke
Za stranke

neodplačni lastnik strank 6 kolonner:

customerID (int) primarni ključ in samodejno vklj.

ime, naslov, telefon, e -poštni naslov (varchar) med forskellig max længde

rangeNr (int)

8. korak: nastavljiv

Obsegljiv
Obsegljiv

indeholder 3 kolonner

rangeNr (int) er primarni ključ in avto inc.

rangeMin (int)

rangeMax (int)

9. korak: Program C#

Program C#
Program C#

Når der produceres en ordre leverpostej, er proceduren følgende:

Kundenummer, ordrenummer, ordreantal og en eventuel komentar indtastes in program C# (i praksis overføres det digitalt fra virksomhedens ordresystem. Produktionen startes nu ved tryk på 'start'- knappen. på et transportbånd) Samhørende værdier af UID og den aktuelle vægt senderselt til node-RED, som viser de opsamlede data in dashboard 'et. Samtidig skrives timetamp, UID og en i ny række in patedb tabelar. tidspunkt ikke tilskrives værdier til rangeNr og orderID vil de have værdien NULL.

Med et timerinterval podinterger C# programmet patedb.patelogtabellen for nye tilkomne rækker med NULL værdier i rangeNr kolonnen. Når der er detekteret en række med NULL værdi, beregnes rangeNr og det tilføjes sammen med det aktuelle orderID. Når en ordre er produceret, afsluttes ordren ved tryk på”stop”- knappen. Når ordren afsluttes, tilføjes en række til patedb.ordertable med de aktuelle ordredata. Ne glede na to, ali lahko izveste podatke in patelog tabellen fremvises ved at trykke på de forskellige knapper in gruppen Update DataGridview. naročanje po naročilu je možno, če ga želite naročiti pri posamezniku UID ali ga kupite pri posamezniku.

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

imenski prostor show_data_f_database

{javni delni razred Form1: Obrazec {MySqlConnection connection = new MySqlConnection ("datasource = localhost; username = root; password = ''"); int Številka vrstice = 0; // spremenljivka za shranjevanje vrednosti pateID int RangeNumber = 0; // spremenljivka za shranjevanje rangenumber int weight = 0; // spremenljivka za shranjevanje teže int OrderNr = 0; // spremenljivka za shranjevanje OrderNR int QuantProduced = 0; // spremenljivka za shranjevanje proizvedene količine int NumberOfRows = 0; // število vrstic z ničelnimi vrednostmi.. bool ProdRunning = false; // Spremenljivka, ki označuje, ali so bili gumbi za zagon in zaustavitev aktivirani int meje = nov int [6]; // inicializiramo niz int CustomerID; // Spremenljivka za shranjevanje CustomerID javnega Form1 () {InitializeComponent (); load_table (); // pokliči load_table}

void load_table ()

{MySqlCommand ukaz = nov MySqlCommand ("SELECT * FROM patedb.patelog ORDER BY časovni žig DESC;", povezava); poskusite {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = ukaz; DataTable dbdataset = nova podatkovna tabela (); adapter. Fill (dbdataset); BindingSource bsource = nov BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Update (dbdataset); } catch (izjema ex) {MessageBox. Show (ex. Message); }}

zasebna praznina SetRowOrder ()

{dataGridView1. Columns ["pateID"]. DisplayIndex = 0; // Njen glavni podatek o kolonnerjih podatkov dataGridView1. Columns ["timestamp"]. DisplayIndex = 1; // Njen naslov je prikazan kot kolonner podatkov dataGridView1. Columns ["UID"]. DisplayIndex = 2; // Njeni podatki o kolonnerju dataGridView1. Columns ["weight"]. DisplayIndex = 3; // Njena možnost je, da kolonner prikaže podatke dataGridView1. Columns ["rangeNr"]. DisplayIndex = 4; // Njen naslov je prikazan kot kolonner dataGridView1. Columns ["orderID"]. DisplayIndex = 5; // Njen kan rækkefølgen af kolonner ændres}

private void GetData_Click (pošiljatelj objekta, EventArgs e) // Prebere tabelo zbirke podatkov in naročila po časovni oznaki

{load_table (); }

private void btnRefreshUID_Click (pošiljatelj objekta, EventArgs e) //

{string timeStr = "SELECT * FROM patedb.patelog ORDER BY UID;"; Ukaz MySqlCommand = nov MySqlCommand (timeStr, povezava); poskusite {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = ukaz; DataTable dbdataset = nova podatkovna tabela (); adapter. Fill (dbdataset); BindingSource bsource = nov BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Update (dbdataset); } catch (izjema ex) {MessageBox. Show (ex. Message); }}

private void btnRefreshValue_Click (pošiljatelj objekta, EventArgs e)

{string weightSort = "SELECT * FROM patedb.patelog NAROČI Z ODDELKOM (teža KOT PODPISAN INTEGER);"; Ukaz MySqlCommand = nov MySqlCommand (weightSort, povezava); poskusite {adapter MySqlDataAdapter = nov MySqlDataAdapter (); adapter. SelectCommand = ukaz; DataTable dbdataset = nova podatkovna tabela (); adapter. Fill (dbdataset); BindingSource bsource = nov BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Update (dbdataset); } catch (izjema ex) {MessageBox. Show (ex. Message); }}

zasebna praznina ChkNullBtn_Click (pošiljatelj objekta, EventArgs e)

{if (ProdRunning) {CheckTableForNull (); load_table (); }}

zasebna praznina CheckTableForNull ()

{// Preverite/nastavite časovni interval najmanj 100 ms int i; int. TryParse (textTimer1. Text, ven i); if (i <100) {timer1. Stop (); i = 100; timer1. Interval = i; MessageBox. Show ("Najmanjša vrednost i 100mS"); timer1. Start (); } else {timer1. Interval = i; } textTimer1. Text = timer1. Interval. ToString (); // Preveri, ali so v tabeli na voljo vrstice z ničlo, vrne število vrstic v spremenljivki: NumberOfRows string weightStr = ""; string chkNull = "SELECT COUNT (*) FROM patedb.patelog WHERE rangeNR IS NULL ORDER BY pateID LIMIT 1;"; Ukaz MySqlCommand = nov MySqlCommand (chkNull, povezava); poskusite {connection. Open (); NumberOfRows = Pretvori. ToInt32 (command. ExecuteScalar ()); povezava. Zapri (); } catch (izjema ex) {MessageBox. Show (ex. Message); } končno {if (NumberOfRows! = 0) {try {// Izbere najnižjo številko pateID -a, kjer je rangeNr NULL string readID = "IZBERI pateID FROM patedb.patelog KJE je rangeNR NULL ORDER BY pateID ASC LIMIT 1;"; MySqlCommand cmdID = nov MySqlCommand (readID, povezava); {connection. Open (); Številka vrstice = (int) cmdID. ExecuteScalar (); // celo število !! povezava. Zapri (); } listPateID. Text = Številka vrstice. ToString (); // prebere izbrano številko PateID // Izbere težo iz izbrane vrstice s številko vrstice vrstica = RowNumber. ToString (); string readweight = "SELECT weight FROM patedb.patelog WHERE pateID =" + vrstica; MySqlCommand cmdweight = nov MySqlCommand (bralna teža, povezava); {connection. Open (); weightStr = (niz) cmdweight. ExecuteScalar (); //Vrvica !! povezava. Zapri (); } teža = int. Parse (weightStr); // pretvori v int txtWeight. Text = weight. ToString (); // natisni int RangeNumber = 0; če (teža> = meje [0] && teža = meje [2] && teža = meje [4] && teža <= meje [5]) {RangeNumber = 3; }} txtRange. Text = RangeNumber. ToString (); UpdateLog (); } catch (izjema ex) {MessageBox. Show (ex. Message); } QuantProduced = QuantProduced + 1; }}} private void btnStart_Click (pošiljatelj objekta, EventArgs e) {if (ProdRunning == false) {int valtest; poskusite {CustomerID = int. Parse (txtCustomerNr. Text); // preberite customerID} catch {MessageBox. Show ("Vnesite proizvodne podatke in pritisnite gumb" start "."); }

string test = "SELECT COUNT (*) FROM patedb.customertable WHERE customerID ="+CustomerID;

MySqlCommand cmdtestcustomer = nov MySqlCommand (test, povezava); {connection. Open (); valtest = Pretvori. ToInt32 (cmdtestcustomer. ExecuteScalar ()); // vrne 0, če stranka ne obstaja connection. Close (); } if (valtest == 1) // če stranka obstaja v bazi podatkov - začnite s proizvodnjo {try {OrderNr = int. Parse (txtOrderNumber. Text); ProdRunning = res; timer1. Start (); textTimer1. Text = timer1. Interval. ToString (); ReadLimits (); } catch (Izjema ex) {MessageBox. Show ("Vnesite proizvodne podatke in pritisnite gumb" start "."); }} else MessageBox. Show ("Stranka ni v bazi podatkov, poskusite znova"); } // ReadLimits (); }

zasebna praznina ReadLimits ()

{// Odčita meje iz razpona razponov, obseg 1 do 3 int števec = 0; for (int rangeNr = 1; rangeNr <4; rangeNr ++) {string readmin = "SELECT rangeMin FROM patedb.rangetable WHERE rangeNr ="+rangeNr; MySqlCommand cmdmin = nov MySqlCommand (readmin, povezava); {connection. Open (); meje [števec] = (int) cmdmin. ExecuteScalar (); števec = števec + 1; povezava. Zapri (); } // MessageBox. Show (counter. ToString ()); string readmax = "SELECT rangeMax FROM patedb.rangetable WHERE rangeNr =" + rangeNr; MySqlCommand cmdmax = nov MySqlCommand (readmax, povezava); {connection. Open (); meje [števec] = (int) cmdmax. ExecuteScalar (); števec = števec + 1; povezava. Zapri (); }} // konec za zanko}

zasebna praznina UpdateLog ()

{// UPDATE rangeNR & orderID niz Range = RangeNumber. ToString (); niz Order = OrderNr. ToString (); string update = "UPDATE patedb.patelog SET rangeNr ="+Razpon+','+"orderID ="+OrderNr+"KJE je pateID ="+Številka vrstice; MySqlCommand updatecmd = nov MySqlCommand (posodobitev, povezava); poskusite {connection. Open (); updatecmd. ExecuteNonQuery (); povezava. Zapri (); } catch (izjema ex) {MessageBox. Show (ex. Message); }}

private void btnStop_Click (pošiljatelj objekta, EventArgs e)

{if (ProdRunning == true) {timer1. Stop (); ProdRunning = false; UpdateOrderTable (); } else {MessageBox. Show ("Proizvodnja se še ni začela. Vnesite podatke in pritisnite gumb" start ""); }}

zasebna praznina UpdateOrderTable ()

{string insert = "INSERT INTO patedb.ordertable (orderID, orderQuant, quantProduced, comment, customerID) VALUES ('" + this.txtOrderNumber. Text + "', '" + this.txtOrderQuant. Text + "', '" + QuantProduced. ToString ()+"','"+this.txtComment. Text+"','"+this.txtCustomerNr. Text+"');"; MySqlCommand insertcmd = nov MySqlCommand (vstavi, povezava); poskusite {connection. Open (); insertcmd. ExecuteNonQuery (); povezava. Zapri (); QuantProduced = 0; } catch (izjema ex) {MessageBox. Show (ex. Message); }}

zasebni časovnik praznine1_Tick (pošiljatelj objekta, EventArgs e)

{CheckTableForNull (); load_table (); }

private void btnShowOrderTable_Click (pošiljatelj objekta, EventArgs e)

{if (ProdRunning == false) {MySqlCommand ukaz = nov MySqlCommand ("SELECT * FROM patedb.ordertable ORDER BY orderID DESC;", povezava); poskusite {adapter MySqlDataAdapter = nov MySqlDataAdapter (); adapter. SelectCommand = ukaz; DataTable dbdataset = nova podatkovna tabela (); adapter. Fill (dbdataset); BindingSource bsource = nov BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Update (dbdataset); } catch (izjema ex) {MessageBox. Show (ex. Message); }} else {MessageBox. Show ("Pritisnite stop, če želite prikazati orderTable"); }}

private void btnShowOrderDetails_Click (pošiljatelj objekta, EventArgs e)

{if (ProdRunning == false) {string test = ("SELECT patedb.ordertable.orderID, orderQuant, quantProduced, comment, customerID FROM patedb.ordertable INNER JOIN patedb.patelog ON patedb.patelog.orderID = patedb.ordertable.orderID WHERE patedb.patelog. UID = '" + txtShowOrderDetails. Text +"' "); Ukaz MySqlCommand = nov MySqlCommand (test, povezava); poskusite {connection. Open (); Vmesnik MySqlDataAdapter = nov MySqlDataAdapter (); adapter. SelectCommand = ukaz; DataTable dbdataset = nova podatkovna tabela (); adapter. Fill (dbdataset); BindingSource bsource = nov BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Update (dbdataset); } catch (izjema ex) {MessageBox. Show (ex. Message); } povezava. Zapri (); } else {MessageBox. Show ("Pritisnite stop za ogled podrobnosti naročila"); }}

private void btnShowCustomerDetails_Click (pošiljatelj objekta, EventArgs e)

{if (ProdRunning == false) {string test = ("SELECT patedb.customertable.customerID, name, address, phone, email, rangeNr FROM patedb.customertable INNER JOIN patedb.ordertable ON patedb.ordertable.customerID = patedb.customertable. customerID WHERE patedb.ordertable.orderID = '" + txtShowCustomerDetails. Text +"' "); Ukaz MySqlCommand = nov MySqlCommand (test, povezava); poskusite {adapter MySqlDataAdapter = nov MySqlDataAdapter (); adapter. SelectCommand = ukaz; DataTable dbdataset = nova podatkovna tabela (); adapter. Fill (dbdataset); BindingSource bsource = nov BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Update (dbdataset); } catch (izjema ex) {MessageBox. Show (ex. Message); }} else {MessageBox. Show ("Pritisnite stop, če si želite ogledati podrobnosti stranke"); }}}

}

Priporočena: