domenica 20 febbraio 2011

Gestire i parametri su MySql con Visual Studio Express

Nel presente esempio  troviamo la gestione di:

  • Parametri per il comando sql insert
  • Recupero dell’ultimo id assegnato automaticamente dall’inserimento
  • Utilizzo di una stored procedure con recupero del valore di ritorno della funzione

Stored Procedure:

CREATE DEFINER=`root`@`%` FUNCTION `Incrementa`(valore int, incremento int) RETURNS int(11)
BEGIN
  declare retValue INTEGER DEFAULT 0;
  set retValue = valore + incremento;
  RETURN retValue;
END

Esempio VB.NET 

  Private cntxt As String = "User ID=utente;Password=password;Host=localhost;Port=3306;Database=dbprova;Protocol=TCP;Compress=false;Pooling=true;Min Pool Size=0;Max Pool Size=100;Connection Lifetime=0;"
    Private Sub eseguiButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles eseguiButton.Click
        'Definizione connessione per mysql
        Dim cn As New MySqlConnection(cntxt)
        'Oggetto command per mysql
        Dim cm As New MySqlCommand("INSERT INTO TableProva (Descrizione, Valore) VALUES(?Descrizione,?Valore)", cn)
        Try
            'Apertura della connessione
            cn.Open()
            'Aggiunta parametri
            cm.Parameters.AddWithValue("?Descrizione", String.Format("{0}-{1}", "Prova", DateTime.Now.ToString()))
            cm.Parameters.AddWithValue("?Valore", New Random().NextDouble * 1000)
            'Esecuzione della query di inserimento
            cm.ExecuteNonQuery()
            'Recupero dell'ultimo id inserito
            Dim i As Integer = CType(cm.LastInsertedId, Integer)
            'Definizione del nuovo command che "punta" ad una stored procedure
            cm = New MySqlCommand("Select Incrementa(?valore, ?incremento)", cn)
            'Aggiunta parametri al command
            Dim prm As New MySqlParameter
            prm.ParameterName = "?valore"
            prm.DbType = DbType.Int32
            prm.Value = i
            cm.Parameters.Add(prm)
            prm = New MySqlParameter
            prm.ParameterName = "?incremento"
            prm.DbType = DbType.Int32
            prm.Value = 100 'incremento di 100 il numero di id
            cm.Parameters.Add(prm)
            Dim o As Object = cm.ExecuteScalar
           MessageBox.Show(o.ToSTring())
        Catch ex As Exception
            MessageBox.Show(String.Format("{0}{1}{2}", ex.Message, Environment.NewLine, ex.StackTrace))
        Finally
            If cn.State = ConnectionState.Open Then
                cn.Close()
            End If
        End 
Try

Esempio C#   

private string cntxt = "User ID=utente;Password=password;Host=localhost;Port=3306;Database=dbprova;Protocol=TCP;Compress=false;Pooling=true;Min Pool Size=0;Max Pool Size=100;Connection Lifetime=0;";
    private void eseguiButton_Click(System.Object sender, System.EventArgs e)
    {
        //Definizione connessione per mysql
        MySqlConnection cn = new MySqlConnection(cntxt);
        //Oggetto command per mysql
        MySqlCommand cm = new MySqlCommand("INSERT INTO TableProva (Descrizione, Valore) VALUES(?Descrizione,?Valore)", cn);
        try {
            //Apertura della connessione
            cn.Open();
            //Aggiunta parametri
            cm.Parameters.AddWithValue("?Descrizione", string.Format("{0}-{1}", "Prova", DateTime.Now.ToString()));
            cm.Parameters.AddWithValue("?Valore", new Random().NextDouble * 1000);
            //Esecuzione della query di inserimento
            cm.ExecuteNonQuery();
            //Recupero dell'ultimo id inserito
            int i = Convert.ToInt32(cm.LastInsertedId);
            //Definizione del nuovo command che "punta" ad una stored procedure
            cm = new MySqlCommand("Select Incrementa(?valore, ?incremento)", cn);
            //Aggiunta parametri al command
            MySqlParameter prm = new MySqlParameter();
            prm.ParameterName = "?valore";
            prm.DbType = DbType.Int32;
            prm.Value = i;
            cm.Parameters.Add(prm);
            prm = new MySqlParameter();
            prm.ParameterName = "?incremento";
            prm.DbType = DbType.Int32;
            prm.Value = 100;
            //incremento di 100 il numero di id
            cm.Parameters.Add(prm);
            object o = cm.ExecuteScalar;
            MessageBox.Show(o.ToString());


        } catch (Exception ex) {
            MessageBox.Show(string.Format("{0}{1}{2}", ex.Message, Environment.NewLine, ex.StackTrace));
        } finally {
            if (cn.State == ConnectionState.Open) {
                cn.Close();
           
}

sabato 19 febbraio 2011

Gestire Oracle Express 10g da Visual Studio Express

Su una mia macchia virtuale ho installato e configurato Oracle Express 10g ed il driver nativo per .net.

Oracle Express si presenta molto ricco di documentazione e con una interfaccia di gestione “web” che a mio parere è facile ed intuitiva, pur non avendo una profonda conoscenza di Oracle (tra le mie velleità c’era anche quella di imparare bene l’utilizzo e ho comprato un manuale che ho solamente sfogliato senza approfondire) sono stato in grado di creare nuove tabelle, e gestire queste da Visual Studio Express.

La tabella che ho generato per la mia prova:

CREATE TABLE  "TABLEPROVA"
   (    "ID" NUMBER,
    "DESCRIZIONE" VARCHAR2(50),
    "VALORE" NUMBER(12,3),
     CONSTRAINT "TABLEPROVA_PK" PRIMARY KEY ("ID") ENABLE
   )
/

CREATE OR REPLACE TRIGGER  "BI_TABLEPROVA"
  before insert on "TABLEPROVA"              
  for each row 
begin  
    select "TABLEPROVA_SEQ".nextval into :NEW.ID from dual;
end;

/
ALTER TRIGGER  "BI_TABLEPROVA" ENABLE
/

(come si vede il campo ID è di tipo numerico con un trigger che incrementa di 1 automaticamente il valore ad ogni inserimento)

Vista l’impossibilità di Visual Studio Express a collegare ed utilizzare il wizard di creazione del dataset tipizzato con origine dati “Oracle”, è noto infatti che express gestisce solo Access, Sql Express, Sql CE sempre in locale.

Visto che non ho il wizard a disposizione (esiste, a dire il vero un’altra possibilità ma non l’ho scartata perchè la sua descrizione porterebbe via parecchio tempo) ho fatto io quello che dovrebbe fare il wizard di generazione del dataset.

Sostanzialmente fa le operazioni:

1) Apre la connessione con il database
2) Genera la definizione del dataset (xsd) prendendo dal database lo schema delle tabelle / campi
3) Predispone il TableMapping per il mapping degli oggetti che dovrà popolare
4) Gestisce la generazione di un “adapter” dedicato per ogni tabella (tableadapter)
5) Popola ciascun DataAdapter con i comandi / connessioni

Tutto a mano ( è meno difficile di quanto si possa pensare, una volta che si è imparato il trucco diventa tutto in discesa):

Sono partito da un progetto vuoto “windows forms”, ho aggiunto a questo (progetto, aggiungi, dataset) che è rappresentato da un file con estensione xsd.

Si apre la gestione del dataset, ho aggiunto una nuova tabella con 3 campi, tabella e campi sono “speculari” rispetto a tabella e campi presenti nel database.

Ho aggiunto un indice primario al datatable generato.

Aggiunto un oggetto di tipo BindingSource, impostato l’origine dati dal mio dataset appena generato.
Aggiunto un oggetto di tipo BindingNavigator, impostato la proprietà “BindingSource” sul BindingNavigator generato per il mio progetto.

Ho aggiunto un DataGridView con origine dati sul BindingSource e tanti campi di tipo textbox quanti campi presenti nella table, impostato su questi il binding (Text) con BindingSource.

Ho aggiunto il riferimento al driver di Oracle.

Passiamo al codice
A livello di modulo:
Imports Oracle.DataAccess.Client

A livello di classe:
Dim da As New OracleDataAdapter("SELECT * FROM tableprova", "Data Source=XP-TEST;User Id=xp-test;Password=xptest;")

Nell’evento Load della form:

Dim cm As New OracleCommandBuilder(da)

da.InsertCommand = cm.GetInsertCommand()
da.DeleteCommand = cm.GetDeleteCommand()
da.UpdateCommand = cm.GetUpdateCommand()
da.Fill(DbProva, "TableProva")

Visto che mancava il comando di aggiornamento del database ho provveduto ad aggiungere un bottone nel bindingnavigator, nel relativo evento click il codice:

BindingSource1.EndEdit()
da.Update(DbProva, "TableProva")



Esempio VB.NET
Esempio C#