Obsah:

EAL-Industri4.0-RFID Dataopsamling do databáze: 10 kroků (s obrázky)
EAL-Industri4.0-RFID Dataopsamling do databáze: 10 kroků (s obrázky)

Video: EAL-Industri4.0-RFID Dataopsamling do databáze: 10 kroků (s obrázky)

Video: EAL-Industri4.0-RFID Dataopsamling do databáze: 10 kroků (s obrázky)
Video: Промышленная автоматизация, Индустрия 40 и «умные» заводы 2024, Červenec
Anonim
EAL-Industri4.0-RFID Dataopsamling do databáze
EAL-Industri4.0-RFID Dataopsamling do databáze

Dette projekt omhandler opsamling af vægtdata, registrating af identiteter vha. RFID, ukládání dat do databáze MySQL vha. uzel-ČERVENÝ, sledování a manipulace s daty v aplikaci a v C# programu ve Windows Form Application. Podívejte se na následující:

Více informací o výrobcích a produktech s 200g foliebakker. Všechny typy páskových tiskáren se mohou dále zobrazovat na etiketách RFID a plastových štítcích, kde jsou nezávislé a mají jedinečné ID (UID = Unique Identifier, více než 32 bitů, 8 hexadecimálních znaků) pro identifikaci všech dat, které jsou uloženy v paměti. Více informací o tom, jak rychle se vám to povede (o tom, o kolik se točí, mm), og da kunderne hver har et specifikt krav færdigvægten, bruges UID tagget til at knytte hver enkelt leverpostej t la en specifik la leverpostejer til én specifik kunde. Kunderne er supermarkedskæder:

1. Irma. Více než Irsko luksus pákový příspěvek na skalách má velkou indikaci pro +/- 5%, altså minimum 190g og maksimum 210g.

2. Brugsen. Váha se pohybuje od +/- 10%do minimální hmotnosti 180 g nebo do 220 g.

3. Aldi. Více na slevu Aldis získáte na +/- 15%, minimálně 170 g a minimálně 230 g.

Der er således følgende sorteringer:

Rozsah 0: mimo rozsah

Rozsah 1: minimálně 190 g/maximum 210 g

Rozsah 2: minimálně 180 g/maximum 220 g

Rozsah 3: minimálně 170 g/maximum 230 g

Krok 1: Převzorkování dat Af pro Vægt Samt Registrace Af UID

Opsamling Af Data pro Vægt Samt Registrace Af UID
Opsamling Af Data pro Vægt Samt Registrace Af UID

Dokud nepřeberete více dat pro více záznamů, nezaregistrujete RFID tagy, můžete si přečíst Arduino MEGA2560 s čtečkou/zapisovačem RFID-RC522. Vícenásobně více dat, simulerer dat pro více informací o potenciometrech a analogových údajích pro Arduinoen.

Další informace:

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

RFID-RC522 s podporou rozhraní Arduino s SPI portem pro následující oblasti:

SDA -> kolík 53

SCK -> pin52

MOSI -> pin51

MISO-> pin50

IRQ -> NC

GND -> GND

RST -> pin5

3,3 V -> 3,3 V.

Odblokovat data pro hhv. UID může odesílat, odesílat a odesílat více portů do více oddělených tekststrengů, což znamená, že uzel je červený pro zobrazení další části na palubní desce a palubní desce a lagování v databázi.

Krok 2: Program Arduino

I Arduino programmet inkare from to biblioteker SPI.h og MFRC522.h for at kunne bruge RFID læseren. Začínám s programovou inicializací proměnné anvendte. Odchylky od MFRC522. Nastavil jsem blokování inicializátorů řady sériových portů, portů SPI a MFRC522. Další skenování po tagech RFID. Pokud si přejete odeslat více informací o UID, vyberte si některou z následujících kategorií, abyste mohli zadat další kód. Další vyhledávací síť a UID tag, načte arary nyUID med det netop læste UID. HVÍCÍ pole nyUID je staré ze starého UID a jeho příběh je více než jeden UID, který může odesílat na více portů. Hvis nyUID og oldUID er ens, er der story om samme UID tag og UID'et skal ignoreres. Podívejte se na další informace o UID, odešlete UID'et på den serielle port sammen med en læst værdi fra den serielle port. Denně můžete mít více než 150–250. Odesílání dat probíhá v komma-separeret tekststreng. Některé typy dat oldUID = nyUID, které jsou k dispozici pro více než jednu značku RFID.. Další funkce a programové funkce fungují společně se 2 řadami. Funktionen returnerer true hvis array'ne er ens, og false hvis array'ne er forskellige.

