INHOUDSOPGAWE:

EAL-Industri4.0-RFID Dataopsamling Til databasis: 10 stappe (met foto's)
EAL-Industri4.0-RFID Dataopsamling Til databasis: 10 stappe (met foto's)

Video: EAL-Industri4.0-RFID Dataopsamling Til databasis: 10 stappe (met foto's)

Video: EAL-Industri4.0-RFID Dataopsamling Til databasis: 10 stappe (met foto's)
Video: In line with Industry 4.0 using integrated Tool Data Management Solutions 2024, Julie
Anonim
EAL-Industri4.0-RFID Dataopsamling Til Database
EAL-Industri4.0-RFID Dataopsamling Til Database

Dit projek omskakel versameling van gewigsdata, registrasie van identiteite vha. RFID, agtergeblewe data en MySQL -databasis. node-RED, en ook uitstallings en behandelings vir die opsamele data en C# -program wat ek in 'n Windows-vormtoepassing vorm. Ons Forestiller sê:

Ons het 'n produksieleiding van 200g foliebakker. Alle verskaffers vir die vervaardiging van RFID -etikette vir etikette en etikette, wat 'n unieke ID bevat (UID = Unique Identifier, het 'n 32 -bits kode, 8 heksadesimale karakters) vir elke identifikasie van elke enkele bakpost. Elke verskaffing van elke enkele hefboom wat ons kan gebruik (die kwaliteit van die grondstof, die dekking in mm), en die klante kan elke spesifieke eienskap vir u benodig, en UID -etikette kan gebruik word om elke individuele hefboom vir spesifieke voorraadlokasies te kan plaas hefboom vir een spesifieke klant. Kunderne is supermarkedskæder:

1. Irma. Vir 'n maksimum prys van +/- 5%, dus minimum 190g en maksimum 210g.

2. Brugsen. Gewig op die gebruiksaanbod moet vir +/- 10%gehou word, dus minimum 180g en maksimum 220g.

3. Aldi. Gewig op Aldis-afslag kan vir +/- 15%geldig wees, dus minimum 170g en maksimum 230g.

Daar is dus volgende sorteerders:

Bereik 0: buite bereik

Bereik 1: minimum 190g/maksimum210g

Bereik 2: minimum 180g/maksimum220g

Bereik 3: minimum 170g/maksimum 230g

Stap 1: Opsamling van data vir Vægt Samt Registrering Af UID

Opsamling Af Data for Vægt Samt Registrering Af UID
Opsamling Af Data for Vægt Samt Registrering Af UID

Om data te versamel vir die versameling en registrasie van RFID-etikette word gebruik in Arduino MEGA2560 en RFID-RC522-leser/skrywer. Ons kan nie meer 'n soortgelyke data vir die gewig van die potlood en die analoge ingang op Arduinoen gebruik nie.

Volgende opstelling is toegepas:

1 stk potmeter 25k lineært. Yder-benene er tilsluttet hhv. GND og +5V, midterbenet is tilsluttet AN0

RFID-RC522 is toegevoegde Arduino boardets SPI-poort op die volgende manier:

SDA -> pen 53

SCK -> pin52

MOSI -> pin51

MISO-> pin50

IRQ -> NC

GND -> GND

RST -> pen 5

3.3V -> 3.3V

De opsamlede data, vir hhv. UID en lêers kan op die seriële poort gestuur word as 'n komma-aparte tekststroom vir node-rooi wat vir die volgende voorstelling op die dashboard en in 'n databasis verskyn.

Stap 2: Arduino-program

Ek kan 'n program vir biblioteke SPI.h og MFRC522.h vir biblioteke insluit om RFID -lêers te gebruik. Ek begin die program vir die begin van die veranderlike. Der laves en instans by MFRC522. Ek stel blokkeerinitialiseerders vir die seriële verbinding op, SPI -portes en MFRC522. Hierna kan ons na RFID -etikette kyk. Ons kan nie dieselfde e -pos stuur nie. Wanneer daar 'n skanet en 'n UID -tag is, kan ons 'n nuwe UID met presies UID -lêers gebruik. As 'n reeks nuwe gebruikers van die ou UID inligting daaroor kan word, kan dit op die seriële poort gestuur word. As nyUID og oldUID daar is, is daar die verhaal oor dieselfde UID -tag en UID'et moet geïgnoreer word. As daar 'n verhaal oor die nuwe UID is, stuur UID'et op die seriële poort saam met die waarde van die seriële poort. Die analoge waarde moet in die omgewing 150-250 bereik word. Data stuur 'n een-komma-aparte tekststreng. Dit is die laaste stel ouUID = nyUID, dus kan die kode duidelik lees en nuut RFID -tag lees. Funksies wat terugkeer is waar as array'ne er ens, en false as array'ne is verskillende.

#insluit

#include // Hierdie program skandeer RFID-kaarte met behulp van RDIF-RC522-leser-/skrywerbord. // UID word gelees, 'n analoog pen word gelees. Analoogwaarde 0-1023 word afgeskaal tot 150-250. // UID en analoog waarde word as 'n komma-geskeide teks op die seriële poort gestuur met 9600, N, 8, 1. // Daar is sorg gedraai om elke UID net een keer in 'n ry te stuur, // 'n nuwe UID moet teenwoordig voordat dieselfde UID weer gestuur kan word. // Hierdie funksie word in die kode geïmplementeer deur skikkings te vergelyk: oldUID nyUID in function array_cmp (oldUID , nyUID )

constexpr uint8_t RST_PIN = 5;

constexpr uint8_t SS_PIN = 53; int sensorPin = A0; int Waarde = 0; String StringValue = "0000"; byte oldUID [4] = {}; byte nyUID [4] = {};

MFRC522 mfrc522 (SS_PIN, RST_PIN); // Skep MFRC522 -instansie.

leemte opstelling ()

{Serial.begin (9600); // Begin 'n reekskommunikasie SPI.begin (); // Begin SPI -bus mfrc522. PCD_Init (); // Begin MFRC522}

leemte lus ()

{// Soek nuwe kaarte as (! Mfrc522. PICC_IsNewCardPresent ()) {return; } // Kies een van die kaarte as (! Mfrc522. PICC_ReadCardSerial ()) {return; } // laai nyUID met UID -tag vir (byte i = 0; i <mfrc522.uid.size; i ++) {nyUID = mfrc522.uid.uidByte ; } // if oldUID nyUID if (! array_cmp (oldUID, nyUID)) {// stuur UID -merker op seriële poort vir (byte i = 0; i 1000) {Waarde = 1000; } Waarde = (Waarde / 10) + 150; // stuur geskale analoog waarde Serial.print (Waarde); // stuur newline Serial.println (); // stel oldUID = nyUID vir (byte z = 0; z <4; z ++) oldUID [z] = nyUID [z]; } // wag 1 sek. vertraging (1000); }

// vergelyk 2 skikkings …

boolean array_cmp (byte a , byte b ) {bool test = true; // toets dat elke element dieselfde is. as net een nie is nie, gee false terug vir (byte n = 0; n <4; n ++) {if (a [n]! = b [n]) test = false; // as op byte nie gelyk is nie, toets = vals} as (toets == waar) terugkeer waar; anders terugkeer vals; }

Stap 3: Node-RED, Lagring Af Data I Database

Node-RED, Lagring Af Data I Database
Node-RED, Lagring Af Data I Database
Node-RED, Lagring Af Data I Database
Node-RED, Lagring Af Data I Database

Volgende vloei word gemaak in node-ROOI:

COM4 is 'n seriële verbinding waar data ontvang word deur die Arduino -bord. Funksies "Split and Get value" en "Split and Get UID" splitter teksstrengers wat vir ons 'n boodskap kan stuur en terugbring na UID. U kan ook na die voorblad op die dashboard en op die skaal kyk. UID word in teks- en tekstfeltvakke voorgestel. Funksies test_sound advarer verbalt with sætningen "Out of range", as dit minder as 170g of meer as 230g, dvs in reeks 0 is.

Verdeel en kry waarde:

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

temp = {payload: (output [1])}; retoer temp;

Verdeel en kry UID:

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

temp = {payload: output [0]}; retoer temp;

toetsgeluid:

var number = parseInt (msg.payload);

if (getal> 230 || nommer <170) {newMsg = {payload: "Out of range"}; stuur newMsg terug; } anders {newMsg = {payload: ""}; stuur newMsg terug; }

Funksies Split string "," indsætter en tydstempel, UID en lêers in 'n databasis patedb.patelog.

var output = msg.payload.split (","); // verdeel ms.payload per komma in skikking

UIDTag = uitset [0]; // eerste deel in eerste posisie [0] ValueTag = uitset [1]; // tweede deel in tweede posisie [1]

var m = {

onderwerp: "INVOER IN Patedb.patelog (tydstempel, UID, gewig) WAARDES ('"+nuwe datum (). toISOString ()+"', '"+UIDTag+"', '"+ValueTag+"');" }; terugkeer m;

patelog is in MySQL databasis wat verband hou met die volgende parameters:

Gasheer: localhost

Hawe: 3306

Gebruiker: root

Databasis: patedb

Stap 4: Databasis-ontwerp

Databasis-ontwerp
Databasis-ontwerp

Die databasis bevat 4 tabelle

patelog is dataopsamlingstabellen, tilskrives data af node-RED and C# program

ordertable is 'n tabel wat gegewens bevat oor die genemeerde ordrer, om data van C# program af te laai

aanpasbare e en klantegister

rangetable is a table that contain greenseværdierne for de i C# program benyttede ranges.

Stap 5: Patelog

Patelog
Patelog

Tabelle bevat ook volgende 6 kolonne:

pateID (int) is primêre sleutel en inkrementeres automaties.

Tydstempel, UID en gewig vir verskillende variëteite (met maksimum lengte)

rangeNr is af typen tinyint (beregnings and cases of C# program)

orderID is af typen int (orderID tilføjes of C# program)

Node-ROOI kan nie waardeer word vir kolonnereeks nie en orderID. rangeNr og orderID tillader NULL waardeer, dit kan gebruik word in C# program vir die detektere van die reeks wat die waarde van die reeks vir orderNr en orderID

Stap 6: Oordraagbaar

Ordentabel
Ordentabel

ordertable bevat 5 kolonner:

orderID (int) is die huidige ordrenummer

orderQuant (mediumint) is ordens pålydende antal

quantProduced (mediumint) is 'n aantal huur wat werklik vervaardig kan word. (Telling van C# program)

comment (tinytext) is en eventuel comment to ordren.

customerID (int) is die huidige kundenummer op ordren.

Stap 7: Aanpasbare tafel

Pasgemaakte tafel
Pasgemaakte tafel

Aangepaste tafel bevat 6 kolonne:

customerID (int) er primêre sleutel en auto inc.

naam, adres, telefoon, e -pos (varchar) met forskellig max lengte

reeksNr (int)

Stap 8: Rangetable

Rangetable
Rangetable

rangetable bevat 3 kolonner:

rangeNr (int) er primêre sleutel en auto inc.

reeksMin (int)

rangeMax (int)

Stap 9: C# -program

C# -program
C# -program

Wanneer die produsente en ordre hefboom, is die volgende prosedure:

Kundenummer, ordrenummer, ordreantal and en eventuel comment enterestes in C# program (i practice overases it digitalt from enterprise ordresystem. Productions startes by try on 'start'- knappen. When en leverpostej is færdigproduceret and slot to monteret, vejes den of Arduinoen (op en transportbånd) Samevattende waardes van UID en die relevante gewig kan gestuur word na node-RED, wat die opsamelde data op die dashboard 'en' terselfdertyd tydsstempel, UID en grootte in 'n nuwe reeks in patedb.patelog-tabelle toon. Ek kan nie waarde kry vir reeksNr og orderID die waarde NULL sal hê.

Med et timerinterval undersøger C# program patedb.patelogtabellen for nye tilkomne rækker with NULL værdier i rangeNr kolonnen. Wanneer daar 'n opsporing en reeks met NULL -waarde is, bereken die reeksNr en die gevalle saam met die huidige bestellings -ID. Wanneer en ordre er produceret, afsluttes ordren ved tryk på”stop”- knappen. Wanneer ordren afsluttes, tilføjes en reeks til patedb.ordertable med de aktuelle ordredata. Wanneer 'n ordre er afsluttet, kan ek die gegewens opslaan en tabelle na vore bring om die verskillende knoppies in die groep op te dateer DataGridview. ordertable kan ook verskyn, en daar kan søges ordredata op individuele UID'er of kundedata op individuele ordrer.

met behulp van System; met behulp van System. Collections. Generic; met behulp van System. ComponentModel; met behulp van System. Data; met behulp van System. Teken; met behulp van System. Linq; met behulp van System. Text; met behulp van System. Threading. Tasks; met behulp van System. Windows. Forms; met behulp van MySql. Data. MySqlClient;

naamruimte show_data_from_database

{openbare gedeeltelike klas Vorm1: Vorm {MySqlConnection -verbinding = nuwe MySqlConnection ("datasource = localhost; gebruikersnaam = root; wagwoord = ''"); int RowNumber = 0; // Veranderlik vir die stoor van pateID -waarde int RangeNumber = 0; // Veranderlik vir die stoor van gewigstelling in gewig = 0; // Veranderlik vir die stoor van die gewig int OrderNr = 0; // Veranderlik vir die stoor van OrderNR int QuantProduced = 0; // Veranderlik vir die stoor van hoeveelheid geproduseerde int NumberOfRows = 0; // aantal rye met nulls.. bool ProdRunning = false; // Veranderlike wat aandui of start & stop knoppies geaktiveer is int limit = new int [6]; // initialiseer skikking int CustomerID; // Veranderlik vir die stoor van customerID publieke vorm1 () {InitializeComponent (); load_table (); // bel load_table}

leegte laaitabel ()

{MySqlCommand command = new MySqlCommand ("SELECT * FROM patedb.patelog ORDER BY time stamp DESC;", verbinding); probeer {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = command; DataTable dbdataset = nuwe DataTable (); adapter. Vul (dbdataset); BindingSource bsource = nuwe BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }}

private leemte SetRowOrder ()

{dataGridView1. Columns ["pateID"]. DisplayIndex = 0; // Hier kan ek 'n reeks gevolge van kolonner veranderings dataGridView1. Columns ["tydstempel"]. DisplayIndex = 1; // Hier kan ek sekuriteit vir die data verander deur dataGridView1. Columns ["UID"]. DisplayIndex = 2; // Hier kan ek sekuriteit vir die data verander deur dataGridView1. Columns ["weight"]. DisplayIndex = 3; // Hier kan ek 'n reeks gevolge van kolonner veranderings dataGridView1. Columns ["rangeNr"]. DisplayIndex = 4; // Sy kan 'n reeks sekwensies vir die verandering van dataGridView1. Columns ["orderID"]. DisplayIndex = 5; // Haar kan reeksfølgen van kolonner veranderings}

private leemte GetData_Click (voorwerp sender, EventArgs e) // Lees databasistabel en bestellings volgens tydstempel

{load_table (); }

private leemte btnRefreshUID_Click (voorwerp sender, EventArgs e) //

{string timeStr = "KIES * VAN patedb.patelog BESTEL DEUR UID;"; MySqlCommand -opdrag = nuwe MySqlCommand (timeStr, verbinding); probeer {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = command; DataTable dbdataset = nuwe DataTable (); adapter. Vul (dbdataset); BindingSource bsource = nuwe BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }}

private leemte btnRefreshValue_Click (voorwerp sender, EventArgs e)

{string weightSort = "SELECT * VAN patedb.patelog BESTEL DEUR CAST (gewig AS GETEKENE INTEGER);"; MySqlCommand -opdrag = nuwe MySqlCommand (weightSort, verbinding); probeer {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = command; DataTable dbdataset = nuwe DataTable (); adapter. Vul (dbdataset); BindingSource bsource = nuwe BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }}

private leemte ChkNullBtn_Click (voorwerp sender, EventArgs e)

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

private leemte CheckTableForNull ()

{// Check/set timerinterval minimum 100 ms int i; int. TryParse (textTimer1. Text, uit i); as (i <100) {timer1. Stop (); ek = 100; timer1. Interval = i; MessageBox. Show ("Minimum waarde i 100mS"); timer1. Start (); } anders {timer1. Interval = i; } textTimer1. Text = timer1. Interval. ToString (); // Kontroleer of enige rye met nul in die tabel beskikbaar is, die aantal rye in die veranderlike opgee: NumberOfRows string weightStr = ""; string chkNull = "KIES AANTAL (*) VANAF patedb.patelog WAAR rangeNR NULL ORDER IS BY pateID LIMIT 1;"; MySqlCommand -opdrag = nuwe MySqlCommand (chkNull, verbinding); probeer {connection. Open (); NumberOfRows = Convert. ToInt32 (command. ExecuteScalar ()); verbinding. Close (); } catch (Exception ex) {MessageBox. Show (ex. Message); } uiteindelik {if (NumberOfRows! = 0) {try {// Kies die laagste pateID -nommer waar rangeNr NULL string is readID = "SELECT pateID VANAF patedb.patelog WAAR rangeNR IS NULL ORDER BY pateID ASC LIMIT 1;"; MySqlCommand cmdID = nuwe MySqlCommand (readID, verbinding); {verbinding. Open (); RowNumber = (int) cmdID. ExecuteScalar (); //heelgetal!! verbinding. Close (); } listPateID. Text = RowNumber. ToString (); // lees die geselekteerde PateID -nommer // Kies die gewig uit die geselekteerde ry -ry string = RowNumber. ToString (); string readweight = "SELECT weight from patedb.patelog WHERE pateID =" + ry; MySqlCommand cmdweight = nuwe MySqlCommand (leesgewig, verbinding); {verbinding. Open (); weightStr = (string) cmdweight. ExecuteScalar (); // String !! verbinding. Close (); } gewig = int. Parse (weightStr); // skakel om na int txtWeight. Text = weight. ToString (); // print int RangeNumber = 0; if (gewig> = grense [0] && gewig = grense [2] && gewig = perke [4] && gewig <= grense [5]) {RangeNumber = 3; }} txtRange. Text = RangeNumber. ToString (); UpdateLog (); } catch (Exception ex) {MessageBox. Show (ex. Message); } QuantProduced = QuantProduced + 1; }}} private leemte btnStart_Click (voorwerp sender, EventArgs e) {if (ProdRunning == false) {int valtest; probeer {CustomerID = int. Parse (txtCustomerNr. Text); // lees customerID} catch {MessageBox. Show ("Voer produksiedata in en druk die 'start' -knoppie."); }

string test = "KIES TEL (*) VAN patedb.customertable WHERE customerID ="+CustomerID;

MySqlCommand cmdtestcustomer = nuwe MySqlCommand (toets, verbinding); {verbinding. Open (); valtest = Convert. ToInt32 (cmdtestcustomer. ExecuteScalar ()); // gee 0 terug as die kliënt nie 'n verbinding het nie. Close (); } if (valtest == 1) // as daar 'n kliënt in die databasis is - begin met die produksie {probeer {OrderNr = int. Parse (txtOrderNumber. Text); ProdRunning = waar; timer1. Start (); textTimer1. Text = timer1. Interval. ToString (); ReadLimits (); } catch (Exception ex) {MessageBox. Show ("Voer produksiedata in en druk die 'start' -knoppie."); }} anders MessageBox. Show ("Kliënt is nie in die databasis nie, probeer weer"); } // ReadLimits (); }

private leemte ReadLimits ()

{// Lees perke van rangetable, reeks 1 tot 3 int counter = 0; for (int rangeNr = 1; rangeNr <4; rangeNr ++) {string readmin = "SELECT rangeMin FROM patedb.rangetable WHERE rangeNr ="+rangeNr; MySqlCommand cmdmin = nuwe MySqlCommand (leesmin, verbinding); {verbinding. Open (); grense [teller] = (int) cmdmin. ExecuteScalar (); teller = teller + 1; verbinding. Close (); } // MessageBox. Show (counter. ToString ()); string readmax = "SELECT rangeMax FROM patedb.rangetable WHERE rangeNr =" + rangeNr; MySqlCommand cmdmax = nuwe MySqlCommand (leesmax, verbinding); {verbinding. Open (); grense [teller] = (int) cmdmax. ExecuteScalar (); teller = teller + 1; verbinding. Close (); }} // einde vir lus}

private leegte UpdateLog ()

{// UPDATE rangeNR & orderID string Range = RangeNumber. ToString (); string Order = OrderNr. ToString (); string update = "UPDATE patedb.patelog SET rangeNr ="+Range+','+"orderID ="+OrderNr+"WHERE pateID ="+RowNumber; MySqlCommand updatecmd = nuwe MySqlCommand (opdatering, verbinding); probeer {connection. Open (); updatecmd. ExecuteNonQuery (); verbinding. Close (); } catch (Exception ex) {MessageBox. Show (ex. Message); }}

private leemte btnStop_Click (voorwerp sender, EventArgs e)

{if (ProdRunning == true) {timer1. Stop (); ProdRunning = vals; UpdateOrderTable (); } anders {MessageBox. Show ("Nog geen produksie is begin nie. Tik data in en druk 'start' knoppie"); }}

private leegte UpdateOrderTable ()

{string insert = "INSERT INTO patedb.ordertable (orderID, orderQuant, quantProduced, comment, customerID) WAARDES ('" + this.txtOrderNumber. Text + "', '" + this.txtOrderQuant. Text + "', '" + QuantProduced. ToString ()+"','"+this.txtComment. Text+"','"+this.txtCustomerNr. Text+"');"; MySqlCommand insertcmd = nuwe MySqlCommand (invoeg, verbinding); probeer {connection. Open (); insertcmd. ExecuteNonQuery (); verbinding. Close (); QuantProduced = 0; } catch (Exception ex) {MessageBox. Show (ex. Message); }}

private leemte timer1_Tick (voorwerp sender, EventArgs e)

{CheckTableForNull (); load_table (); }

private leemte btnShowOrderTable_Click (voorwerp sender, EventArgs e)

{if (ProdRunning == false) {MySqlCommand command = new MySqlCommand ("SELECT * FROM patedb.ordertable ORDER BY orderID DESC;", verbinding); probeer {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = command; DataTable dbdataset = nuwe DataTable (); adapter. Vul (dbdataset); BindingSource bsource = nuwe BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }} anders {MessageBox. Show ("Druk stop om orderTable te sien"); }}

private leemte btnShowOrderDetails_Click (voorwerp sender, 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 WAAR patedb.patelog. UID = '" + txtShowOrderDetails. Text +"' ""); MySqlCommand -opdrag = nuwe MySqlCommand (toets, verbinding); probeer {connection. Open (); MySqlDataAdapter adapter = nuwe MySqlDataAdapter (); adapter. SelectCommand = command; DataTable dbdataset = nuwe DataTable (); adapter. Vul (dbdataset); BindingSource bsource = nuwe BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); } verbinding. Close (); } anders {MessageBox. Show ("Druk stop om bestellingsbesonderhede te sien"); }}

private leemte btnShowCustomerDetails_Click (voorwerp sender, 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 WAAR patedb.ordertable.orderID = '" + txtShowCustomerDetails. Text +"' ")); MySqlCommand -opdrag = nuwe MySqlCommand (toets, verbinding); probeer {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = command; DataTable dbdataset = nuwe DataTable (); adapter. Vul (dbdataset); BindingSource bsource = nuwe BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }} anders {MessageBox. Show ("Druk stop om kliëntbesonderhede te sien"); }}}

}

Aanbeveel: