Mục lục:

Cơ sở dữ liệu EAL-Industri4.0-RFID Dataopsamling Til: 10 bước (có hình ảnh)
Cơ sở dữ liệu EAL-Industri4.0-RFID Dataopsamling Til: 10 bước (có hình ảnh)

Video: Cơ sở dữ liệu EAL-Industri4.0-RFID Dataopsamling Til: 10 bước (có hình ảnh)

Video: Cơ sở dữ liệu EAL-Industri4.0-RFID Dataopsamling Til: 10 bước (có hình ảnh)
Video: ClearStream RFID — обзор опций базы данных для синхронизации данных RFID 2024, Tháng mười một
Anonim
Cơ sở dữ liệu EAL-Industri4.0-RFID Dataopsamling Til
Cơ sở dữ liệu EAL-Industri4.0-RFID Dataopsamling Til

Dette projekt omhandler opsamling af vægtdata, đăng ký af iditeter vha. RFID, tụt hậu dữ liệu af i vi Cơ sở dữ liệu MySQL vha. node-RED, samt fremvisning og thi dung de opsamlede data i et C # program i form af en Windows Form Application. Vi tiên tri os følgende:

Vi har en produktionslinje som productionrer leverpostej i 200g foliebakker. Alle færdigbagte leverpostejer udstyres efter afkøling med et RFID tag i plasticlåget / labelen, som subsholder et unikt ID (UID = Unique Identity, er en 32 bits kode, 8 hexadecimale karakterer) để nhận dạng entydig sau hver enkelt bakke bẩypostej. 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, bầm tím UID tagget cho đến khi ở knytte hver enkelt lagifivor lager lager lager đòn bẩy Kunderne er supermarkedskæder:

1. Irma. Vægten på Irmas luksus leverpostej skal holde sig inden cho +/- 5%, altså tối thiểu 190g og maksimum 210g.

2. Brugsen. Vægten på Brugsens leverpostej skal holde sig inden cho +/- 10%, altså tối thiểu 180g og maksimum 220g.

3. Aldi. Vægten på Aldis giảm giá đòn bẩypostej skal holde sig inden cho +/- 15%, tối thiểu 170g og maksimum 230g.

Der er således følgende sorteringer:

Phạm vi0: ngoài phạm vi

Phạm vi 1: tối thiểu 190g / tối đa 210g

Phạm vi 2: tối thiểu 180g / tối đa220g

Phạm vi 3: tối thiểu 170g / tối đa230g

Bước 1: Kiểm tra dữ liệu Af cho Vægt Samt Đăng ký Af UID

Opsamling Af Dữ liệu cho Vægt Samt Đang đăng ký Af UID
Opsamling Af Dữ liệu cho Vægt Samt Đang đăng ký Af UID

Til opsamling af data for vægt, samt register af RFID tags er anvendt vi Arduino MEGA2560 med en RFID-RC522 reader. Da vi ikke har nogen vægt, mô phỏng vi dữ liệu cho vægten med et potmeter tilsluttet en analog indgang på Arduinoen.

Følgende opstilling er anvendt:

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

RFID-RC522 er tilsluttet Bo mạch Arduino cổng SPI på følgende måde:

SDA -> chân 53

SCK -> pin52

MOSI -> pin51

MISO-> pin50

IRQ -> NC

GND -> GND

RST -> pin5

3,3V -> 3,3V

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

Bước 2: Chương trình Arduino

I Arduino programmet inkluderes de biblioteker SPI.h og MFRC522.h for at kunne bruge RFID læseren. Tôi starten af programmet biến initialiseres de anvendte. Der laves en instans af MFRC522. Tôi thiết lập blokken initialiseres den serielle forbindelse, SPI porten og MFRC522. Máy quét chậm hơn sẽ nâng cấp thẻ RFID. For ikke at sende det samme UID afsted flere gange efter hinanden, er der lavet en stump kode som tjekker for dette. Thẻ Når der er scannet et UID, tải tùy chọn nyUID med det netop læste UID. Mảng Hvis nyUID er forskellig fra oldUID er der story om et nyt UID som kan sendes på den serielle port. Hvis nyUID og oldUID er ens, er der story om samme UID tag og UID'et skal ignoreres. Hvis der er story om et nyt UID, sendes UID'et på den serielle port sammen med en læst værdi fra den serielle port. Den analoge værdi skaleres đến området 150-250. Dữ liệu gửi som en komma-separeret tekststreng. Som det sidste sættes oldUID = nyUID, således at koden klart Til at læse et nyt RFID tag.. Den sidste funktion i programmet er den funktion som sammenligner 2 array. Người trả lại Funktionen true hvis array'ne er ens, og false hvis array'ne er forskellige.

#bao gồm

#include // Chương trình này quét thẻ RFID bằng bảng đọc / ghi RDIF-RC522. // UID được đọc, một chân tương tự được đọc. Giá trị tương tự 0-1023 được chia tỷ lệ thành 150-250. // UID và giá trị tương tự được gửi dưới dạng văn bản được phân tách bằng dấu phẩy trên cổng nối tiếp bằng cách sử dụng 9600, N, 8, 1. // Cần chú ý chỉ gửi từng UID một lần liên tiếp, // UID mới phải là xuất hiện trước khi có thể gửi lại cùng một UID. // Hàm này được thực thi trong mã bằng cách so sánh các mảng: oldUID nyUID trong hàm array_cmp (oldUID , nyUID )

constexpr uint8_t RST_PIN = 5;

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

MFRC522 mfrc522 (SS_PIN, RST_PIN); // Tạo cá thể MFRC522.

void setup ()

{Serial.begin (9600); // Khởi tạo một giao tiếp nối tiếp SPI.begin (); // Khởi tạo xe buýt SPI mfrc522. PCD_Init (); // Khởi tạo MFRC522}

void loop ()

{// Tìm thẻ mới if (! Mfrc522. PICC_IsNewCardPresent ()) {return; } // Chọn một trong các thẻ if (! Mfrc522. PICC_ReadCardSerial ()) {return; } // tải nyUID bằng thẻ UID for (byte i = 0; i <mfrc522.uid.size; i ++) {nyUID = mfrc522.uid.uidByte ; } // if oldUID nyUID if (! array_cmp (oldUID, nyUID)) {// gửi thẻ UID trên cổng nối tiếp for (byte i = 0; i 1000) {Value = 1000; } Giá trị = (Giá trị / 10) + 150; // gửi giá trị tương tự được chia tỷ lệ Serial.print (Value); // gửi dòng mới Serial.println (); // đặt oldUID = nyUID for (byte z = 0; z <4; z ++) oldUID [z] = nyUID [z]; } // đợi trễ 1 giây (1000); }

// so sánh 2 mảng…

boolean array_cmp (byte a , byte b ) {bool test = true; // kiểm tra từng phần tử giống nhau. nếu chỉ một không, trả về false for (byte n = 0; n <4; n ++) {if (a [n]! = b [n]) test = false; // nếu trên byte không bằng nhau thì test = false} if (test == true) return true; khác trả về false; }

Bước 3: Node-RED, Cơ sở dữ liệu Af Data I bị trễ

Node-RED, Cơ sở dữ liệu Af dữ liệu I bị trễ
Node-RED, Cơ sở dữ liệu Af dữ liệu I bị trễ
Node-RED, Cơ sở dữ liệu Af dữ liệu I bị trễ
Node-RED, Cơ sở dữ liệu Af dữ liệu I bị trễ

Følgende flow er lavet i node-RED:

COM4 er den serielle forbindelse hvor sửa đổi dữ liệu fra bo mạch Arduino. Funktionerne "Split and Get value" og "Split and Get UID" bộ chia teksstrengen ved kommaet og returnnere hhv vægten og UID. Vægten bruges tới khi tự do hóa på bảng điều khiển i et linechart og en scale. UID fremvises i et tekstfelt. Funktionen test_sound advarer verbalt med sætningen "Out of range", hvis vægten er dưới 170g eller over 230g, dvs i range 0.

Chia nhỏ và nhận giá trị:

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

temp = {payload: (output [1])}; trở lại nhiệt độ;

Tách và Nhận UID:

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

temp = {payload: output [0]}; trở lại nhiệt độ;

test_sound:

var number = parseInt (msg.payload);

if (number> 230 || number <170) {newMsg = {payload: "Ngoài phạm vi"}; trả về newMsg; } else {newMsg = {payload: ""}; trả về newMsg; }

Funktionen Split string "," indsætter et timestamp, UID og vægten i en database patedb.patelog.

var output = msg.payload.split (","); // chia msg.payload bằng dấu phẩy thành mảng

UIDTag = đầu ra [0]; // phần đầu tiên vào vị trí đầu tiên [0] ValueTag = output [1]; // phần thứ hai vào vị trí thứ hai [1]

var m = {

topic: "INSERT INTO patedb.patelog (timestamp, UID, weight) VALUES ('" + new Date (). toISOString () + "', '" + UIDTag + "', '" + ValueTag + "');" }; trả lại m;

patelog er vi Cơ sở dữ liệu MySQL forbindelse som er sat op med følgende parametre:

Máy chủ: localhost

Cảng: 3306

Người dùng: root

Cơ sở dữ liệu: patedb

Bước 4: Thiết kế cơ sở dữ liệu

Thiết kế cơ sở dữ liệu
Thiết kế cơ sở dữ liệu

Databasen patedb trình bán hàng dành cho người giữ nợ 4

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

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

tùy chỉnh er et kunderegister

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

Bước 5: Patelog

Patelog
Patelog

Tabellen patelog người mang nợ folgende 6 kolonner:

pateID (int) er khóa chính og inkrementeres automatisk.

Dấu thời gian, UID & vægt er af typen varchar (med forskellig max længde)

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

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

Node-RED tilføjer ikke værdier tới kolonnerne rangeNr og orderID. phạm vi

Bước 6: Đặt hàng

Đặt hàng
Đặt hàng

chủ nợ đặt hàng 5 kolonner:

orderID (int) er det aktuelle ordrenummer

orderQuant (mediumint) er ordens pålydende antal

quantProductioned (mediumint) er antal der thuê faktisk er productionret på ordren. (Tælles af C # lập trình viên)

bình luận (tinytext) er en eventuel kommentar tới ordren.

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

Bước 7: Có thể tùy chỉnh

Có thể tùy chỉnh
Có thể tùy chỉnh

người giữ nợ có thể tùy chỉnh 6 kolonner:

khóa chính của customerID (int) er og auto inc.

tên, địa chỉ, điện thoại, email (varchar) med forskellig max længde

rangeNr (int)

Bước 8: Có thể thay đổi

Rangetable
Rangetable

người trả nợ rangetable 3 kolonner:

rangeNr (int) er khóa chính og auto inc.

rangeMin (int)

rangeMax (int)

Bước 9: Chương trình C #

Chương trình C #
Chương trình C #

Når der productionres en ordre leverpostej, er thủ tụcn følgende:

Kundenummer, ordrenummer, ordreantal og en eventuel kommentar indtastes i C # programmet (i praksis overføres det digitalt fra virksomhedens ordresystem. Produktionen startes nu ved tryk på 'start'- knappen. Når en bẩy den på et transportbånd) Samtidig skrives værdier af UID og den aktuelle vægt sendes serielt cho đến nút RED, som viser de opsamlede data på dashboard 'et. Samtidig skrives timestamp, UID og vægt i en ny række i patedb. Dande pån tidspunkt ikke tilskrives værdier cho đến phạm viNr og orderID vil de have værdien NULL.

Med et timerinterval undersøger 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 productionret, afsluttes ordren ved tryk på”stop” - knappen. Når ordren afsluttes, tilføjes en række Til patedb.ordertable med de aktuelle ordredata. Når en ordre er afsluttet, kan kan de opsamlede data i patelog tabellen fremvises ved at trykke på de forskellige knapper i gruppen Cập nhật DataGridview. ordertable kan også vises, og der kan søges ordredata på Individualueller UID'er eller kundedata på Individualuelle orderrer.

using System; using System. Collections. Generic; sử dụng System. ComponentModel; sử dụng System. Data; sử dụng System. Drawing; sử dụng System. Linq; sử dụng System. Text; sử dụng System. Threading. Tasks; sử dụng System. Windows. Forms; sử dụng MySql. Data. MySqlClient;

không gian tên show_data_from_database

{public part class Form1: Form {MySqlConnection connection = new MySqlConnection ("datasource = localhost; username = root; password = ''"); int RowNumber = 0; // Biến lưu trữ giá trị pateID int RangeNumber = 0; // Biến lưu trữ rangenumber int weight = 0; // Biến lưu trữ trọng số int OrderNr = 0; // Biến lưu trữ OrderNR int QuantProductioned = 0; // Biến lưu trữ số lượng được tạo ra int NumberOfRows = 0; // số hàng có giá trị rỗng.. bool ProdRunning = false; // Biến cho biết nếu nút start & stop đã được kích hoạt int limit = new int [6]; // khởi tạo mảng int CustomerID; // Biến lưu trữ customerID public Form1 () {InitializeComponent (); load_table (); // gọi load_table}

void load_table ()

{MySqlCommand command = new MySqlCommand ("CHỌN * TỪ LỆNH Patedb.patelog THEO nhãn thời gian DESC;", kết nối); thử {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = lệnh; DataTable dbdataset = new DataTable (); adapter. Fill (dbdataset); BindingSource bsource = new 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; // Cô ấy kan rækkefølgen af kolonner ændres dataGridView1. Columns ["timestamp"]. DisplayIndex = 1; // Cô ấy kan rækkefølgen af kolonner ændres dataGridView1. Columns ["UID"]. DisplayIndex = 2; // Cô ấy kan rækkefølgen af kolonner ændres dataGridView1. Columns ["weight"]. DisplayIndex = 3; // Cô ấy kan rækkefølgen af kolonner ændres dataGridView1. Columns ["rangeNr"]. DisplayIndex = 4; // Cô ấy kan rækkefølgen af kolonner ændres dataGridView1. Columns ["orderID"]. DisplayIndex = 5; // Cô ấy kan rækkefølgen af kolonner ændres}

private void GetData_Click (object sender, EventArgs e) // Đọc bảng cơ sở dữ liệu và đặt hàng theo Dấu thời gian

{load_table (); }

private void btnRefreshUID_Click (object sender, EventArgs e) //

{string timeStr = "CHỌN * TỪ LỆNH patedb.patelog THEO UID;"; Lệnh MySqlCommand = new MySqlCommand (timeStr, kết nối); thử {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = lệnh; DataTable dbdataset = new DataTable (); adapter. Fill (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }}

private void btnRefreshValue_Click (object sender, EventArgs e)

{string weightSort = "SELECT * FROM patedb.patelog ORDER BY CAST (weight AS SIGNED INTEGER);"; Lệnh MySqlCommand = new MySqlCommand (weightSort, kết nối); thử {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = lệnh; DataTable dbdataset = new DataTable (); adapter. Fill (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }}

private void ChkNullBtn_Click (object sender, EventArgs e)

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

private void CheckTableForNull ()

{// Kiểm tra / đặt khoảng thời gian tối thiểu 100 ms int i; int. TryParse (textTimer1. Text, out i); if (i <100) {timer1. Stop (); i = 100; timer1. Interval = i; MessageBox. Show ("Giá trị nhỏ nhất i 100mS"); timer1. Start (); } else {timer1. Interval = i; } textTimer1. Text = timer1. Interval. ToString (); // Kiểm tra xem có hàng nào rỗng trong bảng không, trả về số hàng trong biến: NumberOfRows string weightStr = ""; string chkNull = "CHỌN ĐẾM (*) TỪ patedb.patelog TRONG ĐÓ rangeNR LÀ LỆNH ĐẦY ĐỦ THEO PateID LIMIT 1;"; Lệnh MySqlCommand = new MySqlCommand (chkNull, kết nối); thử {connect. Open (); NumberOfRows = Convert. ToInt32 (command. ExecuteScalar ()); kết nối. Close (); } catch (Exception ex) {MessageBox. Show (ex. Message); } last {if (NumberOfRows! = 0) {try {// Chọn số pateID thấp nhất trong đó rangeNr là NULL string readID = "CHỌN pateID TỪ patedb.patelog WHERE rangeNR LÀ ĐƠN HÀNG ĐẦY ĐỦ BỞI pateID ASC LIMIT 1;"; MySqlCommand cmdID = new MySqlCommand (readID, kết nối); {kết nối. Open (); RowNumber = (int) cmdID. ExecuteScalar (); // số nguyên !! kết nối. Close (); } listPateID. Text = RowNumber. ToString (); // đọc ra số PateID đã chọn // Chọn trọng số từ hàng chuỗi rownumber đã chọn = RowNumber. ToString (); string readweight = "CHỌN trọng lượng TỪ patedb.patelog WHERE pateID =" + row; MySqlCommand cmdweight = new MySqlCommand (readweight, kết nối); {kết nối. Open (); weightStr = (string) cmdweight. ExecuteScalar (); //Dây !! kết nối. Close (); } weight = int. Parse (weightStr); // chuyển thành int txtWeight. Text = weight. ToString (); // in ra int RangeNumber = 0; if (trọng lượng> = giới hạn [0] && trọng lượng = giới hạn [2] && trọng lượng = giới hạn [4] && trọng lượng <= giới hạn [5]) {RangeNumber = 3; }} txtRange. Text = RangeNumber. ToString (); UpdateLog (); } catch (Exception ex) {MessageBox. Show (ex. Message); } Lượng tử được sản xuất = QuantProductioned + 1; }}} private void btnStart_Click (object sender, EventArgs e) {if (ProdRunning == false) {int valtest; thử {CustomerID = int. Parse (txtCustomerNr. Text); // đọc customerID} catch {MessageBox. Show ("Nhập dữ liệu sản xuất và nhấn nút 'start'."); }

string test = "CHỌN ĐẾM (*) TỪ patedb.customertable WHERE customerID =" + CustomerID;

MySqlCommand cmdtestcustomer = new MySqlCommand (kiểm tra, kết nối); {kết nối. Open (); valtest = Convert. ToInt32 (cmdtestcustomer. ExecuteScalar ()); // trả về 0 nếu khách hàng không tồn tại kết nối. Close (); } if (valtest == 1) // nếu khách hàng tồn tại trong cơ sở dữ liệu - bắt đầu sản xuất {try {OrderNr = int. Parse (txtOrderNumber. Text); ProdRunning = true; timer1. Start (); textTimer1. Text = timer1. Interval. ToString (); ReadLimits (); } catch (Exception ex) {MessageBox. Show ("Nhập dữ liệu sản xuất và nhấn nút 'start'."); }} else MessageBox. Show ("Khách hàng không có trong cơ sở dữ liệu, hãy thử lại"); } // ReadLimits (); }

private void ReadLimits ()

{// Đọc giới hạn từ rangetable, phạm vi 1 đến 3 int counter = 0; for (int rangeNr = 1; rangeNr <4; rangeNr ++) {string readmin = "CHỌN rangeMin TỪ patedb.rangetable WHERE rangeNr =" + rangeNr; MySqlCommand cmdmin = new MySqlCommand (readmin, kết nối); {kết nối. Open (); giới hạn [counter] = (int) cmdmin. ExecuteScalar (); bộ đếm = bộ đếm + 1; kết nối. Close (); } // MessageBox. Show (counter. ToString ()); string readmax = "SELECT rangeMax FROM patedb.rangetable WHERE rangeNr =" + rangeNr; MySqlCommand cmdmax = new MySqlCommand (readmax, kết nối); {kết nối. Open (); giới hạn [counter] = (int) cmdmax. ExecuteScalar (); bộ đếm = bộ đếm + 1; kết nối. Close (); }} // kết thúc cho vòng lặp}

private void UpdateLog ()

{// CẬP NHẬT 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 = new MySqlCommand (cập nhật, kết nối); thử {connect. Open (); updatecmd. ExecuteNonQuery (); kết nối. Close (); } catch (Exception ex) {MessageBox. Show (ex. Message); }}

private void btnStop_Click (object sender, EventArgs e)

{if (ProdRunning == true) {timer1. Stop (); ProdRunning = sai; UpdateOrderTable (); } else {MessageBox. Show ("Chưa bắt đầu sản xuất. Nhập dữ liệu và nhấn nút 'bắt đầu'"); }}

private void UpdateOrderTable ()

{string insert = "INSERT INTO patedb.ordertable (orderID, orderQuant, quantProduction, comment, customerID) VALUES ('" + this.txtOrderNumber. Text + "', '" + this.txtOrderQuant. Text + "', '" + QuantProductioned. ToString () + "','" + this.txtComment. Text + "','" + this.txtCustomerNr. Text + "');"; MySqlCommand insertcmd = new MySqlCommand (chèn, kết nối); thử {connect. Open (); insertcmd. ExecuteNonQuery (); kết nối. Close (); Lượng tử được sản xuất = 0; } catch (Exception ex) {MessageBox. Show (ex. Message); }}

private void timer1_Tick (object sender, EventArgs e)

{CheckTableForNull (); load_table (); }

private void btnShowOrderTable_Click (object sender, EventArgs e)

{if (ProdRunning == false) {MySqlCommand command = new MySqlCommand ("SELECT * FROM patedb.ordertable ORDER BY orderID DESC;", connection); thử {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = lệnh; DataTable dbdataset = new DataTable (); adapter. Fill (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }} else {MessageBox. Show ("Nhấn dừng để wiev orderTable"); }}

private void btnShowOrderDetails_Click (object sender, EventArgs e)

{if (ProdRunning == false) {string test = ("SELECT patedb.ordertable.orderID, orderQuant, quantProduction, comment, customerID FROM patedb.ordertable INNER JOIN patedb.patelog ON patedb.patelog.orderID = patedb.ordertable.orderID WHERE patedb.patelog. UID = '"+ txtShowOrderDetails. Text +"' "); Lệnh MySqlCommand = new MySqlCommand (kiểm tra, kết nối); thử {connect. Open (); MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = lệnh; DataTable dbdataset = new DataTable (); adapter. Fill (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); } kết nối. Close (); } else {MessageBox. Show ("Bấm dừng để xem chi tiết đơn hàng"); }}

private void btnShowCustomerDetails_Click (object 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 WHERE patedb.ordertable.orderID = '"+ txtShowCustomerDetails. Text +"' "); Lệnh MySqlCommand = new MySqlCommand (kiểm tra, kết nối); thử {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = lệnh; DataTable dbdataset = new DataTable (); adapter. Fill (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }} else {MessageBox. Show ("Bấm dừng để xem chi tiết khách hàng của wiev"); }}}

}

Đề xuất: