Съдържание:

Събиране на данни от EAL-Industri4.0-RFID до база данни: 10 стъпки (със снимки)
Събиране на данни от EAL-Industri4.0-RFID до база данни: 10 стъпки (със снимки)

Видео: Събиране на данни от EAL-Industri4.0-RFID до база данни: 10 стъпки (със снимки)

Видео: Събиране на данни от EAL-Industri4.0-RFID до база данни: 10 стъпки (със снимки)
Видео: TPM 2.0 Unveiled: Empowering IT Pros with Trusted Platform Module Insights 2024, Юли
Anonim
EAL-Industri4.0-RFID Асамблиране на данни до база данни
EAL-Industri4.0-RFID Асамблиране на данни до база данни

Dette projekt omhandler opsamling af vagtdata, регистриране на identiteter vha. RFID, изоставащи данни в MySQL база данни vha. node-RED, самостоятелно отчитане и поведение при opsamlede данни в et C# програма, създадена от en Windows Form Application. Vi forestiller os følgende:

Vi har en produktionslinje som производител leverpostej и 200g foliebakker. Всички фърдигбагетни лостови удостоверения след афколинг с RFID етикет и пластмасови/етикетирани, като несъдържател на идентификатор и единен идентификатор (UID = уникален идентификатор, или 32 бита с код, 8 шестнадесетичен характерист) за идентификация на ендидиг след hver enkelt bakke leverpostej. 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 specikt krav færdigvægten, bruges UID tagget til at knytte hver enkelt leverresg leverpostej loverpostej leverpostejer til én specifick kunde. Кундерне и супермаркет:

1. Ирма. Вземете от Irmas luksus leverpostej skal holde sig inden за +/- 5%, като минимум 190g или максимум 210g.

2. Бругсен. Вземете от Brugsens леверпостей скал холдинг за +/- 10%, като минимум 180g или максимум 220g.

3. Алди. Вземете Aldis отстъпка с лост, за да задържите подписа за +/- 15%, като минимум 170 g или максимум 230 g.

Der er således følgende sorteringer:

Диапазон 0: извън обхвата

Обхват 1: минимум 190 g/максимум 210 g

Диапазон 2: минимум 180 g/максимум 220 g

Обхват 3: минимум 170 g/максимум 230 g

Стъпка 1: Оптимизиране на данни за регистрация на регистриран UID

Оптимизиране на данни за регистрация на регистрация за UID
Оптимизиране на данни за регистрация на регистрация за UID

До пълното опростяване на данни за зареждане, записване на RFID тагове, които се намират в Arduino MEGA2560 и RFID-RC522 четец/писател. Da vi ikke har nogen vægt, симулатор vi данни за vægten med et potmeter tilsluttet и аналогов ингалятор на Arduinoen.

Følgende opstilling er anvendt:

1 stk потметър 25k lineært. Yder-benene е tilsluttet hhv. GND ог +5V, междинна мрежа с напрежение AN0

RFID-RC522 е оборудван с Arduino SPI порт, за да бъде:

SDA -> пин 53

SCK -> pin52

MOSI -> pin51

MISO-> pin50

IRQ -> NC

GND -> GND

RST -> pin5

3.3V -> 3.3V

Данни за opsamlede, за hhv. UID и изтриване, изпраща се от серийния порт, като ком-разделя текстовото предаване до възел-Червеният сом, за да бъде представено на таблото за управление и да се забави в базата данни.

Стъпка 2: Arduino-програма

I Arduino програмата включва към библиотекер SPI.h и MFRC522.h за най -добрата RFID информация. Започнах с инициализацията на променливата на програмата. Der laves en instans af MFRC522. I Инсталиране на блокирани инициализации за серийни форми, SPI порта и MFRC522. Derefter сканира efter RFID тагове. За ikke at sende det samme UID afsted flere gange efter hinanden, er der lavet en stump kode som tjekker за dette. Når der er scannet и UID маркер, зарежда arary nyUID сред det netop læste UID. Hvis масив nyUID е подравнен от oldUID, който е приказен и не използва UID, така че може да се изпрати на серийния порт. Hvis nyUID или oldUID е включен, той е приказка за самия UID маркер и UID'et скал игнорира. Hvis der er tale om et nyt UID, изпраща 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. Данните се изпращат като ком-разделящи текст. Няколко странични страници са oldUID = nyUID, препращат към кодерен клас до най -малкия и най -новия RFID таг. Отстранете функционалността и програмирайте функцията като два масива. Функционални връщащи истински hvis array'ne er ens, og false hvis array'ne er forskellige.

#включва

#include // Тази програма сканира RFID карти с помощта на платка за четене/писане RDIF-RC522. // UID се чете, аналогов щифт се чете. Аналоговата стойност 0-1023 е мащабирана до 150-250. // UID и аналогова стойност се изпращат като текст, разделен със запетая на сериен порт, използвайки 9600, N, 8, 1. // Внимава се всеки UID да се изпраща само веднъж подред, // трябва да бъде нов UID присъства, преди същият UID да може да бъде изпратен отново. // Тази функция е внедрена в кода чрез сравняване на масиви: oldUID nyUID във функция array_cmp (oldUID , nyUID )

constexpr uint8_t RST_PIN = 5;

constexpr uint8_t SS_PIN = 53; int sensorPin = A0; int Стойност = 0; String StringValue = "0000"; байт oldUID [4] = {}; байт nyUID [4] = {};

MFRC522 mfrc522 (SS_PIN, RST_PIN); // Създаване на екземпляр на MFRC522.

void setup ()

{Serial.begin (9600); // Иницииране на серийна комуникация SPI.begin (); // Иницииране на SPI шина mfrc522. PCD_Init (); // Иницииране на MFRC522}

void loop ()

{// Потърсете нови карти if (! Mfrc522. PICC_IsNewCardPresent ()) {return; } // Изберете една от картите ако (! Mfrc522. PICC_ReadCardSerial ()) {return; } // зарежда nyUID с UID тагове за (байт i = 0; i <mfrc522.uid.size; i ++) {nyUID = mfrc522.uid.uidByte ; } // if oldUID nyUID if (! array_cmp (oldUID, nyUID)) {// изпращане на UID маркер на сериен порт за (байт i = 0; i 1000) {Стойност = 1000; } Стойност = (Стойност / 10) + 150; // изпраща мащабирана аналогова стойност Serial.print (Стойност); // изпращане на нов ред Serial.println (); // задаваме oldUID = nyUID за (байт z = 0; z <4; z ++) oldUID [z] = nyUID [z]; } // изчакайте 1 сек закъснение (1000); }

// сравняваме 2 масива …

булев масив_cmp (байт a , байт b ) {bool тест = вярно; // тестваме всеки елемент да бъде един и същ. ако само един не е, върнете false за (байт n = 0; n <4; n ++) {if (a [n]! = b [n]) test = false; // ако байтът не е равен, test = false} if (test == true) връща true; иначе върнете false; }

Стъпка 3: Node-RED, забавяща се база данни Data I

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 и node-RED:

COM4 е от серията, която е създала данни за модификации на данни от Arduino boardet. Функция "Разделяне и получаване на стойност" и "Разделяне и получаване на UID" сплитер за тестване и компресиране и връщане на hhv изглед и UID. Вземете bruges til fremvisning på dashboardet и et linechart og en scale. UID fremvises i et tekstfelt. Функция test_sound advarer вербален с измерване „Извън обхват“, висше под 170g или над 230g, dvs и диапазон 0.

Разделяне и получаване на стойност:

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

temp = {полезен товар: (изход [1])}; температура на връщане;

Разделяне и получаване на UID:

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

temp = {полезен товар: изход [0]}; температура на връщане;

тест_звук:

var номер = parseInt (msg.payload);

if (номер> 230 || номер <170) {newMsg = {полезен товар: "Извън обхват"}; връщане на ново съобщение; } else {newMsg = {полезен товар: ""}; връщане на ново съобщение; }

Функции Разделяне на низ "," въвеждане и времева маркировка, UID и проверка в базата данни patedb.patelog.

var output = msg.payload.split (","); // разделяме msg.payload със запетая в масив

UIDTag = изход [0]; // първа част на първа позиция [0] ValueTag = изход [1]; // втора част на втора позиция [1]

var m = {

topic: "INSERT INTO patedb.patelog (времева марка, UID, тегло) VALUES ('"+нова дата (). toISOString ()+"', '"+UIDTag+"', '"+ValueTag+"');" }; връщане m;

patelog е en bg MySQL база данни за библиографски софтуер, който се намира в междинния параметър:

Домакин: localhost

Пристанище: 3306

Потребител: root

База данни: patedb

Стъпка 4: Дизайн на база данни

Дизайн на база данни
Дизайн на база данни

База данни patedb indeholder 4 tabeller

patelog е dataopsamlingstabellen, tilskrives данни от node-RED и C# програма

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

клиентски er et kunderegister

rangetable er en tabel som indeholder grænseværdierne for de i C# programmet benyttede диапазони.

Стъпка 5: Пателог

Пателог
Пателог

Tabellen patelog indeholder folgende 6 kolonner:

pateID (int) е първичен ключ и инкрементен автоматичен диск.

Отпечатък на времето, UID и проследяване на тип varchar (с най -високо ниво на мащаб)

rangeNr er af typen tinyint (beregnes and tilføjes af C# programmet)

orderID е след въвеждане на int (orderID е от C# програма)

Node-RED tilføjer ikke værdier til kolonnerne rangeNr og orderID. rangeNr и orderID tillader NULL værdier, det bruges и C# програма до detektere de rækker като skal tilskrives værdier за rangeNr и orderID

Стъпка 6: Таблица за поръчка

Таблица за поръчка
Таблица за поръчка

поръчан несъдържател 5 колона:

orderID (int) er det aktuelle ordrenummer

orderQuant (mediumint) е ordens pålydende antal

quantProduced (mediumint) е antal der rent factisk er produceret på ordren. (Вградена програма за C#)

коментар (миниатюрен текст) е достъпен до коментар до ред.

customerID (int) е актуално, когато е на разположение.

Стъпка 7: Таблица за клиенти

Подходящ за клиенти
Подходящ за клиенти

клиент, който не може да притежава собственост 6 колона:

customerID (int) е първичен ключ и auto inc.

име, адрес, телефон, имейл (varchar) med forskellig max længde

rangeNr (int)

Стъпка 8: Диапазон

Диапазон
Диапазон

обхващащ държател 3 колона:

rangeNr (int) е първичен ключ и auto inc.

rangeMin (int)

rangeMax (int)

Стъпка 9: Програма C#

Програма C#
Програма C#

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

Kundenummer, ordrenummer, ordreantal og en eventuel коментар indtastes в 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 и den aktuelle vægt изпраща серийно до node-RED, като видя de opsamlede данни на таблото за управление 'et. Samtidig скрива времева отметка, UID и vægt и en ny række и patedb табло. tidspunkt ikke tilskrives værdier til rangeNr og orderID vil de have værdien NULL.

Междинен и времеви интервал, подложен на C# програма patedb.patelogtabellen за най -новите тилкови рикери с NULL værdier и 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. Подредени med de aktuelle ordredata. Не можете да поръчате, можете да изтеглите данни и да разгледате пателогични табели за фремвизиите и да опитате да използвате програмата за актуализиране на данни и да актуализирате DataGridview. подреждащи се могат да се видят, или да се намерят поръчки за индивидуални потребители UID или по -къндати за индивидуални поръчки.

използване System; използване System. Collections. Generic; използване на System. ComponentModel; използване на System. Data; използване на System. Drawing; използване на System. Linq; използване на System. Text; използване на System. Threading. Tasks; използване на System. Windows. Forms; използване на MySql. Data. MySqlClient;

пространство от имена show_data_from_database

{публичен частичен клас Form1: Формуляр {MySqlConnection connection = new MySqlConnection ("datasource = localhost; потребителско име = root; парола = ''"); int RowNumber = 0; // Променлива за съхраняване на pateID стойност int RangeNumber = 0; // Променлива за съхраняване на rangenumber int тегло = 0; // Променлива за съхраняване на теглото int OrderNr = 0; // Променлива за съхраняване на OrderNR int QuantProduced = 0; // Променлива за съхраняване на произведено количество int NumberOfRows = 0; // брой редове с нули.. bool ProdRunning = false; // Променлива, показваща дали бутоните за стартиране и спиране са активирани int limits = new int [6]; // инициализира масив int CustomerID; // Променлива за съхраняване на customerID обществена Form1 () {InitializeComponent (); load_table (); // извиквам load_table}

void load_table ()

{MySqlCommand команда = нова MySqlCommand ("SELECT * FROM patedb.patelog ORDER BY времева марка DESC;", връзка); опитайте {MySqlDataAdapter адаптер = нов MySqlDataAdapter (); adapter. SelectCommand = команда; DataTable dbdataset = нова DataTable (); adapter. Fill (dbdataset); BindingSource bsource = нов BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }}

private void SetRowOrder ()

{dataGridView1. Columns ["pateID"]. DisplayIndex = 0; // Нейната информация може да бъде използвана за изчисляване на данни dataGridView1. Columns ["timestamp"]. DisplayIndex = 1; // Нейната информация може да бъде заредена с данни dataGridView1. Columns ["UID"]. DisplayIndex = 2; // Нейната информация може да бъде изчислена от dataGridView1. Columns ["тегло"]. DisplayIndex = 3; // Нейната информация може да бъде изчислена от dataGridView1. Columns ["rangeNr"]. DisplayIndex = 4; // Нейната информация може да бъде заредена с данни dataGridView1. Columns ["orderID"]. DisplayIndex = 5; // Нейният kan rækkefølgen af kolonner ændres}

private void GetData_Click (подател на обект, EventArgs e) // Чете таблица от база данни и поръчки от Timestamp

{load_table (); }

private void btnRefreshUID_Click (изпращач на обект, EventArgs e) //

{string timeStr = "SELECT * FROM patedb.patelog ORDER BY UID;"; MySqlCommand команда = нова MySqlCommand (timeStr, връзка); опитайте {MySqlDataAdapter адаптер = нов MySqlDataAdapter (); adapter. SelectCommand = команда; DataTable dbdataset = нов DataTable (); adapter. Fill (dbdataset); BindingSource bsource = нов BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }}

private void btnRefreshValue_Click (подател на обект, EventArgs e)

{string weightSort = "SELECT * FROM patedb.patelog ORDER BY CAST (тегло КАТО ПОДПИСАН ИНТЕГЪР);"; MySqlCommand команда = нова MySqlCommand (weightSort, връзка); опитайте {MySqlDataAdapter адаптер = нов MySqlDataAdapter (); adapter. SelectCommand = команда; DataTable dbdataset = нов DataTable (); adapter. Fill (dbdataset); BindingSource bsource = нов BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }}

private void ChkNullBtn_Click (подател на обект, EventArgs e)

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

private void CheckTableForNull ()

{// Проверете/задайте интервал на таймера минимум 100 ms int i; int. TryParse (textTimer1. Text, out i); if (i <100) {timer1. Stop (); i = 100; таймер 1. Интервал = i; MessageBox. Show ("Минимална стойност i 100mS"); timer1. Start (); } else {timer1. Interval = i; } textTimer1. Text = timer1. Interval. ToString (); // Проверява дали в таблицата има налични редове с нула, връща броя редове в променлива: NumberOfRows string weightStr = ""; string chkNull = "SELECT COUNT (*) FROM patedb.patelog WHERE rangeNR IS NULL ORDER BY pateID LIMIT 1;"; Команда MySqlCommand = нова MySqlCommand (chkNull, връзка); опитайте {connection. Open (); NumberOfRows = Convert. ToInt32 (command. ExecuteScalar ()); връзка. Затвори (); } catch (Exception ex) {MessageBox. Show (ex. Message); } накрая {if (NumberOfRows! = 0) {try {// Избира най -ниския номер на pateID, където rangeNr е NULL низ readID = "ИЗБЕРЕТЕ pateID ОТ patedb.patelog КЪДЕ rangeNR Е НУЛДОВ ПОРЪЧКА от pateID ASC LIMIT 1;"; MySqlCommand cmdID = нов MySqlCommand (readID, връзка); {connection. Open (); RowNumber = (int) cmdID. ExecuteScalar (); // цяло число !! връзка. Затвори (); } listPateID. Text = RowNumber. ToString (); // чете избрания номер на PateID // Избира теглото от избрания ред номер на ред ред = RowNumber. ToString (); string readweight = "SELECT weight FROM patedb.patelog WHERE pateID =" + ред; MySqlCommand cmdweight = нов MySqlCommand (претегляне, връзка); {connection. Open (); weightStr = (низ) cmdweight. ExecuteScalar (); // Низ !! връзка. Затвори (); } тегло = int. Parse (weightStr); // конвертираме в int txtWeight. Text = weight. ToString (); // отпечатайте int RangeNumber = 0; if (тегло> = граници [0] && тегло = граници [2] && тегло = граници [4] && тегло <= граници [5]) {RangeNumber = 3; }} txtRange. Text = RangeNumber. ToString (); UpdateLog (); } catch (Exception ex) {MessageBox. Show (ex. Message); } QuantProduced = QuantProduced + 1; }}} private void btnStart_Click (подател на обект, EventArgs e) {if (ProdRunning == false) {int valtest; опитайте {CustomerID = int. Parse (txtCustomerNr. Text); // прочетете customerID} catch {MessageBox. Show ("Въведете производствени данни и натиснете бутона" старт "."); }

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

MySqlCommand cmdtestcustomer = нов MySqlCommand (тест, връзка); {connection. Open (); valtest = Convert. ToInt32 (cmdtestcustomer. ExecuteScalar ()); // връща 0, ако клиентът не съществува connection. Close (); } if (valtest == 1) // ако клиент съществува в базата данни - започнете производство {try {OrderNr = int. Parse (txtOrderNumber. Text); ProdRunning = вярно; timer1. Start (); textTimer1. Text = timer1. Interval. ToString (); ReadLimits (); } catch (Exception ex) {MessageBox. Show ("Въведете производствени данни и натиснете бутона" старт "."); }} else MessageBox. Show ("Клиентът не е в базата данни, опитайте отново"); } // ReadLimits (); }

private void ReadLimits ()

{// Чете граници от rangetable, диапазон 1 до 3 int брояч = 0; for (int rangeNr = 1; rangeNr <4; rangeNr ++) {string readmin = "SELECT rangeMin FROM patedb.rangetable WHERE rangeNr ="+rangeNr; MySqlCommand cmdmin = нов MySqlCommand (readmin, връзка); {connection. Open (); граници [брояч] = (int) cmdmin. ExecuteScalar (); брояч = брояч + 1; връзка. Затвори (); } // MessageBox. Show (counter. ToString ()); string readmax = "SELECT rangeMax FROM patedb.rangetable WHERE rangeNr =" + rangeNr; MySqlCommand cmdmax = нов MySqlCommand (readmax, връзка); {connection. Open (); граници [брояч] = (int) cmdmax. ExecuteScalar (); брояч = брояч + 1; връзка. Затвори (); }} // край за цикъл}

private void UpdateLog ()

{// UPDATE rangeNR & orderID низ Range = RangeNumber. ToString (); низ Order = OrderNr. ToString (); string update = "UPDATE patedb.patelog SET rangeNr ="+Range+','+"orderID ="+OrderNr+"WHERE pateID ="+RowNumber; MySqlCommand updatecmd = нов MySqlCommand (актуализация, връзка); опитайте {connection. Open (); updatecmd. ExecuteNonQuery (); връзка. Затвори (); } catch (Exception ex) {MessageBox. Show (ex. Message); }}

private void btnStop_Click (подател на обект, EventArgs e)

{if (ProdRunning == true) {timer1. Stop (); ProdRunning = false; UpdateOrderTable (); } else {MessageBox. Show ("Още не е започнало производство. Въведете данни и натиснете бутона" старт ""); }}

private void 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 = нов MySqlCommand (вмъкване, връзка); опитайте {connection. Open (); insertcmd. ExecuteNonQuery (); връзка. Затвори (); QuantProduced = 0; } catch (Exception ex) {MessageBox. Show (ex. Message); }}

частен таймер за празнота1_Tick (подател на обект, EventArgs e)

{CheckTableForNull (); load_table (); }

private void btnShowOrderTable_Click (подател на обект, EventArgs e)

{if (ProdRunning == false) {MySqlCommand command = new MySqlCommand ("SELECT * FROM patedb.ordertable ORDER BY orderID DESC;", връзка); опитайте {MySqlDataAdapter адаптер = нов MySqlDataAdapter (); adapter. SelectCommand = команда; DataTable dbdataset = нов DataTable (); adapter. Fill (dbdataset); BindingSource bsource = нов BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }} else {MessageBox. Show ("Натиснете стоп, за да прегледате orderTable"); }}

private void btnShowOrderDetails_Click (подател на обект, 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 +"' "); MySqlCommand команда = нова MySqlCommand (тест, връзка); опитайте {connection. Open (); MySqlDataAdapter адаптер = нов MySqlDataAdapter (); adapter. SelectCommand = команда; DataTable dbdataset = нов DataTable (); adapter. Fill (dbdataset); BindingSource bsource = нов BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); } връзка. Затвори (); } else {MessageBox. Show ("Натиснете стоп, за да видите подробности за поръчката"); }}

private void btnShowCustomerDetails_Click (подател на обект, 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 +"' "); MySqlCommand команда = нова MySqlCommand (тест, връзка); опитайте {MySqlDataAdapter адаптер = нов MySqlDataAdapter (); adapter. SelectCommand = команда; DataTable dbdataset = нов DataTable (); adapter. Fill (dbdataset); BindingSource bsource = нов BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }} else {MessageBox. Show ("Натиснете стоп, за да видите подробности за клиента"); }}}

}

Препоръчано: