Inhoudsopgave:

EAL-Industri4.0-RFID Dataopsamling naar database - Ajarnpa
EAL-Industri4.0-RFID Dataopsamling naar database - Ajarnpa

Video: EAL-Industri4.0-RFID Dataopsamling naar database - Ajarnpa

Video: EAL-Industri4.0-RFID Dataopsamling naar database - Ajarnpa
Video: TPM 2.0 Unveiled: Empowering IT Pros with Trusted Platform Module Insights 2024, Juli-
Anonim
EAL-Industri4.0-RFID Gegevensanalyse naar database
EAL-Industri4.0-RFID Gegevensanalyse naar database

Dette projekt omhandler opsamling van vægtdata, registrering van identiteter vha. RFID, achterblijvende data i en MySQL database vha. node-RED, samt fremvisning en behandling van de opsamlede data i et C# programma i form van en Windows Form Application. Vi forestiller os følgende:

Vi har en produktionslinje som producerer leverpostej i 200g foliebakker. Alle færdigbagte leverpostejer udstyres na afkøling med et RFID-tag i plasticlåget/labelen, som indeholder et unikt ID (UID = Unique Identifier, er en 32 bits kode, 8 hexadecimale karakterer) voor entydig identifikation af hver enkelt bakke leverpostej. Da færdigvægten af hver enkelt bakke leverpostej kan svinge (afhængig af råvarer, fordampning i ovn mm), en da kunderne hver har et specifikt krav færdigvægten, brugge UID tagget til at knytte hver enkelt leverpostifiek til en der lag lager leverpostejer til én specifik kunde. Kunderne er supermarkedskæder:

1. Irma. Vgten på Irmas luksus leverpostej skal holde sig inden voor +/- 5%, altså minimum 190g en maksimum 210g.

2. Bruggen. Vgten op Brugsens leverpostej skal holde sig inden voor +/- 10%, altså minimum 180g en maksimum 220g.

3. Aldi. Vgten på Aldis discount leverpostej skal holde sig inden voor +/- 15%, altså minimum 170g en maksimum 230g.

Der er således følgende sorteringer:

Bereik0: buiten bereik

Bereik1: minimaal 190g/maximaal210g

Bereik2: minimaal 180g/maximaal220g

Bereik3: minimaal 170g/maximaal230g

Stap 1: Opsamling Af-gegevens voor Vægt Samt Registratie Af UID

Opsamling Af-gegevens voor Vægt Samt Registratie Af UID
Opsamling Af-gegevens voor Vægt Samt Registratie Af UID

Tot opsamling van gegevens voor vægt, samen registreren van RFID-tags op anvendt en Arduino MEGA2560 med en RFID-RC522 reader/writer. Da vi ikke har nogen vægt, simulerer vi data for vægten med et potmeter tilsluttet en analog indgang på Arduinoen.

Følgende opstilling er anvendt:

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

RFID-RC522 is uitgerust met Arduino-boardets SPI-poort heeft een volgende stap:

SDA -> pin 53

SCK -> pin52

MOSI ->pin51

MISO->pin50

IRQ ->NC

GND ->GND

RST -> pin5

3.3V -> 3.3V

De opsamlede gegevens, voor hhv. UID og vægten, sendes på den serielle port som en komma-separeret textstreng videre til node-Red som står for den efterfølgende præsentation på et dashboard en lagring i en database.

Stap 2: Arduino-programma

I Arduino programmeert inkluderes de naar biblioteker SPI.h og MFRC522.h voor op kunne bruge RFID læseren. Ik start af programma initialiseres de anvendte variabele. Der laves en instans af MFRC522. I Setup blokken initialiseres den serielle forbindelse, SPI porten en MFRC522. Derefter scant na RFID-tags. For ikke at sende det samme UID afsted flere gange efter hinanden, er der lavet en stump kode som tjekker for dette. Nr der scannet en UID-tag, laadt willekeurige nyUID met de netop bovenste UID. Hvis-array nyUID is niet beschikbaar voor oude UID en kan geen enkele UID verzenden naar een seriele poort. Hvis nyUID en oldUID er ens, er der tale om samme UID-tag en UID'et skal negeerres. Hvis der er tale om et nyt UID, verzendt UID'et naar de serielle port samen met de laatste værdi fra den serielle port. De analoge weergave van de skaleres tot omrdet 150-250. Data stuurt som en komma-separeret tekststerkte. Sommige delen van de oude UID = nyUID, således bij koden klart til bij læse et nyt RFID-tag. Funktionen returnerer true hvis array'ne er ens, en false hvis array'ne er forskellige.

#erbij betrekken

#include // Dit programma scant RFID-kaarten met behulp van het RDIF-RC522-lezer/schrijver-bord. // UID wordt gelezen, een analoge pin wordt gelezen. Analoge waarde 0-1023 wordt geschaald naar 150-250. // UID en analoge waarde worden verzonden als door komma's gescheiden tekst op seriële poort met behulp van 9600, N, 8, 1. // Er is voor gezorgd dat elke UID slechts één keer achter elkaar wordt verzonden, // een nieuwe UID moet worden aanwezig zijn voordat dezelfde UID opnieuw kan worden verzonden. // Deze functie is geïmplementeerd in de code door arrays te vergelijken: oldUIDnyUID in functie 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 oudeUID[4] = {}; byte nyUID[4] = {};

MFRC522 mfrc522(SS_PIN, RST_PIN); // Maak een MFRC522-instantie.

ongeldige setup()

{ Serieel.begin(9600); // Start een seriële communicatie SPI.begin(); // Start SPI-bus mfrc522. PCD_Init(); // Start MFRC522}

lege lus()

{ // Zoek naar nieuwe kaarten if (! mfrc522. PICC_IsNewCardPresent()) { return; } // Selecteer een van de kaarten als (! mfrc522. PICC_ReadCardSerial()) { return; } // laad nyUID met UID-tag voor (byte i = 0; i <mfrc522.uid.size; i++) {nyUID = mfrc522.uid.uidByte; } // if oldUID nyUID if (!array_cmp(oldUID, nyUID)) { // stuur UID-tag op seriële poort voor (byte i = 0; i 1000) { Value = 1000; } Waarde = (Waarde/10) + 150; // stuur geschaalde analoge waarde Serial.print (Value); // stuur nieuwe regel Serial.println (); //set oldUID = nyUID voor (byte z = 0; z < 4; z++) oldUID [z] = nyUID [z]; } // wacht 1 sec vertraging (1000); }

// vergelijk 2 arrays…

boolean array_cmp(byte a, byte b) { bool test = true; // test elk element om hetzelfde te zijn. als er maar één niet is, retourneer dan false voor (byte n = 0; n < 4; n++) { if (a[n] != b[n]) test = false; // als op byte niet gelijk is, test = false } if (test == true) return true; anders vals retourneren; }

Stap 3: Node-RED, achterblijvende gegevens I-database

Node-RED, Achterblijvende Af Data I-database
Node-RED, Achterblijvende Af Data I-database
Node-RED, Achterblijvende Af Data I-database
Node-RED, Achterblijvende Af Data I-database

Følgende flow er lavet i node-RED:

COM4 er den serielle forbindelse hvor data modtages fra Arduino boardet. Functies "Split and Get value" en "Split and Get UID" splitter teksstrengen ved kommaet en returnere hhv vægten en UID. Bekijk brugge til fremvisning på dashboardet i et linechart og en scale. UID fremviseert en tekstvilt. Funktionen test_sound advarer verbalt med sætningen "Buiten bereik", hvis vægten er onder 170g of meer dan 230g, dvs i bereik 0.

Splitsen en waarde ophalen:

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

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

Splitsen en UID krijgen:

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

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

test_geluid:

var nummer = parseInt(msg.payload);

if (getal>230 ||getal<170) { newMsg = {payload:"Buiten bereik"}; retourneer nieuweMsg; } else { newMsg = {payload:""}; retourneer nieuweMsg; }

Functies Split string ", " indsætter en timestamp, UID en vægten in en database patedb.patelog.

var output = msg.payload.split(", "); //split msg.payload door komma in array

UIDtag = uitvoer [0]; // eerste deel in eerste positie [0] ValueTag = output [1]; // tweede deel naar tweede positie [1]

var m = {

topic: "INSERT INTO patedb.patelog (tijdstempel, UID, gewicht) VALUES('"+new Date().toISOString()+"', '"+ UIDtag +"', '"+ValueTag+"');" }; retour m;

patelog er nl MySQL database forbindelse some er zat op me følgende parameter:

Host: localhost

Poort: 3306

Gebruiker:root

Database: patedb

Stap 4: Database-ontwerp

Database-ontwerp
Database-ontwerp

Databasen patedb indeholder 4 tabeller

patelog er dataopsamlingstabellen, tilskrives data af node-RED en C# programmat

besteltabel en tabel enkele indeholder data om de genemførte order, tilskrives data van C# programt

klantentabel er et kunderegister

rangetable er en tabel som indeholder grænseværdierne voor de i C# programmat benyttede bereiken.

Stap 5: Patelog

Patelog
Patelog

Tabellen patelog indeholder folgende 6 kolonner:

pateID (int) er primaire sleutel en inkrementeres automatisk.

Tijdstempel, UID & vægt er af typen varchar (med forskellig max længde)

rangeNr er af typen tinyint (beregnes og tilføjes van C# programt)

orderID er af typen int (orderID tilføjes van C# programmat)

Node-RED tilføjer ikke værdier til kolonnerne rangeNr en orderID. rangeNr en orderID tillader NULL værdier, det bruges i C# programt til at detektere de rækker som skal tilskrives værdier for rangeNr en orderID

Stap 6: Besteltabel

Besteltabel
Besteltabel

besteltabel indeholder 5 kolonner:

orderID (int) er det aktuelle ordernummer

orderQuant (mediumint) er ordens pålydende antal

quantProduced (mediumint) er antal der rent faktisk er produceret på ordren. (Tlles af C# programmat)

commentaar (tinytext) er en eventueel kommentar til ordren.

klant-ID (int) er det aktuelle kundenummer på ordren.

Stap 7: Klantentabel

Klantentafel
Klantentafel

klantentabel indeholder 6 kolonner:

customerID (int) er primaire sleutel en auto inc.

naam, adres, telefoon, e-mail (varchar) med forskellig max længde

bereikNr (int)

Stap 8: Rangetable

Afstandstabel
Afstandstabel

rangetable indeholder 3 kolonner:

rangeNr (int) er primaire sleutel en auto inc.

bereikMin (int)

bereikMax (int)

Stap 9: C#-programma

C#-programma
C#-programma

Nr der producers en ordre leverpostej, er proceduren følgende:

Kundenummer, ordernummer, ordreantal en eventueel kommentar indtastes i C# programmet på et transportbånd) Samhørende værdier af UID en den aktuelle vægt verzendt serielt til node-RED, sommige viser de opsamlede data på dashboard 'et. Samtidig skrives timestamp, UID en vægt i en ny række i patedb.pålog tov. tidspunkt ikke tilskrives værdier til rangeNr en orderID vil de have værdien NULL.

Med et timerinterval undersøger C# programt patedb.patelogtabellen voor nieuwe tilkomne rækker me NULL værdier i rangeNr kolonnen. Nr der er detekteret en række med NULL værdi, beregnes rangeNr en det tilføjes samen met de aktuelle orderID. Når en order er produceret, afsluttes ordren ved tryk på”stop”- knappen. Nr ordren afsluttes, tilføjes en række til patedb.ordertable med de aktuelle ordredata. Nr en ordre er afsluttet, kan de opsamlede data en patelog tabellen fremvises ved at trykke op de forskellige knapper en gruppen Update DataGridview. besteltabel kan også vises, en der kan søges orderdata på individuele UID'er eller kundedata på individuele order.

met behulp van System;met behulp van System. Collections. Generic; met behulp van System. ComponentModel; met behulp van systeemgegevens; met behulp van System. Drawing; 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 gedeeltelijke klasse Form1: Form { MySqlConnection-verbinding = nieuwe MySqlConnection ("datasource=localhost; gebruikersnaam=root; wachtwoord=''"); int Rijnummer = 0; // Variabele voor het opslaan van pateID-waarde int RangeNumber = 0; // Variabele voor het opslaan van bereiknummer int weight = 0; // Variabele voor het opslaan van het gewicht int OrderNr = 0; // Variabele voor het opslaan van OrderNR int QuantProduced = 0; // Variabele voor het opslaan van geproduceerde hoeveelheid int NumberOfRows = 0; // aantal rijen met nulls.. bool ProdRunning = false; //Variabele die aangeeft of de start- en stopknoppen zijn geactiveerd int limits = new int[6];// initialize array int CustomerID; // Variabele voor het opslaan van customerID public Form1() { InitializeComponent(); load_table(); // bel load_table }

void load_table()

{ MySqlCommand-opdracht = nieuwe MySqlCommand ("SELECT * FROM patedb.patelog ORDER BY timestamp DESC;", verbinding); probeer { MySqlDataAdapter-adapter = nieuwe MySqlDataAdapter(); adapter. SelectCommand = opdracht; DataTable dbdataset = nieuwe DataTable(); adapter. Fill (dbdataset); BindingSource bsource = nieuwe BindingSource(); bsource. DataSource = dbdataset; dataGridView1. DataSource = bron; SetRijOrder(); adapter. Update(dbdataset); } catch (uitzondering ex) { MessageBox. Show (ex. Message); } }

privé leegte SetRowOrder()

{ dataGridView1. Columns ["pateID"]. DisplayIndex = 0; // Haar kan worden gevonden door kolonner en dataGridView1. Columns["timestamp"]. DisplayIndex = 1; // Haar kan worden gevonden door kolonner en dataGridView1. Columns["UID"]. DisplayIndex = 2; // Haar kan rækkefølgen door kolonner ændres dataGridView1. Columns["weight"]. DisplayIndex = 3; // Haar kan worden gevonden door kolonner en dataGridView1. Columns["rangeNr"]. DisplayIndex = 4; // Haar kan worden gevonden door kolonner en dataGridView1. Columns["orderID"]. DisplayIndex = 5; // Haar kan rækkefølgen door kolonner ændres }

private void GetData_Click (objectafzender, EventArgs e) // Leest databasetabel en bestellingen op tijdstempel

{ load_table(); }

private void btnRefreshUID_Click (objectafzender, EventArgs e) //

{ string timeStr = "SELECTEER * VAN patedb.patelog BESTELLEN DOOR UID;"; MySqlCommand-opdracht = nieuwe MySqlCommand (timeStr, verbinding); probeer { MySqlDataAdapter-adapter = nieuwe MySqlDataAdapter(); adapter. SelectCommand = opdracht; DataTable dbdataset = nieuwe DataTable(); adapter. Fill (dbdataset); BindingSource bsource = nieuwe BindingSource(); bsource. DataSource = dbdataset; dataGridView1. DataSource = bron; SetRijvolgorde(); adapter. Update(dbdataset); } catch (uitzondering ex) { MessageBox. Show (ex. Message); } }

private void btnRefreshValue_Click (objectafzender, EventArgs e)

{ string weightSort = "SELECTEER * VAN patedb.patelog ORDER DOOR CAST (gewicht ALS ONDERTEKEND INTEGER);"; MySqlCommand-opdracht = nieuw MySqlCommand (weightSort, verbinding); probeer { MySqlDataAdapter-adapter = nieuwe MySqlDataAdapter(); adapter. SelectCommand = opdracht; DataTable dbdataset = nieuwe DataTable(); adapter. Fill (dbdataset); BindingSource bsource = nieuwe BindingSource(); bsource. DataSource = dbdataset; dataGridView1. DataSource = bron; SetRijvolgorde(); adapter. Update(dbdataset); } catch (uitzondering ex) { MessageBox. Show (ex. Message); } }

private void ChkNullBtn_Click (objectafzender, EventArgs e)

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

privé ongeldig CheckTableForNull()

{ //Controleer/stel timerinterval minimaal 100 ms int i; int. TryParse(textTimer1. Text, uit i); if (i <100) { timer1. Stop(); ik = 100; timer1. Interval = ik; MessageBox. Show("Minimumwaarde i 100mS"); timer1. Start(); } else { timer1. Interval = i; } textTimer1. Text = timer1. Interval. ToString(); //Controleer of er rijen met null beschikbaar zijn in de tabel, retourneert het aantal rijen in de variabele: NumberOfRows string weightStr = ""; string chkNull = "SELECT COUNT(*) FROM patedb.patelog WAAR rangeNR NULL IS ORDER DOOR pateID LIMIT 1;"; MySqlCommand-opdracht = nieuwe MySqlCommand (chkNull, verbinding); probeer { verbinding. Open(); NumberOfRows = Convert. ToInt32(command. ExecuteScalar()); verbinding. Sluiten(); } catch (uitzondering ex) { MessageBox. Show (ex. Message); } eindelijk {if (NumberOfRows!= 0) {try {//Selecteert het laagste pateID-nummer waarbij rangeNr NULL is string readID = "SELECT pateID FROM patedb.patelog WAAR rangeNR NULL IS ORDER DOOR pateID ASC LIMIT 1;"; MySqlCommand cmdID = nieuwe MySqlCommand (readID, verbinding); { verbinding. Open(); Rijnummer = (int)cmdID. ExecuteScalar(); //geheel getal!! verbinding. Sluiten(); } listPateID. Text = RowNumber. ToString(); // lees het geselecteerde PateID-nummer uit // Selecteert het gewicht uit het geselecteerde rijnummer string rij = RowNumber. ToString(); string readweight = "SELECT weight FROM patedb.patelog WHERE pateID=" + rij; MySqlCommand cmdweight = nieuw MySqlCommand (leesgewicht, verbinding); { verbinding. Open(); weightStr = (string)cmdweight. ExecuteScalar(); //Snaar !! verbinding. Sluiten(); } gewicht = int. Parse(weightStr); // converteren naar int txtWeight. Text = weight. ToString(); // print int RangeNumber = 0; if (gewicht>= limieten[0] && gewicht = limieten[2] && gewicht = limieten[4] && gewicht <= limieten[5]) { RangeNumber = 3; } } txtRange. Text = RangeNumber. ToString(); UpdateLog(); } catch (uitzondering ex) { MessageBox. Show (ex. Message); } QuantProduced = QuantProduced + 1; } } } private void btnStart_Click (object afzender, EventArgs e) {if (ProdRunning == false) {int valtest; probeer { CustomerID = int. Parse(txtCustomerNr. Text); //lees klant-ID } catch { MessageBox. Show ("Voer productiegegevens in en druk op de 'start'-knop."); }

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

MySqlCommand cmdtestcustomer = nieuw MySqlCommand (test, verbinding); { verbinding. Open(); valtest = Convert. ToInt32(cmdtestcustomer. ExecuteScalar()); // retourneert 0 als de klant niet bestaat connection. Close(); } if (valtest==1) // als de klant in de database bestaat - start de productie { probeer { OrderNr = int. Parse(txtOrderNumber. Text); ProdRunning = waar; timer1. Start(); textTimer1. Text = timer1. Interval. ToString(); Leeslimieten(); } catch (uitzondering ex) { MessageBox. Show("Voer productiegegevens in en druk op de 'start'-knop."); } } else MessageBox. Show("Klant niet in database, probeer het opnieuw"); } //Leeslimieten(); }

privé leegte ReadLimits()

{// Leest limieten van bereiktabel, bereik 1 tot 3 int-teller = 0; for (int rangeNr = 1; rangeNr < 4; rangeNr++) { string readmin = "SELECT rangeMin FROM patedb.rangetable WHERE rangeNr=" + rangeNr; MySqlCommand cmdmin = nieuw MySqlCommand (readmin, verbinding); { verbinding. Open(); limieten[teller] = (int)cmdmin. ExecuteScalar(); teller = teller + 1; verbinding. Sluiten(); } // MessageBox. Show(counter. ToString()); string readmax = "SELECT rangeMax FROM patedb.rangetable WHERE rangeNr=" + rangeNr; MySqlCommand cmdmax = nieuw MySqlCommand (readmax, verbinding); { verbinding. Open(); limieten[teller] = (int)cmdmax. ExecuteScalar(); teller = teller + 1; verbinding. Sluiten(); } } // einde voor lus }

privé ongeldig UpdateLog()

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

private void btnStop_Click (objectafzender, EventArgs e)

{if (ProdRunning == true) { timer1. Stop(); ProdRunning = onwaar; UpdateOrdertabel(); } else { MessageBox. Show("Er is nog geen productie gestart. Voer de gegevens in en druk op de 'start'-knop"); } }

privé leegte 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 = nieuwe MySqlCommand (invoegen, verbinding); probeer { verbinding. Open(); insertcmd. ExecuteNonQuery(); verbinding. Sluiten(); QuantGeproduceerd = 0; } catch (uitzondering ex) { MessageBox. Show (ex. Message); } }

private void timer1_Tick (objectafzender, EventArgs e)

{ CheckTableForNull(); load_table(); }

private void btnShowOrderTable_Click (objectafzender, EventArgs e)

{if (ProdRunning == false) { MySqlCommand-opdracht = nieuwe MySqlCommand ("SELECT * FROM patedb.ordertable ORDER BY orderID DESC;", verbinding); probeer { MySqlDataAdapter-adapter = nieuwe MySqlDataAdapter(); adapter. SelectCommand = opdracht; DataTable dbdataset = nieuwe DataTable(); adapter. Fill (dbdataset); BindingSource bsource = nieuwe BindingSource(); bsource. DataSource = dbdataset; dataGridView1. DataSource = bron; adapter. Update(dbdataset); } catch (uitzondering ex) { MessageBox. Show (ex. Message); } } else { MessageBox. Show("Druk op stop om orderTable te bekijken"); } }

private void btnShowOrderDetails_Click (objectafzender, EventArgs e)

{if (ProdRunning == false) { string test = ("SELECT patedb.ordertable.orderID, orderQuant, quantProduced, comment, customerID FROM patedb.ordertable BINNENLANDSE JOIN patedb.patelog OP patedb.patelog.orderID= patedb.ordertable.orderID WHERE patedb.patelog. UID = '" + txtShowOrderDetails. Text + "'"); MySqlCommand-opdracht = nieuw MySqlCommand (test, verbinding); probeer { verbinding. Open(); MySqlDataAdapter-adapter = nieuwe MySqlDataAdapter(); adapter. SelectCommand = opdracht; DataTable dbdataset = nieuwe DataTable(); adapter. Fill (dbdataset); BindingSource bsource = nieuwe BindingSource(); bsource. DataSource = dbdataset; dataGridView1. DataSource = bron; adapter. Update(dbdataset); } catch (uitzondering ex) { MessageBox. Show (ex. Message); } verbinding. Sluiten(); } else { MessageBox. Show("Druk op stop om de details van de bestelling te bekijken"); } }

private void btnShowCustomerDetails_Click (objectafzender, EventArgs e)

{if (ProdRunning == false) { string test = ("SELECT patedb.customertable.customerID, naam, adres, telefoon, e-mail, rangeNr VAN patedb.customertable INNERLIJKE JOIN patedb.ordertable ON patedb.ordertable.customerID= patedb.customertable. klant-ID WAAR patedb.ordertable.orderID = '" + txtShowCustomerDetails. Text + "'"); MySqlCommand-opdracht = nieuw MySqlCommand (test, verbinding); probeer { MySqlDataAdapter-adapter = nieuwe MySqlDataAdapter(); adapter. SelectCommand = opdracht; DataTable dbdataset = nieuwe DataTable(); adapter. Fill (dbdataset); BindingSource bsource = nieuwe BindingSource(); bsource. DataSource = dbdataset; dataGridView1. DataSource = bron; adapter. Update(dbdataset); } catch (uitzondering ex) { MessageBox. Show (ex. Message); } } else { MessageBox. Show("Druk op stop om klantgegevens te bekijken"); } } }

}

Aanbevolen: