Daftar Isi:

EAL-Industri4.0-RFID Dataopsamling Sampai Database: 10 Langkah (dengan Gambar)
EAL-Industri4.0-RFID Dataopsamling Sampai Database: 10 Langkah (dengan Gambar)

Video: EAL-Industri4.0-RFID Dataopsamling Sampai Database: 10 Langkah (dengan Gambar)

Video: EAL-Industri4.0-RFID Dataopsamling Sampai Database: 10 Langkah (dengan Gambar)
Video: Internet Of Things (IoT) In 10 Minutes | What Is IoT And How It Works | Great Learning 2024, Juli
Anonim
EAL-Industri4.0-RFID Dataopsamling Sampai Basis Data
EAL-Industri4.0-RFID Dataopsamling Sampai Basis Data

Dette projekt omhandler opsamling af vægtdata, mendaftar af identiteter vha. RFID, data tertinggal dalam database MySQL vha. node-RED, samt fremvisning og menangani data de opsamlede i et C# program i form af en Windows Form Application. Vi forestiller os følgende:

Vi har en produksilinje som produser leverpostej i 200g foliebakker. Semua pengaturan leverpostejer udstyres efter afkøling med et RFID tag i plasticlåget/labelen, som indeholder et unikt ID (UID = Unique Identifier, er en kode 32 bit, 8 karakterer heksadesimal) untuk identifikasi entydig af hverpost enkelt bakke. la 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, bruges tag UID hingga spesifikasi enposthver enknytte leverpostejer til én specifik kunde. Kunderne er supermarkedskæder:

1. Irma. Vægten på Irmas luksus leverpostej skal holde sig inden untuk +/- 5%, altså minimum 190g dan maksimum 210g.

2. Brugsen. Vægten på Brugsen leverpostej skal holde sig inden untuk +/- 10%, altså minimum 180g atau maksimum 220g.

3. Aldi. Vægten på Aldis discount leverpostej skal holde sig inden untuk +/- 15%, altså minimum 170g dan maksimum 230g.

Penyortir der er således følgende:

Range0: di luar jangkauan

Rentang1: minimum 190g/maksimum210g

Range2: minimum 180g/maksimum220g

Range3: minimum 170g/maksimum230g

Langkah 1: Opsamling Data Af untuk Pendaftaran Samt Vgt Af UID

Opsamling Data Af untuk Pendaftaran Samt Vægt Af UID
Opsamling Data Af untuk Pendaftaran Samt Vægt Af UID

Sampai opsamling data untuk vægt, pendaftaran samt untuk tag RFID dan penemuan Arduino MEGA2560 dengan pembaca/penulis RFID-RC522. Da vi ikke har nogen vægt, simulerer vi data untuk 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 dan +5V, midterbenet er tilsluttet AN0

RFID-RC522 er tilsluttet Arduino boardet SPI port på følgende måde:

SDA -> pin 53

SCK -> pin52

MOSI -> pin51

MISO->pin50

IRQ -> NC

GND -> GND

RST -> pin5

3.3V -> 3.3V

Data de opsamlede, untuk hhv. UID og vægten, kirim på den serielle port som en komma-separeret tekststreng videre til node-Red som står for den efterfølgende presentation på et dashboard og lagring i en database.

Langkah 2: Program Arduino

I Arduino memprogram inkluderes de ke biblioteker SPI.h dan MFRC522.h untuk di kunne bruge læseren RFID. Saya memulai dengan program initialiseres de anvendte variabel. Der laves en instans af MFRC522. I Setup blokken initialiseres den serielle forbindelse, port SPI dan MFRC522. Derifter memindai setelah tag RFID. Untuk ikke di sende det samme UID afsted flere gange efter hinanden, er der lavet en stump kode som tjekker untuk dette. Di bawah scannet dan tag UID, memuat arary nyUID med det netop læste UID. Hvis array nyUID er forskellig fra oldUID er der tale om et nyt UID som kan sendes på den serielle port. Hvis nyUID dan oldUID er ens, er der cerita om samme UID tag dan UID'et skal diabaikan. Hvis der er tale om et nyt UID, kirim UID'et på den serielle port sammen med en læst værdi fra den serielle port. Tetap analog værdi skaleres til området 150-250. Data terkirim beberapa en komma-separeret tekststreng. Som det sidste sættes oldUID = nyUID, sledes di koden klart sampai di læse dan nyt tag RFID.. Fungsi sidste saya memprogram dan menjalankan beberapa sammenligner 2 array. Pengembalian funktionen true hvis array'ne er ens, og false hvis array'ne er forskellige.

#termasuk

#include // Program ini memindai kartu RFID menggunakan papan pembaca/penulis RDIF-RC522. // UID dibaca, pin analog dibaca. Nilai analog 0-1023 diskalakan menjadi 150-250. // UID dan nilai analog dikirim sebagai teks yang dipisahkan koma pada port serial menggunakan 9600, N, 8, 1. // Perhatian telah diambil untuk hanya mengirim setiap UID satu kali berturut-turut, // UID baru harus hadir sebelum UID yang sama dapat dikirim lagi. // Fungsi ini diimplementasikan dalam kode dengan membandingkan array: oldUIDnyUID dalam fungsi array_cmp(oldUID, nyUID)

constexpr uint8_t RST_PIN = 5;

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

MFRC522 mfrc522(SS_PIN, RST_PIN); // Buat instance MFRC522.

batalkan pengaturan()

{ Serial.begin(9600); // Memulai komunikasi serial SPI.begin(); // Memulai bus SPI mfrc522. PCD_Init(); // Mulai MFRC522 }

lingkaran kosong()

{ // Cari kartu baru if (! mfrc522. PICC_IsNewCardPresent()) { return; } // Pilih salah satu kartu jika (! mfrc522. PICC_ReadCardSerial()) { return; } //muat nyUID dengan tag UID untuk (byte i = 0; i < mfrc522.uid.size; i++) { nyUID = mfrc522.uid.uidByte; } // if oldUIDnyUID if (!array_cmp(oldUID, nyUID)) { // kirim tag UID pada port serial untuk (byte i = 0; i 1000) { Nilai = 1000; } Nilai = (Nilai / 10) + 150; // kirim nilai analog berskala Serial.print(Value); // kirim baris baru Serial.println(); //set oldUID = nyUID untuk (byte z = 0; z < 4; z++) oldUID[z] = nyUID[z]; } // tunggu 1 detik delay(1000); }

// membandingkan 2 array…

boolean array_cmp(byte a, byte b) { tes bool = true; //menguji setiap elemen agar sama. jika hanya satu yang tidak, kembalikan false for (byte n = 0; n < 4; n++) { if (a[n] != b[n]) test = false; // jika pada byte tidak sama, test = false } if (test == true) return true; lain kembali salah; }

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

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

Følgende flow er lavet i node-RED:

COM4 er den serielle forbindelse hvor data modtages untuk boardet Arduino. Fungsi "Pisahkan dan Dapatkan nilai" og "Split and Get UID" splitter teksstrengen ved kommaet og returnere hhv vægten og UID. Vægten bruges til fremvisning på dashboardet i et linechart dan skala. UID fremvises saya dan tekstfelt. Funktionen test_sound advarer verbalt med sætningen "Di luar jangkauan", hvis vægten er di bawah 170g eller lebih dari 230g, dvs i range 0.

Pisahkan dan Dapatkan nilai:

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

temp = {muatan:(keluaran[1])}; kembali suhu;

Pisahkan dan Dapatkan UID:

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

suhu = {payload:output[0]}; kembali suhu;

tes_suara:

var nomor = parseInt(msg.payload);

if (angka >230 || angka<170) { newMsg = {payload:"Di luar jangkauan"}; kembali pesan baru; } else { pesan baru = {payload:""}; kembali pesan baru; }

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

var keluaran = msg.payload.split(", "); //bagi msg.payload dengan koma ke dalam array

UIDTag = keluaran[0]; //bagian pertama ke posisi pertama [0] ValueTag = output[1]; //bagian kedua ke posisi kedua [1]

var m = {

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

patelog er en database MySQL untuk beberapa parameter sat op med følgende:

Tuan rumah: localhost

Pelabuhan: 3306

Pengguna: root

Basis data: patedb

Langkah 4: Desain basis data

Desain basis data
Desain basis data

Database patedb indeholder 4 tabeller

patelog er dataopsamlingstabellen, tilskrives data dari node-RED dan program C#

ordertable er en tabel beberapa data pemegang saham om de genemførte order, data tilskrives dari program C#

meja pelanggan er et kunderregister

rangetable er en tabel som indeholder grænseværdierne untuk de i C# program benyttede range.

Langkah 5: Patolog

patelog
patelog

Tabellen patelog pemegang folgende 6 kolonner:

pateID (int) er primary key dan inkrementeres automatisk.

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

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

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

Node-RED tilføjer ikke værdier til kolonnerne rangeNr og orderID. rangeNr og orderID tillader NULL værdier, det bruges i C# program hingga di detektere de rækker som skal tilskrives værdier untuk rangeNr og orderID

Langkah 6: Dapat dipesan

Dapat dipesan
Dapat dipesan

indeholder yang dapat dipesan 5 kolonner:

orderID (int) er det aktuelle ordrenummer

orderQuant (sedang) er ordens pålydende antal

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

komentar (tinytext) er en akhirnya kommentar til ordren.

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

Langkah 7: Meja Pelanggan

meja pelanggan
meja pelanggan

customertable indeholder 6 kolonner:

customerID (int) er primary key dan auto inc.

nama, alamat, telepon, email (varchar) med forskellig max længde

rentangNr (int)

Langkah 8: Rangetable

Rangetable
Rangetable

rangetable indeholder 3 kolonner:

rangeNr (int) er kunci utama dan auto inc.

rentangMin (int)

rentangMaks (int)

Langkah 9: Program C#

Program C#
Program C#

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

(Kundenummer, ordrenummer, ordreantal og en eventuel kommentar indtastes i C# program (saya praksis overføres det digitalt fra virksomhedens ordresystem. Produktionen start nu ved tryk på 'start'- knappen. Når en leverpostigproduceer fæ på et transportbånd) Samhørende værdier af UID dan aktuelle vægt kirim serielt til node-RED, som viser de opsamlede data på dashboard 'et. Samtidig skrives timestamp, UID dan vægt i en ny pated række daftar tidspunkt ikke tilskrives værdier til rangeNr og orderID vil de have værdien NULL.

Med et timerinterval undersøger C# program dipatenkanb.patelogtabellen untuk 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 producer, afsluttes ordren ved tryk på”stop”- knappen. Når ordren afsluttes, tilføjes en række til patedb.ordertable med de aktuelle ordredata. Nr en ordre er afsluttet, kan kan de opsamlede data i patelog tablelen fremvises ved at trykke på de forskellige knapper i gruppen Update DataGridview. dapat dipesan kan også vises, og der kan sges ordredata på individualeller UID'er eller kundedata på individualelle order.

menggunakan Sistem;menggunakan System. Collections. Generic; menggunakan System. ComponentModel; menggunakan System. Data; menggunakan System. Drawing; menggunakan System. Linq; menggunakan System. Text; menggunakan System. Threading. Tasks; menggunakan System. Windows. Forms; menggunakan MySql. Data. MySqlClient;

namespace show_data_from_database

{ public partial class Form1: Form { MySqlConnection connection = new MySqlConnection("datasource=localhost; username=root; password=''"); int NomorBaris = 0; // Variabel untuk menyimpan nilai pateID int RangeNumber = 0; //Variabel untuk menyimpan rangenumber int weight =0; // Variabel untuk menyimpan bobot int OrderNr = 0; // Variabel untuk menyimpan OrderNR int QuantProduced = 0; //Variabel untuk menyimpan kuantitas yang dihasilkan int NumberOfRows = 0; //jumlah baris dengan nulls.. bool ProdRunning = false; //Variabel yang menunjukkan apakah tombol start & stop telah diaktifkan int limit = new int[6];// initialize array int CustomerID; // Variabel untuk menyimpan customerID public Form1() { InitializeComponent(); beban_tabel(); // panggil load_table }

batalkan beban_tabel()

{ Perintah MySqlCommand = new MySqlCommand("SELECT * FROM patedb.patelog ORDER BY timestamp DESC;", koneksi); coba { Adaptor MySqlDataAdapter = new MySqlDataAdapter(); adapter. SelectCommand = perintah; DataTable dbdataset = DataTable baru(); adaptor. Isi(dbdataset); BindingSource bsource = new BindingSource(); bsource. DataSource = kumpulan data; dataGridView1. DataSource = bsumber; SetRowOrder(); adaptor. Pembaruan(dbdataset); } catch (Pengecualian ex) { MessageBox. Show(ex. Message); } }

kekosongan pribadi SetRowOrder()

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

private void GetData_Click(pengirim objek, EventArgs e) // Membaca tabel database dan pesanan berdasarkan Timestamp

{ memuat_tabel(); }

private void btnRefreshUID_Click(pengirim objek, EventArgs e) //

{ string timeStr = "PILIH * DARI patedb.patelog ORDER OLEH UID;"; Perintah MySqlCommand = new MySqlCommand(timeStr, koneksi); coba { Adaptor MySqlDataAdapter = new MySqlDataAdapter(); adapter. SelectCommand = perintah; DataTable dbdataset = new DataTable(); adaptor. Isi(dbdataset); BindingSource bsource = new BindingSource(); bsource. DataSource = kumpulan data; dataGridView1. DataSource = bsumber; SetRowOrder(); adaptor. Pembaruan(dbdataset); } catch (Pengecualian ex) { MessageBox. Show(ex. Message); } }

private void btnRefreshValue_Click(pengirim objek, EventArgs e)

{ string weightSort = "PILIH * FROM patedb.patelog ORDER BY CAST(berat SEBAGAI INTEGER YANG DITANDATANGANI);"; Perintah MySqlCommand = new MySqlCommand(weightSort, koneksi); coba { Adaptor MySqlDataAdapter = new MySqlDataAdapter(); adapter. SelectCommand = perintah; DataTable dbdataset = new DataTable(); adaptor. Isi(dbdataset); BindingSource bsource = new BindingSource(); bsource. DataSource = kumpulan data; dataGridView1. DataSource = bsumber; SetRowOrder(); adaptor. Pembaruan(dbdataset); } catch (Pengecualian ex) { MessageBox. Show(ex. Message); } }

private void ChkNullBtn_Click(pengirim objek, EventArgs e)

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

kekosongan pribadi CheckTableForNull()

{ //Check/set timerinterval minimum 100 ms int i; int. TryParse(textTimer1. Text, keluar i); if (i <100) { timer1. Stop(); saya = 100; timer1. Interval = i; MessageBox. Show("Nilai minimum i 100mS"); timer1. Mulai(); } else { timer1. Interval = i; } textTimer1. Text = timer1. Interval. ToString(); //Periksa apakah ada baris dengan null yang tersedia di tabel, mengembalikan jumlah baris dalam variabel:NumberOfRows string weightStr = ""; string chkNull = "PILIH JUMLAH(*) FROM patedb.patelog WHERE rangeNR IS NULL ORDER BY pateID LIMIT 1;"; Perintah MySqlCommand = new MySqlCommand(chkNull, koneksi); coba { koneksi. Buka(); NumberOfRows = Convert. ToInt32(command. ExecuteScalar()); koneksi. Tutup(); } catch (Pengecualian ex) { MessageBox. Show(ex. Message); } akhirnya { if (NumberOfRows != 0) { try { //Memilih nomor pateID terendah di mana rangeNr is NULL string readID = "SELECT pateID FROM patedb.patelog WHERE rangeNR IS NULL ORDER BY pateID ASC LIMIT 1;"; MySqlCommand cmdID = new MySqlCommand(readID, koneksi); { koneksi. Buka(); RowNumber = (int)cmdID. ExecuteScalar(); //bilangan bulat!! koneksi. Tutup(); } listPateID. Text = RowNumber. ToString(); // membaca nomor PateID yang dipilih // Memilih bobot dari nomor baris yang dipilih baris string = RowNumber. ToString(); string readweight = "PILIH bobot FROM patedb.patelog WHERE pateID=" + baris; MySqlCommand cmdweight = new MySqlCommand(berat baca, koneksi); { koneksi. Buka(); weightStr = (string)cmdweight. ExecuteScalar(); //Rangkaian !! koneksi. Tutup(); } berat = int. Parse(weightStr); // konversi ke int txtWeight. Text = weight. ToString(); // cetak int RangeNumber = 0; if (berat>= batas[0] && berat = batas[2] && berat = batas[4] && berat <= batas[5]) { RangeNumber = 3; } } txtRange. Text = RangeNumber. ToString(); Perbarui Log(); } catch (Pengecualian ex) { MessageBox. Show(ex. Message); } QuantProduced = QuantProduced + 1; } } } private void btnStart_Click(pengirim objek, EventArgs e) { if (ProdRunning == false) { int valtest; coba { CustomerID = int. Parse(txtCustomerNr. Text); //read customerID } catch { MessageBox. Show("Masukkan data produksi dan tekan tombol 'mulai'."); }

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

MySqlCommand cmdtestcustomer = new MySqlCommand(tes, koneksi); { koneksi. Buka(); valtest = Convert. ToInt32(cmdtestcustomer. ExecuteScalar()); // mengembalikan 0 jika pelanggan tidak ada koneksi. Tutup(); } if (valtest==1) // jika pelanggan ada di database - mulai produksi { try { OrderNr = int. Parse(txtOrderNumber. Text); ProdRunning = benar; timer1. Mulai(); textTimer1. Text = timer1. Interval. ToString(); Batas Baca(); } catch (Exception ex) { MessageBox. Show("Masukkan data produksi dan tekan tombol 'mulai'."); } } else MessageBox. Show("Pelanggan tidak ada di database, coba lagi"); } //Batas Baca(); }

kekosongan pribadi ReadLimits()

{ // Membaca batas dari rangetable, range 1 sampai 3 int counter = 0; for (int rangeNr = 1; rangeNr < 4; rangeNr++) { string readmin = "SELECT rangeMin FROM patedb.rangetable WHERE rangeNr=" + rangeNr; MySqlCommand cmdmin = new MySqlCommand(admin ulang, koneksi); { koneksi. Buka(); batas[penghitung] = (int)cmdmin. ExecuteScalar(); penghitung = penghitung + 1; koneksi. Tutup(); } // MessageBox. Show(counter. ToString()); string readmax = "PILIH rangeMax FROM patedb.rangetable WHERE rangeNr=" + rangeNr; MySqlCommand cmdmax = new MySqlCommand(readmax, koneksi); { koneksi. Buka(); batas[penghitung] = (int)cmdmax. ExecuteScalar(); penghitung = penghitung + 1; koneksi. Tutup(); } } // akhir untuk loop }

kekosongan pribadi UpdateLog()

{ // UPDATE rangeNR & orderID string Range = RangeNumber. ToString(); string Urutan = OrderNr. ToString(); string update = "PERBARUI patedb.patelog SET rangeNr= "+Range+', ' + "orderID= "+OrderNr+" WHERE pateID="+RowNumber; MySqlCommand updatecmd = new MySqlCommand(perbarui, koneksi); coba { koneksi. Buka(); updatecmd. ExecuteNonQuery(); koneksi. Tutup(); } catch (Pengecualian ex) { MessageBox. Show(ex. Message); } }

private void btnStop_Click(pengirim objek, EventArgs e)

{ if (ProdRunning == true) { timer1. Stop(); ProdRunning = salah; UpdateOrderTable(); } else { MessageBox. Show("Belum ada produksi yang dimulai. Masukkan data dan tekan tombol 'mulai'"); } }

kekosongan pribadi 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 = new MySqlCommand(masukkan, koneksi); coba { koneksi. Buka(); insertcmd. ExecuteNonQuery(); koneksi. Tutup(); Jumlah yang Dihasilkan = 0; } catch (Pengecualian ex) { MessageBox. Show(ex. Message); } }

private void timer1_Tick(pengirim objek, EventArgs e)

{ CheckTableForNull(); beban_tabel(); }

private void btnShowOrderTable_Click(pengirim objek, EventArgs e)

{ if (ProdRunning == false) { Perintah MySqlCommand = new MySqlCommand("SELECT * FROM patedb.ordertable ORDER BY orderID DESC;", koneksi); coba { Adaptor MySqlDataAdapter = new MySqlDataAdapter(); adapter. SelectCommand = perintah; DataTable dbdataset = new DataTable(); adaptor. Isi(dbdataset); BindingSource bsource = new BindingSource(); bsource. DataSource = kumpulan data; dataGridView1. DataSource = bsumber; adaptor. Pembaruan(dbdataset); } catch (Pengecualian ex) { MessageBox. Show(ex. Message); } } else { MessageBox. Show("Tekan berhenti untuk wiev orderTable"); } }

private void btnShowOrderDetails_Click(pengirim objek, 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 + "'"); Perintah MySqlCommand = new MySqlCommand(tes, koneksi); coba { koneksi. Buka(); Adaptor MySqlDataAdapter = baru MySqlDataAdapter(); adapter. SelectCommand = perintah; DataTable dbdataset = new DataTable(); adaptor. Isi(dbdataset); BindingSource bsource = new BindingSource(); bsource. DataSource = kumpulan data; dataGridView1. DataSource = bsumber; adaptor. Pembaruan(dbdataset); } catch (Pengecualian ex) { MessageBox. Show(ex. Message); } koneksi. Tutup(); } else { MessageBox. Show("Tekan berhenti untuk melihat detail pesanan"); } }

private void btnShowCustomerDetails_Click(pengirim objek, 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 + "'"); Perintah MySqlCommand = new MySqlCommand(tes, koneksi); coba { Adaptor MySqlDataAdapter = new MySqlDataAdapter(); adapter. SelectCommand = perintah; DataTable dbdataset = new DataTable(); adaptor. Isi(dbdataset); BindingSource bsource = new BindingSource(); bsource. DataSource = kumpulan data; dataGridView1. DataSource = bsumber; adaptor. Pembaruan(dbdataset); } catch (Pengecualian ex) { MessageBox. Show(ex. Message); } } else { MessageBox. Show("Tekan berhenti untuk melihat detail pelanggan"); } } }

}

Direkomendasikan: