Connessione a DB SQL

di il
23 risposte

Connessione a DB SQL

Buonasera a tutti,

sto creando un app per la mia azienda per la consultazione delle giacenze di magazzino su alcuni pannelli operatore agganciati ai muletti in accoppiata con delle pistole bluetooth.
Considerando che i pannelli non sono molto performanti, scrivendo in c# vorrei un parere anche da voi su che tipo di codice utilizzare per ottimizzare al meglio la connessione ad un db sql: in pratica devo collegare una vista, e magari con qualche textbox o combobox fare la ricerca di un codice articolo o di uno dei dati presenti nella vista.

Grazie mille in anticipo a tutti quelli che risponderanno.

Saluti

23 Risposte

  • Re: Connessione a DB SQL

    DiegoLuppi1993 ha scritto:


    scrivendo in c# vorrei un parere anche da voi su che tipo di codice utilizzare per ottimizzare al meglio la connessione ad un db sql
    Non è assolutamente chiaro qual è il tipo di parere che stai cercando nello specifico.

    Innanzitutto, sarebbe opportuno indicare qual è il database di cui si sta parlando. Una volta stabilito questo, il passo successivo è banalmente collegarsi al database usando la libreria opportuna (o meglio il provider ADO.NET dedicato), ma questo codice si trova già facilmente documentandosi sull'uso di basi dati generico con C# e .NET (o cercando appunto ADO.NET nella documentazione ufficiale).

    Se queste cose sono già note, allora bisogna spiegare meglio quale tipo di ottimizzazione si sta cercando, oppure qual è l'aspetto particolare su cui si nutrono dubbi, indicando anche quali sono (ovviamente).

    Ciao!
  • Re: Connessione a DB SQL

    Quello che hai scritto non ha molto senso:

    1) cosa vuol dire "pannelli non performanto"? Le performance dipendono NON SOLO dal linguaggio di programmazione, ma anche dall'implementazione e da chi deve usare l'applicazione. Serve a poco un'applicazione in grado di rispondere al microsecondo se viene usata da un essere umano, i cui tempi di reazione sono nell'ordine dei decimi di secondo.
    2) le performance del 99.999% dei database e' ordine di grandezza (cioe' 100/1000/10.000 e anche piu')) superiori alle necessita' dell'utente medio, ed in particolare dell'applicazione che dai descritto.

    Inizi ad avere problemi di performance su db in applicazioni che devono fare migliaia di interrogazioni al secondo su tabelle con centinaia di milioni/miliardi di record. Ma anche qui' e' ""relativo"" perche' ci sono n-mila modi per migliorare le performance in modo estremo.

    Il problema, eventualmente, e' un'altro: per realizzare un'applicazione ""mediamente complessa"" servono ""buone competenze"" di sviluppo software che vanno MOLTO OLTRE la banale conoscenza di un linguaggio di programmazione. Il linguaggio e' lo 0.000001% di quello che serve sapere. NON E' LUI l'eventuale ""collo di bottiglia"", ma l'approccio al problema, l'utilizzo di soluzioni troppo semplicistiche, ed n-mila altri dettagli.
  • Re: Connessione a DB SQL

    Buongiorno a tutti,

    avevo saltato l'introduzione ma riparto dall'inizio così forse è più chiaro il tutto: l'app in questione verrebbe utilizzata con dei pannelli operatore Honerywell Thor VM3 penso che sicuramente li conoscerete o qualcuno ci avrà già anche lavorato...il database è di dimensioni di circa 50gb appartenente al gestionale ERP di TeamSystem, ma la vista che dovrebbe interrogare avrà al massimo 4/5 mila record non di più.
    La parte di connessione e quella propedeutica è ben chiara quindi passiamo oltre: stavo pensando a quale fosse la strada migliore per la modalità di visualizzazione di questa vista, che non serve venga visualizzata per intero (o meglio, non è necessario); avevo pensato ad una combobox con la lista degli articoli ma sembra quasi inutile per lo scopo a cui mi serve, quindi pensavo sinceramente ad una textbox con un button che un volta premuto restituisca il risultato richiesto e in caso di errore un semplice messagebox senza tante particolarità, giusto per non appesantire il codice...
  • Re: Connessione a DB SQL

    DiegoLuppi1993 ha scritto:


    stavo pensando a quale fosse la strada migliore per la modalità di visualizzazione di questa vista, che non serve venga visualizzata per intero (o meglio, non è necessario); avevo pensato ad una combobox con la lista degli articoli ma sembra quasi inutile per lo scopo a cui mi serve, quindi pensavo sinceramente ad una textbox con un button che un volta premuto restituisca il risultato richiesto e
    Ok, quindi abbiamo appreso che si tratta di una lista di articoli, però non è chiaro quali sono le funzionalità che l'utente dovrebbe fruire all'interno di questa maschera... una ricerca preventiva? una selezione? magari multipla? una navigazione semplice?
    in caso di errore un semplice messagebox senza tante particolarità, giusto per non appesantire il codice...
    Onestamente, chiarirei (e poi spiegherei a noi) le prerogative di questa maschera e mi concentrerei su quello che l'operatore deve fare... il presunto "appesantimento" del codice, ammesso che si possa misurare, dubito dipenda dalla costruzione di una maschera in più o l'uso al suo posto di una maschera standard.

    In sintesi, definiamo i requisiti (cosa si sta visualizzando? cosa deve poter fare l'utente?) e poi, partendo da questi, si vedono le soluzioni.

    Ciao!
  • Re: Connessione a DB SQL

    L'operatore, trattandosi di una maschera di consultazione, deve soltanto poter consultare questa lista in quanto i movimenti puri sono gestiti da un'altra app che abbiamo sviluppato per il magazzino; i campi potrebbero essere configurati così: Codice Articolo int (è un codice composto da 4 cifre), Descrizione Articolo string, lotto int (anche in questo caso codice di 4 cifre) ubicazione string e la quantità int...volgarmente parlando è una maschera in sola lettura dove poter consultare le giacenze per lotot e per ubicazione....
  • Re: Connessione a DB SQL

    DiegoLuppi1993 ha scritto:


    L'operatore, trattandosi di una maschera di consultazione, deve soltanto poter consultare questa lista in quanto i movimenti puri sono gestiti da un'altra app che abbiamo sviluppato per il magazzino; i campi potrebbero essere configurati così: Codice Articolo int (è un codice composto da 4 cifre), Descrizione Articolo string, lotto int (anche in questo caso codice di 4 cifre) ubicazione string e la quantità int...volgarmente parlando è una maschera in sola lettura dove poter consultare le giacenze per lotot e per ubicazione....
    Il termine "consultazione" può voler dire tutto oppure niente. Come funziona nel dettaglio?

    Esemplifico: quando si attiva l'applicazione, viene mostrata una lista di articoli direttamente? oppure c'è un filtro iniziale? su quali campi? se si fa una ricerca, è possibile entrare nel dettaglio delle righe mostrate? oppure le righe devono visualizzare tutto il necessario senza dover fare clic ed entrare all'interno?

    Questa è una definizione dei requisiti.

    "Maschera di sola lettura per consultare le giacenze" indica una finalità, ma non indica come questa viene espletata nel dettaglio, che è ciò che si ottiene dalla risposta alle domande che ho posto sopra.

    Io comunque, a partire dal titolo della discussione ("Connessione a DB SQL") non ho ancora capito qual è la problematica o il dubbio: si vuole capire qual è la query da eseguire per fornire i risultati richiesti all'utente? oppure si vuole capire qual è il modo migliore di visualizzare tali dati tramite una interfaccia? entrambe le cose?

    Più rileggo più non vedo problematiche, salvo quella di capire come deve funzionare la maschera nello specifico (vedi domande di cui sopra) e, una volta stabilito questo, trovare il modo più congeniale per visualizzare i dati in modo chiaro all'utente scrivendo la relativa applicazione e codificando l'esecuzione della query con le classi preposte (es. quelle di ADO.NET standard) per eseguire l'interrogazione del database e recuperare i dati che si vogliono visualizzare.

    In pratica, basta sapere quello che c'è da fare e creare l'applicazione con C#.
    Dov'è la difficoltà in questo?

    Se poi ci sono aggiustamenti necessari perché un dato è troppo piccolo, oppure c'è un campo da aggiungere, nel caso si faranno, ma di nuovo non riesco a comprendere cosa impedisca di iniziare a scrivere codice e implementare quella che appunto sembra una maschera di ricerca abbastanza semplice. Sarà un mio limite...

    Ciao!
  • Re: Connessione a DB SQL

    No beh magari sono anche io che non mi spiego bene è possibile eh figuriamoci...per me l'operatore deve poter consultare queste giacenze senza possibilità di modifica della tabella; ho iniziato a creare l'app con un form inziale, un menù gestito a button e tra questi button c'è il tasto giacenze.
    Da qui si apre un nuovo form dove pensavo inizialmente, per velocizzare le operazioni, di non far caricare nulla, ma di visualizzare soltanto questi campi: textbox dove poter scrivere il codice articolo (che sarebbe l'unico filtro utilizzabile in quanto per la nostra gestione è il più rapido), e con un button denominato cerca interroga la query e se il codice articolo risulta nella vista che andrò a collegare mi restituisce le righe con i campi che citavo prima...semplicemente questo nulla di più e nulla di meno...
  • Re: Connessione a DB SQL

    Ciao

    Sicuro di voler fare delle applicazioni che accedono al DB direttamente dal muletto?
    Per esperienza è controproducente:
    • spesso i mulettisti interagiscono in movimento (anche se non dovrebbero) con conseguente rischio di perdita di segnale
    • non sempre i muletti hanno HW abbastanza potente per fare certe operazioni
    • aggiornare i muletti non è sempre facile
    Io mi trovo benissimo con due alternative, a seconda del fatto che abbia bisogno o meno di accedere nativamente alle risorse dei PC:
    • sito web intranet (di fatto i muletti navigano in una pagina web)
    • client/server, in cui il client ha solo le logiche grafiche e l'accesso alle risorse richieste, il resto lo fa il server

    Valutale come opportunità
  • Re: Connessione a DB SQL

    PiGi78 ha scritto:


    Ciao

    Sicuro di voler fare delle applicazioni che accedono al DB direttamente dal muletto?
    Per esperienza è controproducente:
    • spesso i mulettisti interagiscono in movimento (anche se non dovrebbero) con conseguente rischio di perdita di segnale
    • non sempre i muletti hanno HW abbastanza potente per fare certe operazioni
    • aggiornare i muletti non è sempre facile
    Io mi trovo benissimo con due alternative, a seconda del fatto che abbia bisogno o meno di accedere nativamente alle risorse dei PC:
    • sito web intranet (di fatto i muletti navigano in una pagina web)
    • client/server, in cui il client ha solo le logiche grafiche e l'accesso alle risorse richieste, il resto lo fa il server

    Valutale come opportunità
    Ciao e grazie mille per la risposta innanzitutto

    guarda anche io all'inizio ero scettico, ma in un'ottica di rivoluzione interna proprio di infrastruttura IT abbiamo organizzato un bell'impianto a centro stella, con diversi quadri sparsi per il perimetro della fabbrica, collegamenti con fibra ottica multi modale, 20 access point configurati in mesh e devo dire che il risultato è stato sorprendente: abbiamo un'app specifica per l'intera gestione della movimentazione di magazzino in quanto leggiamo tutto da barcode e per ora ci stiamo trovando bene, i pannelli scrivono direttamente su DB e i tempi di risposta devo dire che sono ottimi.
    L'unica mia perplessità era un pò sui pannelli veicolari Thor VM3 che costano un pacco di soldi ma a prestazioni sono veramente scandalosi.
    Tralasciando questo piccolo ot (era solo per farti capire un attimo la gestione), questa app deve essere molto molto semplice rispetto a tutta la gestione, in quanto andrà a consultare soltanto delle giacenze di magazzino quindi come scrivevo in un qualche post precedente, i record non saranno molti massimo 4/5 mila...nel post successivo posterò il codice che ho creato fino ad ora...
  • Re: Connessione a DB SQL

    Per quanto riguarda il codice invece, attualmente sono arrivato a questo punto (posto soltanto quello del form interessato):

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Data.SqlClient;

    namespace xxxxxxx

    {
    public partial class Form2 : Form
    {
    public Form _fr1;
    public Form2()
    {
    InitializeComponent();
    }

    // carico istanza sql, connessione e gestione query
    private void Form2_Load(object sender, EventArgs e)

    {
    SqlConnection conn = new SqlConnection();
    conn.ConnectionString = @"Data Source=********;Initial Catalog=********;Persist Security Info=True;User ID=*******;Password=*******";

    SqlCommand command = new SqlCommand();
    command.Connection = conn;
    command.CommandText = "select * from v_giacenze_lotti_2021 order by CODARTICOLO";

    DataTable data = new DataTable();

    SqlDataAdapter adapter = new SqlDataAdapter(command);

    adapter.Fill(data);

    dataGridView1.DataSource = data;
    }

    private void button1_Click_1(object sender, EventArgs e)
    {
    _fr1.Visible = true;
    Hide();
    }
    }
    }

    Per lo scopo che deve gestire penso che sia più che sufficiente, ora pensavo di aggiungere il filtro di ricerca con textbox e button e direi che non c'è altro...
  • Re: Connessione a DB SQL

    Se hai già provato e ti trovi bene, allora siamo a posto.

    Detto questo, farei una riflessione sui dati da portare sul client..

    parli di qualche migliaio di record, che sono pochi dal punto di vista informatico ma tantissimi dal punto di vista utente (anche solo 500 articoli alla volta non verranno visti)

    Per me ti conviene lavorare:
    - di paginazione se vuoi far fare tutto al motore del DB e avere sempre i dati real-time
    - di ordinamento/filtro se vuoi usare una sorta di cache: il PC legge i dati ogni 2 minuti e per il resto lavora in memoria

    Per me non ha senso portare 2.000 record sul PC se poi non si ordinano/filtrano lato client

    È solo una indicazione, poi ovvio che il programma funziona lo stesso
  • Re: Connessione a DB SQL

    Per funzionare tutto funziona, però il filtro non mi riesce a trovare la colonna "CODARTICOLO", io ho impostato cosi:

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
    DataView dv = data.DefaultView;
    dv.RowFilter = ("CODARTICOLO LIKE '" + textBox1.Text + "%'");
    dataGridView1.DataSource=dv;
    }
  • Re: Connessione a DB SQL

    Hai provato a togliere le tonde e passare "CODARTICOLO LIKE '" + textBox1.Text + "%'" ?
  • Re: Connessione a DB SQL

    Sisi l'errore è lo stesso non trova il riferimento alla colonna della vista SQL, allego il codice completo per comodità:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Data.SqlClient;
    using System.Configuration;
    using System.Data.OleDb;

    namespace Esercizio_Windows_Form

    {
    public partial class Form2 : Form
    {
    public Form _fr1;
    public Form2()
    {
    InitializeComponent();
    }

    // carico istanza sql, connessione e gestione query
    private void Form2_Load(object sender, EventArgs e)

    {
    SqlConnection conn = new SqlConnection();
    conn.ConnectionString = @"Data Source=SRV-APP01;Initial Catalog=UFFICIALE;Persist Security Info=True;User ID=sa;Password=password";

    SqlCommand command = new SqlCommand();
    command.Connection = conn;
    command.CommandText = "select CODARTICOLO as CodiceArticolo, MG87_DESCART as Descrizione, MG7G_CODLOTTO_MG4G as Lotto, MG7G_SCADENZA as Scadenza, MG7G_UBICAZ_MG97 as Ubicazione, MG7I_QGIACEFF as Qta, MG7G_CODCONFEZ_MG96 as Confezione FROM V_GIACENZE_LOTTI_2021 WHERE MG66_GRUPFIS_MG61 = 'PF' ORDER BY CODARTICOLO";

    DataTable data = new DataTable();

    SqlDataAdapter adapter = new SqlDataAdapter(command);

    adapter.Fill(data);

    dataGridView1.DataSource = data;
    }

    private void button1_Click_1(object sender, EventArgs e)
    {
    _fr1.Visible = true;
    Hide();
    }

    readonly DataTable data = new DataTable();


    private void button3_Click(object sender, EventArgs e)
    {
    SqlConnection conn = new SqlConnection();
    conn.ConnectionString = @"Data Source=SRV-APP01;Initial Catalog=UFFICIALE;Persist Security Info=True;User ID=sa;Password=password";

    SqlCommand command = new SqlCommand();
    command.Connection = conn;
    command.CommandText = "select CODARTICOLO as CodiceArticolo, MG87_DESCART as Descrizione, MG7G_CODLOTTO_MG4G as Lotto, MG7G_SCADENZA as Scadenza, MG7G_UBICAZ_MG97 as Ubicazione, MG7I_QGIACEFF as Qta, MG7G_CODCONFEZ_MG96 as Confezione FROM V_GIACENZE_LOTTI_2021 WHERE MG66_GRUPFIS_MG61 = 'PF' ORDER BY CODARTICOLO";

    conn.Open();

    SqlDataAdapter adapter = new SqlDataAdapter(command);

    adapter.Fill(data);

    dataGridView1.DataSource = data;
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
    DataView dv = data.DefaultView;
    dv.RowFilter = "CODARTICOLO LIKE '" + textBox1.Text + "%'";
    dataGridView1.DataSource = dv;
    }

    private void button2_Click(object sender, EventArgs e)
    {
    Application.Exit();
    }
    }
    }
Devi accedere o registrarti per scrivere nel forum
23 risposte