Isi kandungan:

EAL-Industri4.0-RFID Dataopsamling Til Pangkalan Data: 10 Langkah (dengan Gambar)
EAL-Industri4.0-RFID Dataopsamling Til Pangkalan Data: 10 Langkah (dengan Gambar)

Video: EAL-Industri4.0-RFID Dataopsamling Til Pangkalan Data: 10 Langkah (dengan Gambar)

Video: EAL-Industri4.0-RFID Dataopsamling Til Pangkalan Data: 10 Langkah (dengan Gambar)
Video: IoT & IR 4.0 - Disruptive Era 2024, Julai
Anonim
Pangkalan Data Til Dataopsamling EAL-Industri4.0-RFID
Pangkalan Data Til Dataopsamling EAL-Industri4.0-RFID

Dette projekt omhandler opsamling af vægtdata, mendaftarkan af identiteter vha. RFID, ketinggalan data di pangkalan data MySQL. node-RED, samt fremvisning og behandling af de opsamlede data i et C # program i form af Windows Form Application. Vi pembakar hutan os følgende:

Vi har en produktionslinje som pengeluar leverpostej i 200g foliebakker. Alle færdigbagte leverpostejer udstyres efter afkøling med et RFID tag i plasticlåget / labelen, som indeholder et unikt ID (UID = Unique Identifier, er en 32 bit bits, 8 hexadecimale karakterer) for entydig identificationation 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), og da kunderne hver har et specifikt krav færdigvægten, bruges UID tagget til at knytte hver enkelt leverpostet lag lag leverpostejer til én specifik kunde. Kunderne er supermarkedskæder:

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

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

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

Der er således følgende sorteringer:

Julat0: di luar jangkauan

Julat1: minimum 190g / maksimum210g

Julat2: minimum 180g / maksimum220g

Julat3: minimum 170g / maksimum230g

Langkah 1: Opsamling Af Data untuk Pendaftar Vægt Samt Af UID

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

Hingga opsamling data af untuk vægt, samt pendaftar tag RFID er anvendt en Arduino MEGA2560 med en RFID-RC522 pembaca / penulis. Da vi ikke har nogen vægt, simulatorer 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 og + 5V, midterbenet er tilsluttet AN0

RFID-RC522 er tilsluttet Arduino boardets 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

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

Langkah 2: Program Arduino

I Arduino programmet inkluderes de to biblioteker SPI.h og MFRC522.h untuk di kunne bruge RFID læseren. Saya memulakan pemboleh ubah program inisiales de anvendte. Der laves en instan MFRC522. Saya Siapkan blokken initialiseres den serielle banindelse, SPI port og MFRC522. Batalkan pengimbasan dengan label RFID. Untuk ikke at sende det samme UID yang terkena flere gange efter hinanden, er der lavet en stump code som tjekker for dette. N derr der er scannet et UID tag, memuatkan banyak 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 og oldUID er ens, er der tale om samme UID tag dan UID'et skal ignoreres. Hvis der er tale om et nyt UID, menghantar UID'et på den serielle port sammen med en læst værdi fra den serielle port. Den analog værdi skaleres til området 150-250. Data menghantar som dan komma-separeret tekststreng. Som det sidste sættes oldUID = nyUID, sledes at koden klart til at læse et nyt RFID tag.. Den sidste funktion i programmet er den funktion som sammenligner 2 tatasusunan. Funktionen returnerer benar hvis array'ne er ens, og false hvis array'ne er forskellige.

#sertakan

#include // Program ini mengimbas kad RFID menggunakan papan pembaca / penulis RDIF-RC522. // UID dibaca, pin analog dibaca. Nilai analog 0-1023 ditingkatkan menjadi 150-250. // UID dan nilai analog dihantar sebagai teks yang dipisahkan koma pada port bersiri menggunakan 9600, N, 8, 1. // Perhatian telah diambil untuk hanya menghantar setiap UID satu kali berturut-turut, // UID baru harus hadir sebelum UID yang sama dapat dihantar lagi. // Fungsi ini diimplementasikan dalam kod dengan membandingkan tatasusunan: oldUID nyUID dalam fungsi array_cmp (oldUID , nyUID )

constexpr uint8_t RST_PIN = 5;

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

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

persediaan tidak sah ()

{Serial.begin (9600); // Memulakan komunikasi bersiri SPI.begin (); // Mulakan bas SPI mfrc522. PCD_Init (); // Mulakan MFRC522}

gelung kosong ()

{// Cari kad baru jika (! Mfrc522. PICC_IsNewCardPresent ()) {kembali; } // Pilih salah satu kad jika (! Mfrc522. PICC_ReadCardSerial ()) {return; } // muat nyUID dengan teg UID untuk (byte i = 0; i <mfrc522.uid.size; i ++) {nyUID = mfrc522.uid.uidByte ; } // if oldUID nyUID if (! array_cmp (oldUID, nyUID)) {// hantar tag UID pada port bersiri untuk (byte i = 0; i 1000) {Value = 1000; } Nilai = (Nilai / 10) + 150; // hantar nilai analog berskala. Cetak (Nilai); // hantar Serial.println barisan baru (); // tetapkan oldUID = nyUID untuk (byte z = 0; z <4; z ++) oldUID [z] = nyUID [z]; } // tunggu kelewatan 1 saat (1000); }

// bandingkan 2 tatasusunan …

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

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

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

Følgende flow er lavet i node-MERAH:

COM4 er den serielle hadindelse hvor modtages data dari Arduino boardet. Funktionerne "Split and Get value" og "Split and Get UID" splitter teksstrengen ved kommaet og returnere hhv vægten og UID. Bruges bruges hingga frashing på dashboardet i et linechart og en skala. UID membuat frasa kerja dan tekstfelt. Funktionen test_sound advarer verbalt med sætningen "Out of range", hvis vægten er under 170g eller lebih dari 230g, dvs i range 0.

Nilai split dan Get:

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

temp = {muatan: (output [1])}; pulangan temp;

Pisahkan dan Dapatkan UID:

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

temp = {muatan: output [0]}; pulangan temp;

test_sound:

nombor var = parseInt (msg.payload);

if (number> 230 || number <170) {newMsg = {payload: "Di luar jangkauan"}; kembali baruMsg; } lain {newMsg = {payload: ""}; kembali baruMsg; }

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

var output = msg.payload.split (","); // bahagikan msg.payload dengan koma menjadi array

UIDTag = output [0]; // bahagian pertama ke kedudukan pertama [0] ValueTag = output [1]; // bahagian kedua ke kedudukan kedua [1]

var m = {

topic: "INSERT INTO patedb.patelog (cap waktu, UID, weight) NILAI ('" + Tarikh baru (). toISOString () + "', '" + UIDTag + "', '" + ValueTag + "');" }; pulangan m;

patelog er en Pangkalan data MySQL melarang somet sat op med følgende parametre:

Tuan rumah: localhost

Pelabuhan: 3306

Pengguna: root

Pangkalan data: patedb

Langkah 4: Reka bentuk pangkalan data

Reka bentuk pangkalan data
Reka bentuk pangkalan data

Databasen patedb indeholder 4 tabeller

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

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

er et kunderegister yang boleh disesuaikan

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

Langkah 5: Patelog

Patelog
Patelog

Tabellen patelog indeholder folgende 6 kolonner:

kunci utama (int) er utama inkrementeres automatisk.

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

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

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

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 detektere de rækker som skal tilskrives værdier untuk rangeNr og orderID

Langkah 6: Jadual Pesanan

Jadual pesanan
Jadual pesanan

meja makan indeholder 5 kolonner:

orderID (int) er det aktuelle ordrenummer

orderQuant (mediumint) er ordens pålydende antal

quantProduced (mediumint) er antal der rent faktisk er produser på ordren. (Tælles af C # programmetik)

komen (tinytext) er en eventuel kommentar til ordren.

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

Langkah 7: Boleh disesuaikan

Boleh disesuaikan
Boleh disesuaikan

kolonner indeholder 6 disesuaikan:

customerID (int) er utama utama o auto inc.

nama, alamat, telefon, e-mel (varchar) med forskellig max længde

rangeNr (int)

Langkah 8: Boleh disusun semula

Rangetable
Rangetable

kolonner indeholder 3 berjadual:

rangeNr (int) er utama utama o auto inc.

rangeMin (int)

julatMaks (int)

Langkah 9: Program C #

Program C #
Program C #

N derr der produser en ordre leverpostej, er Proceduren 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 leverpostej er færdigproduceret ergetes, eretet erenetes pt et transportbånd) Samhørende værdier af UID og den aktuelle vægt sendes serielt til node-RED, som viser de opsamlede data på dashboard 'et. tidspunkt ikke tilskrives værdier til rangeNr 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 derr der er detekteret en række med NULL værdi, beregnes rangeNr og det tilføjes sammen med det aktuelle orderID. N producerr en ordre er produser, afsluttes ordren ved tryk på "berhenti" - knappen. Nrr ordren afsluttes, tilføjes en række til patedb.ordertable med de aktuelle ordredata. N enr en ordre er afsluttet, kan kan de opsamlede data i patelog tabellen fremvises ved at trykke på de forskellige knapper i gruppen Kemas kini DataGridview. meja pesanan boleh dilihat, og der kan søges ordredata på individueller UID'er eller kundedata på individualuelle ordrer.

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 = MySqlConnection baru ("datasource = localhost; username = root; password = ''"); int RowNumber = 0; // Pemboleh ubah untuk menyimpan nilai pateID int RangeNumber = 0; // Pemboleh ubah untuk menyimpan jumlah antara berat badan = 0; // Pembolehubah untuk menyimpan berat int OrderNr = 0; // Pemboleh ubah untuk menyimpan OrderNR int QuantProduced = 0; // Pemboleh ubah untuk menyimpan kuantiti yang dihasilkan int NumberOfRows = 0; // bilangan baris dengan nol.. bool ProdRunning = false; // Pemboleh ubah menunjukkan jika butang mula & berhenti telah diaktifkan int had = int baru [6]; // inisialisasi array int CustomerID; // Pemboleh ubah untuk menyimpan borang awam customerID1 () {InitializeComponent (); jadual_ muat (); // panggilan panggilan_ meja}

kosongkan_label_label ()

{MySqlCommand command = MySqlCommand baru ("SELECT * FROM patedb.patelog ORDER BY timestamp DESC;", sambungan); cuba {MySqlDataAdapter adapter = MySqlDataAdapter baru (); penyesuai. SelectCommand = arahan; DataTable dbdataset = Jadual Data baru (); penyesuai. Isi (dbdataset); BindingSource bsource = BindingSource baru (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); penyesuai. Kemas kini (dbdataset); } tangkapan (Exception ex) {MessageBox. Show (ex. Message); }}

kekosongan peribadi 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 drndres dataGridView1. Columns ["UID"]. DisplayIndex = 2; // Her kan rækkefølgen af kolonner ændres dataGridView1. Columns ["weight"]. DisplayIndex = 3; // Her kan rækkefølgen af kolonner ændres dataGridView1. Columns ["rangeNr"]. DisplayIndex = 4; // Her kan rækkefølgen af kolonner ændres dataGridView1. Columns ["orderID"]. DisplayIndex = 5; // Dia kan rækkefølgen af kolonner ændres}

kekosongan peribadi GetData_Click (pengirim objek, EventArgs e) // Membaca jadual pangkalan data dan pesanan mengikut Cap Waktu

{load_table (); }

batal peribadi btnRefreshUID_Click (penghantar objek, EventArgs e) //

{string timeStr = "PILIH * DARI patedb.patelog PESANAN OLEH UID;"; Perintah MySqlCommand = MySqlCommand baru (timeStr, sambungan); cuba {MySqlDataAdapter adapter = MySqlDataAdapter baru (); penyesuai. SelectCommand = arahan; DataTable dbdataset = DataTable baru (); penyesuai. Isi (dbdataset); BindingSource bsource = BindingSource baru (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); penyesuai. Kemas kini (dbdataset); } tangkapan (Exception ex) {MessageBox. Show (ex. Message); }}

kekosongan peribadi btnRefreshValue_Click (penghantar objek, EventArgs e)

{string weightSort = "PILIH * DARI patedb.patelog PESANAN MENGIKUT KAST (berat SEBAGAI INTEGER TANDA);"; Perintah MySqlCommand = MySqlCommand baru (weightSort, sambungan); cuba {MySqlDataAdapter adapter = MySqlDataAdapter baru (); penyesuai. SelectCommand = arahan; DataTable dbdataset = DataTable baru (); penyesuai. Isi (dbdataset); BindingSource bsource = BindingSource baru (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); penyesuai. Kemas kini (dbdataset); } tangkapan (Exception ex) {MessageBox. Show (ex. Message); }}

kekosongan peribadi ChkNullBtn_Click (penghantar objek, EventArgs e)

{if (ProdRunning) {CheckTableForNull (); jadual_ muat (); }}

kekosongan peribadi CheckTableForNull ()

{// Periksa / tetapkan selang waktu minimum 100 ms int i; int. TryParse (textTimer1. Teks, keluar i); jika (i <100) {timer1. Stop (); i = 100; pemasa1. Selang = i; MessageBox. Show ("Nilai minimum i 100mS"); pemasa1. Mulakan (); } lain {timer1. Interval = i; } textTimer1. Text = timer1. Interval. ToString (); // Periksa sama ada baris dengan nol tersedia dalam jadual, mengembalikan bilangan baris dalam pemboleh ubah: NumberOfRows string weightStr = ""; string chkNull = "SELECT COUNT (*) DARI patedb.patelog MANA julatNR ADALAH NULL ORDER MENGIKUT had pateID 1;"; Perintah MySqlCommand = MySqlCommand baru (chkNull, sambungan); cuba {sambungan. Buka (); NumberOfRows = Convert. ToInt32 (command. ExecuteScalar ()); sambungan. Tutup (); } tangkapan (Exception ex) {MessageBox. Show (ex. Message); } akhirnya {if (NumberOfRows! = 0) {try {// Memilih nombor pateID terendah di mana rangeNr adalah rentetan NULL readID = "SELECT pateID DARI patedb.patelog DI MANA rangeNR ADALAH NULL ORDER OLEH PATID ASC LIMIT 1;"; MySqlCommand cmdID = MySqlCommand baru (readID, sambungan); {sambungan. Buka (); RowNumber = (int) cmdID. ExecuteScalar (); // bilangan bulat !! sambungan. Tutup (); } listPateID. Text = RowNumber. ToString (); // baca nombor PateID yang dipilih // Pilih berat dari baris rentetan nombor yang dipilih = RowNumber. ToString (); string readweight = "PILIH berat DARI patedb.patelog DI MANA pateID =" + baris; MySqlCommand cmdweight = MySqlCommand baru (berat baca, sambungan); {sambungan. Buka (); weightStr = (string) cmdweight. ExecuteScalar (); //Tali !! sambungan. Tutup (); } berat = int. Parse (weightStr); // tukar ke int txtWeight. Text = weight. ToString (); // cetak int RangeNumber = 0; jika (berat> = had [0] && berat = had [2] && berat = had [4] && berat <= had [5]) {RangeNumber = 3; }} txtRange. Text = RangeNumber. ToString (); Kemas kiniLog (); } tangkapan (Exception ex) {MessageBox. Show (ex. Message); } QuantProduced = QuantProduced + 1; }}} batal peribadi btnStart_Click (penghantar objek, EventArgs e) {if (ProdRunning == false) {int valtest; cuba {CustomerID = int. Parse (txtCustomerNr. Text); // baca customerID} tangkap {MessageBox. Show ("Masukkan data pengeluaran dan tekan butang 'mula'."); }

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

MySqlCommand cmdtestcustomer = MySqlCommand baru (ujian, sambungan); {sambungan. Buka (); valtest = Convert. ToInt32 (cmdtestcustomer. ExecuteScalar ()); // mengembalikan 0 jika pelanggan tidak ada sambungan. Tutup (); } if (valtest == 1) // jika pelanggan ada dalam pangkalan data - mulakan pengeluaran {cuba {OrderNr = int. Parse (txtOrderNumber. Text); ProdRunning = benar; pemasa1. Mulakan (); textTimer1. Text = timer1. Interval. ToString (); Batas Baca (); } catch (Exception ex) {MessageBox. Show ("Masukkan data pengeluaran dan tekan butang 'start'."); }} lain MessageBox. Show ("Pelanggan tidak ada dalam pangkalan data, cuba lagi"); } // ReadLimits (); }

had Baca tidak sah peribadi ()

{// Membaca had dari julat, julat 1 hingga 3 kaunter int = 0; untuk (int rangeNr = 1; rangeNr <4; rangeNr ++) {string readmin = "SELECT rangeMin FROM patedb.rangetable WHERE rangeNr =" + rangeNr; MySqlCommand cmdmin = MySqlCommand baru (readmin, sambungan); {sambungan. Buka (); had [counter] = (int) cmdmin. ExecuteScalar (); pembilang = pembilang + 1; sambungan. Tutup (); } // MessageBox. Show (counter. ToString ()); string readmax = "SELECT rangeMax FROM patedb.rangetable WHERE rangeNr =" + rangeNr; MySqlCommand cmdmax = MySqlCommand baru (readmax, sambungan); {sambungan. Buka (); had [counter] = (int) cmdmax. ExecuteScalar (); pembilang = pembilang + 1; sambungan. Tutup (); }} // tamat untuk gelung}

kekosongan peribadi UpdateLog ()

{// UPDATE 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 = MySqlCommand baru (kemas kini, sambungan); cuba {sambungan. Buka (); updatecmd. ExecuteNonQuery (); sambungan. Tutup (); } tangkapan (Exception ex) {MessageBox. Show (ex. Message); }}

kekosongan peribadi btnStop_Click (penghantar objek, EventArgs e)

{if (ProdRunning == true) {timer1. Stop (); ProdRunning = palsu; UpdateOrderTable (); } lain {MessageBox. Show ("Belum ada pengeluaran yang dimulakan. Masukkan data dan tekan butang 'start'"); }}

kemas kini kekosongan peribadiOrderTable ()

{string insert = "INSERT INTO patedb.ordertable (orderID, orderQuant, quantProduced, comment, customerID) NILAI ('" + this.txtOrderNumber. Text + "', '" + this.txtOrderQuant. Text + "', '" + QuantProduced. ToString () + "','" + this.txtComment. Text + "','" + this.txtCustomerNr. Text + "');"; MySqlCommand insertcmd = MySqlCommand baru (masukkan, sambungan); cuba {sambungan. Buka (); masukkancmd. ExecuteNonQuery (); sambungan. Tutup (); QuantProduced = 0; } tangkapan (Exception ex) {MessageBox. Show (ex. Message); }}

pemasa kekosongan peribadi1_Tick (penghantar objek, EventArgs e)

{CheckTableForNull (); jadual_ muat (); }

kekosongan peribadi btnShowOrderTable_Click (penghantar objek, EventArgs e)

{if (ProdRunning == false) {Perintah MySqlCommand = MySqlCommand baru ("SELECT * FROM patedb.ordertable ORDER BY orderID DESC;", sambungan); cuba {MySqlDataAdapter adapter = MySqlDataAdapter baru (); penyesuai. SelectCommand = arahan; DataTable dbdataset = DataTable baru (); penyesuai. Isi (dbdataset); BindingSource bsource = BindingSource baru (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; penyesuai. Kemas kini (dbdataset); } tangkapan (Exception ex) {MessageBox. Show (ex. Message); }} lain {MessageBox. Show ("Tekan berhenti untuk wiev orderTable"); }}

batal peribadi btnShowOrderDetails_Click (penghantar 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 DI SANA patedb.patelog. UID = '"+ txtShowOrderDetails. Text +"' "); Perintah MySqlCommand = MySqlCommand baru (ujian, sambungan); cuba {sambungan. Buka (); Adaptor MySqlDataAdapter = MySqlDataAdapter baru (); penyesuai. SelectCommand = arahan; DataTable dbdataset = DataTable baru (); penyesuai. Isi (dbdataset); BindingSource bsource = BindingSource baru (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; penyesuai. Kemas kini (dbdataset); } tangkapan (Exception ex) {MessageBox. Show (ex. Message); } sambungan. Tutup (); } lain {MessageBox. Show ("Tekan berhenti untuk melihat butiran pesanan"); }}

kekosongan peribadi btnShowCustomerDetails_Click (penghantar 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 DI MANA patedb.ordertable.orderID = '"+ txtShowCustomerDetails. Text +"' "); Perintah MySqlCommand = MySqlCommand baru (ujian, sambungan); cuba {MySqlDataAdapter adapter = MySqlDataAdapter baru (); penyesuai. SelectCommand = arahan; DataTable dbdataset = DataTable baru (); penyesuai. Isi (dbdataset); BindingSource bsource = BindingSource baru (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; penyesuai. Kemas kini (dbdataset); } tangkapan (Exception ex) {MessageBox. Show (ex. Message); }} lain {MessageBox. Show ("Tekan hentian untuk mendapatkan maklumat pelanggan"); }}}

}

Disyorkan: