Approccio Sintassi C#

di il
18 risposte

Approccio Sintassi C#

Salve a tutti,

ho iniziato a prendere in considerazione il C# e Sql Server Express con Visual Studio.

Chiedo cortesemente supporto per validare le sintassi e l'approccio a tale linguaggio che ho iniziato a studiare da meno una settimana.

Lo scopo di questa App è quello di enumerare tutti i files presenti in una certa cartella e sottocartelle per memorizzare ogni elemento in una tabella di un database.

Per ogni file salvo un record con:

- DateOperation
- FullPath
- FileName
- DateLastEditFiles

Questo il codice su VindowsForm

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.IO;
using System.Data.SqlClient;
using System.Threading;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace MyBackup65
{
   // MAIN FORM CLASS
   public partial class FormMain : Form
   {
       // connection string fon database table
       string cnnString = @"data source=.\sqlexpress;initial catalog=MyBackup65;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName=""System.Data.SqlClient";
       // MAIN FORM 
       public FormMain()
       {
           InitializeComponent();
       }
       private void button1_Click(object sender, EventArgs e)
       {
           MyReadFolderAndFile();
       }


       // READ FOLDER/FILES AND SAVE RECORDS IN THE BACKUP TABLE 
       private void MyReadFolderAndFile()
       {
           // init variables
           string sqlString = "";
           int result = 0;
           int intCountFiles = 0;
           textBoxFiles.Clear();
           string strFullPathStart = @"C:\Document_\MyDownLoad\";
           
           // set connection database string and open 
           using (SqlConnection connection = new SqlConnection(cnnString))
           {
               connection.Open();
               // delete all records in the table
               sqlString = "DELETE FROM Tbl_BkOperation";
               using (SqlCommand command = new SqlCommand(sqlString, connection))
               result = command.ExecuteNonQuery();
               // set sql string 
               sqlString = "INSERT INTO Tbl_BkOperation (BkDateTimeBackup, BkFullPath, BkFileName, BkDateTimeEdit) VALUES(@value1, @value2, @value3, @value4)";
               // set sql command and add parameters
               using (SqlCommand command = new SqlCommand(sqlString, connection))
               { 
                   command.Parameters.AddWithValue("@value1", "");
                   command.Parameters.AddWithValue("@value2", "");
                   command.Parameters.AddWithValue("@value3", "");
                   command.Parameters.AddWithValue("@value4", "");
                   // get folder and file  
                   string[] strFiles = Directory.GetFiles(strFullPathStart, "*", SearchOption.AllDirectories);
                   // set counter
                   intCountFiles = strFiles.Count();
                   // enum folder files
                   foreach (string strFile in strFiles)
                   {
                       // insert new record
                       command.Parameters["@value1"].Value = DateTime.Now;
                       command.Parameters["@value2"].Value = Path.GetFullPath(strFile);
                       command.Parameters["@value3"].Value = Path.GetFileName(strFile);
                       command.Parameters["@value4"].Value = File.GetLastWriteTime(strFile);
                       result = command.ExecuteNonQuery();
                    
                       // textbox info update 
                       textBoxFiles.AppendText(strFile + "\r\n");
                   }
               }
               // close connection
               connection.Close();
           }
           MessageBox.Show("Completed... " + "Number Files: " + intCountFiles.ToString(), "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
       }
   }
}

E' solo un approccio e mancano i dovuti controlli fondamentali sia per la connessione al Db se è andata a buon fine oppure no e così via dicendo per gli altri metodi che ho utilizzato.

Ma prima di andare avanti volevo confrontarmi con voi per capire se ho capito la sintassi del C#, i metodi, etc etc
Ad un occhio esperto in C# è sicuramente banale e lampante se ci ho capito qualcosa oppure no ;-) 

Grazie in anticipo per le Critiche, Consigli e Dritte…. ma non mi distruggete, ho solo iniziato da pochi giorni, stò a studià ;-)

18 Risposte

  • Re: Approccio Sintassi C#

    Sei sulla buona strada …

    Solo qualche dettaglio

    non mischiare dichiarazioni e istruzioni che operano effettivamente, ad esempio

    textBoxFiles.Clear();

    dovrebbe stare dopo le varie dichiarazioni di variabili.

    E poi

    "Completed... " + "Number Files: "

    non ha molto senso unire costanti, per chiarezza meglio

    "Completed... Number Files: "
  • Re: Approccio Sintassi C#

    Clear TextBox già sistemata al suo posto dopo le variabili locali con:

               // init variables
               string sqlString = "";
               int result = 0;
               int intCountFiles = 0;
               string strFullPathStart = @"C:\Document_\MyDownLoad\";
    
               // ini controls form
               textBoxFiles.Clear();

    Ok per il concatenamento… mi era rimasto quando ho modificato il messaggio che elencava altre variabili … perfetto!!! messo a posto.


    Quello che non riesco ancora ad assimilare/digerire è l'uso delle parentesi Graffe… quando utilizzarle e quando non è necessario.
    Se ho capito bene si crea un blocco di codice {  }  solo se a seguire ci sono almeno più di una istruzione che altrimenti non verrebbero considerate dal compilatore parte del blocco….   Una cosa di questo tipo ??? 

    Grazie mille!!!

  • Re: Approccio Sintassi C#

    Solo per una conferma … quando si usano delle variabili oggetto come nel caso :

    using (SqlConnection connection = new SqlConnection(cnnString))
    using (SqlCommand command = new SqlCommand(sqlString, connection))

    connection e command mi sembra di aver capito che non è necessario acciaccarle in quanto all'uscita del blocco vengono automaticamente liberate dalla memoria.

    E' giusto ?

  • Re: Approccio Sintassi C#

    Ciao, ho spostato la discussione nell'area C#

  • Re: Approccio Sintassi C#

    19/07/2023 - By65Franco ha scritto:

    Quello che non riesco ancora ad assimilare/digerire è l'uso delle parentesi Graffe… quando utilizzarle e quando non è necessario.
    Se ho capito bene si crea un blocco di codice {  }  solo se a seguire ci sono almeno più di una istruzione che altrimenti non verrebbero considerate dal compilatore parte del blocco….   Una cosa di questo tipo ??? 

    Grazie mille!!!

    L'uso delle graffe è simile a molti altri linguaggi, C e C++ su tutti. Di solito vengono usate appunto quando è presente più di una istruzione anche se nulla vieta di usarle in presenza di un'unica istruzione, come nel corpo dell'istruzione if o nei cicli per meglio metterli in evidenza. In ogni caso è bene ricordarsi che una variabile definita in un blocco esiste solo in quel blocco.
    Inoltre sono necessarie quando si definiscono funzioni, classi o enumerazioni e strutture.

    P.S. ti segnalo un sito interessante sul C#: http://www.carlovecchio.altervista.org/c-.html

  • Re: Approccio Sintassi C#

    19/07/2023 - By65Franco ha scritto:


    Se ho capito bene si crea un blocco di codice {  }  solo se a seguire ci sono almeno più di una istruzione che altrimenti non verrebbero considerate dal compilatore parte del blocco….   Una cosa di questo tipo ??? 

    Esatto.

    Scrivere

    while(myBool)
    	Console.WriteLine("myBool è true");

    equivale a

    while(myBool)
    	{
    		Console.WriteLine("myBool è true");
    	}

    Mentre invece non è possibile omettere le parentesi se hai più di un'istruzione da eseguire in un blocco. Quindi, ad esempio

    
    for(int i; i<10; i++)
    	{
    		Console.WriteLine($"i vale {i}");
    		Console.WriteLine($"il doppio di i è {i*2}");
    	}

    Questo blocco, a scriverlo senza le graffe renderebbe 10 volte la prima WriteLine (da 0 a 9) ed una soltanto la seconda (con risultato 18).

    E ti ho aggiunto un altro uso delle graffe, così per sclerare un po'. XD

    19/07/2023 - By65Franco ha scritto:


    connection e command mi sembra di aver capito che non è necessario acciaccarle in quanto all'uscita del blocco vengono automaticamente liberate dalla memoria.

    Con le nuove versioni del linguaggio (dalla 11 in poi mi pare) le graffe si possono omettere. Lo using studialo: in pratica si usa su un oggetto che implementa IDisposable per chiamarne il Dispose implicitamente. Corrisponde ad un try…finally.

  • Re: Approccio Sintassi C#

    19/07/2023 - Toki ha scritto:


    Ciao, ho spostato la discussione nell'area C#

    Grazie !!! sempre molto gentile !

  • Re: Approccio Sintassi C#

    19/07/2023 - euscar ha scritto:


    L'uso delle graffe è simile a molti altri linguaggi, C e C++ su tutti. Di solito vengono usate appunto quando è presente più di una istruzione anche se nulla vieta di usarle in presenza di un'unica istruzione, come nel corpo dell'istruzione if o nei cicli per meglio metterli in evidenza. In ogni caso è bene ricordarsi che una variabile definita in un blocco esiste solo in quel blocco.
    Inoltre sono necessarie quando si definiscono funzioni, classi o enumerazioni e strutture.

    P.S. ti segnalo un sito interessante sul C#: http://www.carlovecchio.altervista.org/c-.html

    Perfetto… grazie per la conferma !!!

    grazie per Info!

  • Re: Approccio Sintassi C#

    19/07/2023 - Sgrubak ha scritto:


    Con le nuove versioni del linguaggio (dalla 11 in poi mi pare) le graffe si possono omettere. Lo using studialo: in pratica si usa su un oggetto che implementa IDisposable per chiamarne il Dispose implicitamente. Corrisponde ad un try…finally.

    Ottimo !!! preso nota, grazie mille !

  • Re: Approccio Sintassi C#

    Grazie a tutti per le info, suggerimenti e conferme… so che sono piccole cose ma per chi è agli inizi fa piacere e conforta rendersi conto di non essere del tutto fuori strada.

    Ovviamente metterò/raggrupperò i vari codici (routine) in un modulo apposito per rendere snelli e leggibili i moduli delle Forms.

    Soprattutto quelle routine che possono essere richiamate da più Forms etc etc…

    Invece devo approfondire il metodo migliore e più performante per eseguire le stringhe Sql…. ho qualche perplessità sulla stringa di connessione che pur avendo un nome (name= MioNomeStrigaConnessione), nel caso specifico sopra postato, il name non è supportato e non posso utilizzarlo… e mi pare bruttino scrivere tutta la stringa di connessione soprattutto se si dovessero avere più connessioni diverse

    Devo approfondire meglio questa parte, soprattutto per l'aspetto performance.

    Grazie ancora a tutti ;-)

  • Re: Approccio Sintassi C#

    19/07/2023 - By65Franco ha scritto:


    connection e command mi sembra di aver capito che non è necessario acciaccarle in quanto all'uscita del blocco vengono automaticamente liberate dalla memoria.

    No, la memoria viene sempre rilasciata dal Garbage Collector (abbreviato in GC).

    Il costrutto using si applica a quegli oggetti poiché “dietro le quinte” gestiscono una risorsa esterna (non .NET), ovvero la connessione al database e il comando da eseguire, ma ad esempio vale lo stesso per file, bitmap, socket di rete, ecc.

    L'uscita dal blocco using forza la chiamata a Dispose(), che provvede a rilasciare le risorse in modo che vengano rese disponibili nuovamente al sistema (es. se stai scrivendo un file, quello verrà chiuso); sarà poi sempre il GC a rilasciare la memoria allocata per l'oggetto in sé, ovvero la mera struttura dati creata nell'ecosistema .NET di esecuzione.

  • Re: Approccio Sintassi C#

    19/07/2023 - Alka ha scritto:

    No, la memoria viene sempre rilasciata dal Garbage Collector (abbreviato in GC).

    Il costrutto using si applica a quegli oggetti poiché “dietro le quinte” gestiscono una risorsa esterna (non .NET), ovvero la connessione al database e il comando da eseguire, ma ad esempio vale lo stesso per file, bitmap, socket di rete, ecc.

    L'uscita dal blocco using forza la chiamata a Dispose(), che provvede a rilasciare le risorse in modo che vengano rese disponibili nuovamente al sistema (es. se stai scrivendo un file, quello verrà chiuso); sarà poi sempre il GC a rilasciare la memoria allocata per l'oggetto in sé, ovvero la mera struttura dati creata nell'ecosistema .NET di esecuzione.

    Perfetto!!!

    Grazie mille per info e conferme. 

    Pian piano ci prendo confidenza con questo C#… però solo le basi sono immense, tante cosine da approfondire. Strada facendo si vedranno tutte, non mi faccio prendere dalla fretta  ;-))

  • Re: Approccio Sintassi C#

    19/07/2023 - By65Franco ha scritto:


    mi pare bruttino scrivere tutta la stringa di connessione soprattutto se si dovessero avere più connessioni diverse

    Le ConnectionString, che io sappia, è buona norma metterle tra le Settings del progetto. L'ambito sarà di default per l'applicazione e non per l'utente. Un oggetto che deriva da IDbConnection, ha la proprietà ConnectionString che è di tipo string, quindi la puoi costruire a runtime, ma poi esponi i pezzi hardcoded nell'eseguibile e ti esponi a problemi di sicurezza (dato che sarebbe in qualche modo ricostruibile analizzando il codice con Ilsdam)

    19/07/2023 - By65Franco ha scritto:


    devo approfondire il metodo migliore e più performante per eseguire le stringhe Sql

    Per quello devi preparare un IDbCommand e poi eseguire uno degli Execute (a seconda di quel che ti serve). Per le performance, oltre a scrivere una query che sia efficiente di suo, esistono molti parametri dei vari comandi che si possono impostare opportunamente a seconda di quel che devi andare a fare. Ma già solo qui, c'è mezzo libro di argomenti. XD

    P.S. io ti cito le interfacce perché poi usare MSSQL, OleDB o ODBC (che appunto le implementano) diventa indifferente. Tutti gli oggetti necessari implementano queste interfacce.

    P.P.S. Parti da subito ad usare i parametri!!! 

  • Re: Approccio Sintassi C#

    19/07/2023 - Sgrubak ha scritto:


    Le ConnectionString, che io sappia, è buona norma metterle tra le Settings del progetto. L'ambito sarà di default per l'applicazione e non per l'utente. Un oggetto che deriva da IDbConnection, ha la proprietà ConnectionString che è di tipo string, quindi la puoi costruire a runtime, ma poi esponi i pezzi hardcoded nell'eseguibile e ti esponi a problemi di sicurezza (dato che sarebbe in qualche modo ricostruibile analizzando il codice con Ilsdam)

    Ciao,

    nel progetto la connection string la ritrovo, dopo averla creata la prima volta, in App.Config :

    <connectionStrings>
       <add name="ModelBkDB" connectionString="data source=.\sqlexpress;initial catalog=MyBackup65;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
    </connectionStrings>

    a questo punto imposto:

    - dopo aver fatto la dichiarazione 
    using System.Configuration;
    
    - faccio il retrieve per la stringa dal name
    string cnnString =  ConfigurationManager.ConnectionStrings["ModelBkDB"].ConnectionString;
    using (SqlConnection connection = new SqlConnection(cnnString))
    
    
    - invece di usare:
    
    string cnnString = @"data source=.\sqlexpress;initial catalog=MyBackup65;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName=""System.Data.SqlClient";
    using (SqlConnection connection = new SqlConnection(cnnString))

    In questo modo è praticabile ?


    19/07/2023 - Sgrubak ha scritto:


    Per quello devi preparare un IDbCommand e poi eseguire uno degli Execute (a seconda di quel che ti serve). Per le performance, oltre a scrivere una query che sia efficiente di suo, esistono molti parametri dei vari comandi che si possono impostare opportunamente a seconda di quel che devi andare a fare. Ma già solo qui, c'è mezzo libro di argomenti. XD

    Questo lo devo guardare!!! (con calma però)   ;-))


    P.P.S. Parti da subito ad usare i parametri!!! 

    perfetto… ok !!   grazie!!!

Devi accedere o registrarti per scrivere nel forum
18 risposte