#zahrnout

#include // Tento program skenuje karty RFID pomocí čtecí/zapisovací desky RDIF-RC522. // Čte se UID, čte se analogový pin. Analogová hodnota 0-1023 je škálována na 150-250. // UID a analogová hodnota je odesílána jako text oddělený čárkami na sériovém portu pomocí 9600, N, 8, 1. // Bylo věnováno pozornost odeslání každého UID pouze jednou za sebou, // nové UID musí být přítomen, než bude možné znovu odeslat stejné UID. // Tato funkce je implementována v kódu porovnáním polí: oldUID nyUID ve funkci array_cmp (oldUID , nyUID )

constexpr uint8_t RST_PIN = 5;

constexpr uint8_t SS_PIN = 53; int senzorPin = A0; int Hodnota = 0; Řetězec StringValue = "0000"; byte oldUID [4] = {}; byte nyUID [4] = {};

MFRC522 mfrc522 (SS_PIN, RST_PIN); // Vytvoření instance MFRC522.

neplatné nastavení ()

{Serial.begin (9600); // Zahájení sériové komunikace SPI.begin (); // Spuštění sběrnice SPI mfrc522. PCD_Init (); // Zahájení MFRC522}

prázdná smyčka ()

{// Hledejte nové karty if (! Mfrc522. PICC_IsNewCardPresent ()) {return; } // Vyberte jednu z karet if (! Mfrc522. PICC_ReadCardSerial ()) {return; } // načíst nyUID tagem UID pro (byte i = 0; i <mfrc522.uid.size; i ++) {nyUID = mfrc522.uid.uidByte ; } // if oldUID nyUID if (! array_cmp (oldUID, nyUID)) {// odeslání značky UID na sériový port pro (byte i = 0; i 1000) {hodnota = 1000; } Hodnota = (hodnota / 10) + 150; // odeslat zmenšenou analogovou hodnotu Serial.print (hodnota); // poslat nový řádek Serial.println (); // set oldUID = nyUID for (byte z = 0; z <4; z ++) oldUID [z] = nyUID [z]; } // čekat 1 s zpoždění (1000); }

// porovnání 2 polí …

boolean array_cmp (byte a , byte b ) {bool test = true; // otestujte každý prvek, aby byl stejný. pokud jen jedna není, vraťte false pro (byte n = 0; n <4; n ++) {if (a [n]! = b [n]) test = false; // pokud se v bajtu nerovná, test = false} if (test == true) return true; else return false; }

Krok 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

Følgende flow er lavet i node-RED:

COM4 má více sérií zakázaných datových úprav z desek Arduino. Funktionerne "Rozdělit a získat hodnotu" og "Rozdělit a získat UID" rozdělovač teksstrengen ved kommaet og returnere hhv vægten og UID. Některé bruggy se dají sledovat na palubní desce a v měřítku. UID fremvises i et tekstfelt. Funktionen test_sound advarer verbalt medcal s "Out of range", hvis vægten er under 170g eller over 230g, dvs i range 0.

Rozdělit a získat hodnotu:

var výstup = msg.payload.split (',');

temp = {užitečné zatížení: (výstup [1])}; teplota návratu;

Rozdělit a získat UID:

var výstup = msg.payload.split (",");

temp = {užitečné zatížení: výstup [0]}; teplota návratu;

test_sound:

číslo varu = parseInt (msg.payload);

if (number> 230 || number <170) {newMsg = {payload: "Out of range"}; vrátit newMsg; } else {newMsg = {payload: ""}; vrátit newMsg; }

Funkce Rozdělit řetězec "," indsætter et timestamp, UID og vægten i en database patedb.patelog.

var výstup = msg.payload.split (","); // rozdělit msg.payload čárkou do pole

UIDTag = výstup [0]; // první část do první polohy [0] ValueTag = výstup [1]; // druhá část do druhé polohy [1]

var m = {

téma: "INSERT INTO patedb.patelog (timestamp, UID, weight) VALUES ('"+new Date (). toISOString ()+"', '"+UIDTag+"', '"+ValueTag+"');" }; návrat m;

Patelog er en Databáze MySQL je zakázána, takže moje standardní parametry jsou:

Host: localhost

Přístav: 3306

Uživatel: root

Databáze: patedb

Krok 4: Návrh databáze

Návrh databáze
Návrh databáze

Databasen patedb indeholder 4 tabeller

patelog er dataopsamlingstabellen, tilskrives data af node-RED og C# programmet

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

zákaznický stůl a další registrace

počet tabulek, které jsou nezávislé na počtu programů de i C#, rozsahy benyttede.

Krok 5: Patelog

Patelog
Patelog

Tabelkový list nezávislých folgende 6 kolonner:

pateID (int) er primární klíč a další automatické opravy.

Časové razítko, UID a různé typy varchar

rangeNr er typ typ tinyint (beregnes ogil tilføjes af C# programmetme)

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

Node-RED tilføjer ikke værdier til kolonnerne rangeNr og orderID. rangeNr og orderID tillader NULL værdier, det bruges i C# programmet til at detetere de rækker some skal tilskrives værdier for rangeNr og orderID

Krok 6: Objednání

Možnost objednání
Možnost objednání

objednatelný nezávislý 5 kolonner:

ID objednávky (int) er det aktuelle or adrenalummer

orderQuant (mediumint) er ordens pålydende antal

quantProduced (mediumint) er antal der rent faktisk er producentet på ordren. (Programy programu C#)

komentovat (drobný text) do jakéhokoli kommentáře do nebo adren.

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

Krok 7: Zákazník

Zákazník
Zákazník

zákazníkem nezávislý 6 kolonner:

customerID (int) er primární klíč og auto inc.

jméno, adresa, telefon, e -mail (varchar) s maximální dostupností

rangeNr (int)

Krok 8: Rangetable

Rangetable
Rangetable

nepřekonatelný podíl na trhu 3 kolonner:

rangeNr (int) er primární klíč og auto inc.

rangeMin (int)

rozsah Max (int)

Krok 9: Program C#

Program C#
Program C#

Další výrobci, kteří používají tyto postupy, například:

Kundenummer, or adrenummer, ordreantal and orduental commentar indtastes i C# programme (i praksis overføres det digitalt from virksomhedens ordresystem. Produktionen startes no ved tryk på 'start'- knappen. på et transportbånd) Samhørende více informací o UID og den aktuelle vægt sendes serielt til node-RED, some viser de opsamlede data på dashboard 'et. Samtidig skrives timestamp, UID og vægt i en ny række i patedb.patelog tabelen. tidspunkt ikke tilskrives værdier til rangeNr og orderID vil de have værdien NULL.

Střední a časovaný interval pod C# programový program patedb.patelogtabellen for nye tilkomne rækker med NULL værdier i rangeNr kolonnen. Nainstalujte si další detektor s NULL værdi, beregnes rangeNr og det tilføjes sammen med det aktueal orderID. Producenti, producenti nebo fanoušci se mohou pokusit zastavit „stop“- knappen. Naleznete zde více než jednu možnost, než si ji můžete objednat. Další informace naleznete v tabulce, která může obsahovat další údaje a protokoly tabulek, které se budou zobrazovat při aktualizaci nástroje pro skellige a také aktualizovat DataGridview. objednatelné víka s možností objednání, další možnosti pro jednotlivce nebo jednotlivá použití.

pomocí System; using System. Collections. Generic; pomocí System. ComponentModel; pomocí System. Data; pomocí System. Drawing; pomocí System. Linq; pomocí System. Text; pomocí System. Threading. Tasks; pomocí System. Windows. Forms; pomocí MySql. Data. MySqlClient;

obor názvů show_data_from_database

{public partial class Form1: Form {MySqlConnection connection = new MySqlConnection ("datasource = localhost; username = root; password = ''"); int Číslo řádku = 0; // Proměnná pro ukládání hodnoty pateID int RangeNumber = 0; // Proměnná pro ukládání čísel rangen int weight = 0; // Proměnná pro uložení váhy int OrderNr = 0; // Proměnná pro ukládání OrderNR int QuantProduced = 0; // Proměnná pro skladování vyrobeného množství int NumberOfRows = 0; // počet řádků s null.. bool ProdRunning = false; // Proměnná indikující, zda byla aktivována tlačítka start & stop int limity = nový int [6]; // inicializace pole int CustomerID; // Proměnná pro ukládání customerID public Form1 () {InitializeComponent (); load_table (); // volání load_table}

neplatné load_table ()

{MySqlCommand command = new MySqlCommand ("SELECT * FROM patedb.patelog ORDER BY timestamp DESC;", connection); zkusit {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = příkaz; DataTable dbdataset = nový DataTable (); adapter. Fill (dbdataset); BindingSource bsource = nový BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }}

soukromá prázdnota SetRowOrder ()

{dataGridView1. Columns ["pateID"]. DisplayIndex = 0; // Její informace o kolonerech dataGridView1. Columns ["timestamp"]. DisplayIndex = 1; // Její informace o kolonerech dataGridView1. Columns ["UID"]. DisplayIndex = 2; // Její informace o kolonerech dataGridView1. Columns ["weight"]. DisplayIndex = 3; // Její hlavní informace o kolonerech dataGridView1. Columns ["rangeNr"]. DisplayIndex = 4; // Její informace o kolonerech dataGridView1. Columns ["orderID"]. DisplayIndex = 5; // Její hlavní informace o kolonner ændres}

private void GetData_Click (odesílatel objektů, EventArgs e) // Čte tabulku databáze a objednávky podle časového razítka

{load_table (); }

private void btnRefreshUID_Click (odesílatel objektů, EventArgs e) //

{string timeStr = "SELECT * FROM patedb.patelog OBJEDNÁVKA PODLE UID;"; Příkaz MySqlCommand = nový MySqlCommand (timeStr, připojení); zkusit {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = příkaz; DataTable dbdataset = nový DataTable (); adapter. Fill (dbdataset); BindingSource bsource = nový BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }}

private void btnRefreshValue_Click (odesílatel objektů, EventArgs e)

{string weightSort = "SELECT * FROM patedb.patelog OBJEDNÁVKA PODLE VLOŽENÍ (hmotnost JAKO PODPIS INTEGER);"; Příkaz MySqlCommand = nový MySqlCommand (weightSort, připojení); zkusit {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = příkaz; DataTable dbdataset = nový DataTable (); adapter. Fill (dbdataset); BindingSource bsource = nový BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }}

private void ChkNullBtn_Click (odesílatel objektů, EventArgs e)

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

soukromé prázdné CheckTableForNull ()

{// Kontrola/nastavení intervalu časovače minimálně 100 ms int i; int. TryParse (textTimer1. Text, out i); if (i <100) {timer1. Stop (); i = 100; časovač 1. Interval = i; MessageBox. Show („Minimální hodnota i 100 mS“); časovač 1. Start (); } else {timer1. Interval = i; } textTimer1. Text = timer1. Interval. ToString (); // Zkontrolujte, zda jsou v tabulce k dispozici řádky s hodnotou null, vrací počet řádků v proměnné: NumberOfRows string weightStr = ""; řetězec chkNull = "VYBERTE COUNT (*) Z patedb.patelog KDE JE rangeNR NULL OBJEDNÁVKA PODLE PateID LIMIT 1;"; Příkaz MySqlCommand = nový MySqlCommand (chkNull, připojení); zkuste {connection. Open (); NumberOfRows = Convert. ToInt32 (command. ExecuteScalar ()); připojení. Zavřít (); } catch (Exception ex) {MessageBox. Show (ex. Message); } konečně {if (NumberOfRows! = 0) {try {// Vybere nejnižší číslo pateID, kde rangeNr je NULL řetězec readID = "VYBRAT pateID FROM patedb.patelog KDE JE rangeNR NULL OBJEDNÁVKA podle pateID ASC LIMIT 1;"; MySqlCommand cmdID = nový MySqlCommand (ID pro čtení, připojení); {connection. Open (); Číslo řádku = (int) cmdID. ExecuteScalar (); //celé číslo!! připojení. Zavřít (); } listPateID. Text = RowNumber. ToString (); // přečtení vybraného čísla PateID // vybere váhu z vybraného řádku řetězce přečíslovaného = RowNumber. ToString (); string readweight = "VYBRAT váhu Z patedb.patelog WHERE pateID =" + řádek; MySqlCommand cmdweight = nový MySqlCommand (čtení, připojení); {connection. Open (); weightStr = (řetězec) cmdweight. ExecuteScalar (); //Tětiva !! připojení. Zavřít (); } weight = int. Parse (weightStr); // převést na int txtWeight. Text = weight. ToString (); // tisk int RozsahČíslo = 0; if (weight> = limits [0] && weight = limits [2] && weight = limits [4] && weight <= limits [5]) {RangeNumber = 3; }} txtRange. Text = RangeNumber. ToString (); UpdateLog (); } catch (Exception ex) {MessageBox. Show (ex. Message); } QuantProduced = QuantProduced + 1; }}} private void btnStart_Click (odesílatel objektů, EventArgs e) {if (ProdRunning == false) {int valtest; zkuste {CustomerID = int. Parse (txtCustomerNr. Text); // číst customerID} catch {MessageBox. Show ("Zadejte produkční data a stiskněte tlačítko 'start'."); }

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

MySqlCommand cmdtestcustomer = nový MySqlCommand (test, připojení); {connection. Open (); valtest = Convert. ToInt32 (cmdtestcustomer. ExecuteScalar ()); // vrací 0, pokud zákazník neexistuje connection. Close (); } if (valtest == 1) // if customer exist in database - start production {try {OrderNr = int. Parse (txtOrderNumber. Text); ProdRunning = true; časovač 1. Start (); textTimer1. Text = timer1. Interval. ToString (); ReadLimits (); } catch (Exception ex) {MessageBox. Show ("Zadejte výrobní data a stiskněte tlačítko 'start'."); }} else MessageBox. Show ("Zákazník není v databázi, zkuste to znovu"); } // ReadLimits (); }

soukromé prázdné ReadLimits ()

{// Čte limity z dosahu, rozsah 1 až 3 int čítač = 0; for (int rangeNr = 1; rangeNr <4; rangeNr ++) {string readmin = "SELECT rangeMin FROM patedb.rangetable WHERE rangeNr ="+rangeNr; MySqlCommand cmdmin = nový MySqlCommand (readmin, připojení); {connection. Open (); limity [čítač] = (int) cmdmin. ExecuteScalar (); čítač = čítač + 1; připojení. Zavřít (); } // MessageBox. Show (counter. ToString ()); řetězec readmax = "SELECT rangeMax FROM patedb.rangetable WHERE rangeNr =" + rangeNr; MySqlCommand cmdmax = nový MySqlCommand (readmax, připojení); {connection. Open (); limity [čítač] = (int) cmdmax. ExecuteScalar (); čítač = čítač + 1; připojení. Zavřít (); }} // konec smyčky}

private void UpdateLog ()

{// UPDATE rangeNR & orderID string Range = RangeNumber. ToString (); řetězec Order = OrderNr. ToString (); aktualizace řetězce = "UPDATE patedb.patelog SET rangeNr ="+Range+','+"orderID ="+OrderNr+"WHERE pateID ="+RowNumber; MySqlCommand updatecmd = nový MySqlCommand (aktualizace, připojení); zkuste {connection. Open (); updatecmd. ExecuteNonQuery (); připojení. Zavřít (); } catch (Exception ex) {MessageBox. Show (ex. Message); }}

private void btnStop_Click (odesílatel objektů, EventArgs e)

{if (ProdRunning == true) {timer1. Stop (); ProdRunning = false; UpdateOrderTable (); } else {MessageBox. Show ( Ještě nebyla zahájena výroba. Zadejte data a stiskněte tlačítko 'start'); }}

soukromé neplatné 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 (vložení, připojení); zkuste {connection. Open (); vložte cmd. ExecuteNonQuery (); připojení. Zavřít (); QuantProduced = 0; } catch (Exception ex) {MessageBox. Show (ex. Message); }}

private void timer1_Tick (odesílatel objektů, EventArgs e)

{CheckTableForNull (); load_table (); }

private void btnShowOrderTable_Click (odesílatel objektů, EventArgs e)

{if (ProdRunning == false) {MySqlCommand command = new MySqlCommand ("SELECT * FROM patedb.ordertable ORDER BY orderID DESC;", connection); zkusit {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = příkaz; DataTable dbdataset = nový DataTable (); adapter. Fill (dbdataset); BindingSource bsource = nový BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }} else {MessageBox. Show ("Stisknutím stop zastavte tabulku orderTable"); }}

private void btnShowOrderDetails_Click (odesílatel objektů, 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 +"' "); Příkaz MySqlCommand = nový MySqlCommand (test, připojení); zkuste {connection. Open (); Adaptér MySqlDataAdapter = nový MySqlDataAdapter (); adapter. SelectCommand = příkaz; DataTable dbdataset = nový DataTable (); adapter. Fill (dbdataset); BindingSource bsource = nový BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); } připojení. Zavřít (); } else {MessageBox. Show ("Stisknutím stop zobrazíte podrobnosti objednávky"); }}

private void btnShowCustomerDetails_Click (odesílatel objektů, 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 +"' "); Příkaz MySqlCommand = nový MySqlCommand (test, připojení); zkusit {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = příkaz; DataTable dbdataset = nový DataTable (); adapter. Fill (dbdataset); BindingSource bsource = nový BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }} else {MessageBox. Show ("Stisknutím tlačítka stop zobrazíte podrobnosti o zákazníkovi"); }}}

}

Doporučuje: