Un pensiero e una piccola guida – gestire i campi blob in MySQL con CS

In questi giorni sto lavorando parecchio sul versante tesi. In realtà combino poco dal punto di vista pratico ma sto sperimentando molto (tra poco racconterò qualcosa) e mi sto informando parecchio. In particolare sto cercando di immaginare un mondo taggato fisicamente con gli RFID tag. Una sorta di web2.1, il web2.0 fisico (se ne parla un po’ in questo periodo, c’è anche un video in giro in questi giorni, se lo trovo lo posto) in cui non si condividono notizie, commenti, post…presenti sul web ma si condividono commenti, giudizi, pensieri…sul mondo fisico, su oggetti fisici. Per ora è un pensiero un po’ nebuloso, se avrò tempo di metterlo su carta sul blog ve ne parlerò.

blobIntanto vi racconto un po’ dei campi BLOB (non il fluido mortale) in un database MySQL.
Per prima cosa, cosa sono i cambi BLOB.

(da Wikipedia)
A binary large object, also known as a blob, is a collection of binary data stored as a single entity in a database management system. Blobs are typically images, audio or other multimedia objects, though sometimes binary executable code is stored as a blob.

In sostanza all’interno di un campo di tipo blob di un database sarà possibile memorizzare un intero file in formato binario. In questo modo si hanno notevoli vantaggi. Il più importante tra tutti è legato alla necessità di spostare i dati memorizzati. Con questo tipo di campi sarà sufficiente effettuare il dump del DB per spostare tutti i file.

Veniamo ora ad un esempio di utilizzo combinato MySQL – C#.
Per prima cosa sarà necessario creare il database, per il nostro esempio sarà sufficiente una singola tabella blob con un campo file di tipo LONGBLOB in cui si memorizzerà il file in formato binario, un campo extension di tipo TEXT in cui verrà memorizzata l’estensione del file e infine un campo file_size per memorizzare la dimensione del file.

Per dialogare con il DB sarà invece necessario scaricare il Connector/NET, scompattarlo ed importarlo nel proprio progetto con la chiamata:

using MySql.Data;

dopo aver aggiunto la libreria tra le reference.

Vediamo ora come inserire e come andare a leggere in/da un campo blob.

Inserimento:
Dopo aver aperto la connessione col DB ecco il codice necessario per inserire un nuovo file:

//prendo il file e creo un array di byte
fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
FileSize = (UInt32)fs.Length;

rawData = new byte[FileSize];
fs.Read(rawData, 0, (int)FileSize);
fs.Close();

//apro la connessione
conn.Open();

//preparo la query e la eseguo
SQL = “INSERT INTO `file`(file,extension,file_size) VALUES (?file,?extension,?file_size)”;

cmd.Connection = conn;
cmd.CommandText = SQL;
cmd.Parameters.Add(“?file”, rawData);
cmd.Parameters.Add(“?extension”, ext);
cmd.Parameters.Add(“?fileSize”, FileSize);

cmd.ExecuteNonQuery();

conn.Close();

Dove il file e l’estensione sono passati dall’esterno. Ad esempio da un componente OpenFileDialog.
Il passaggio un po’ più delicato è indubbiamente rappresentato dalla creazione di uno stream partendo dal file. Questo flusso di dati viene poi letto e memorizzato all’interno di un array di byte.

Lettura:
Passiamo ora alla lettura di un file.

//faccio la select
SQL = “SELECT file,extension,file_size FROM file WHERE ID=’5′”;
//connessione
conn.Open();
cmd.Connection = conn;
cmd.CommandText = SQL;

//preparo ed eseguo la query
myData = cmd.ExecuteReader();

myData.Read();

Extension = myData.GetString(“extension”);
FileSize = myData.GetUInt32(myData.GetOrdinal(“file_size”));
rawData = new byte[FileSize];

myData.GetBytes(myData.GetOrdinal(“file”), 0, rawData, 0, (int)FileSize);

//creo lo stream ed il file
fs = new FileStream(@”C:\newfile.”+extension, FileMode.OpenOrCreate, FileAccess.Write);
fs.Write(rawData, 0, (int)FileSize);
fs.Close();

myData.Close();
conn.Close();

In questo modo, dopo aver acquisito i byte, l’estensione e la dimensione del file sarà possibile salvarlo in un nuovo file in locale per, successivamente accedere al file stesso.

Prima di terminare vi segnalo un sito in cui potrete trovare le stringhe di connessione ai principali database.

[La Vida Es Un Carnaval]

Digg! | | | del.icio.us | ste-site – visit my website

Annunci

6 Responses to Un pensiero e una piccola guida – gestire i campi blob in MySQL con CS

  1. Grazitaly ha detto:

    Stai imparando bene 😀

  2. stenet ha detto:

    Sono solo pochi comandi, spero possano essere utili.

  3. perlinavichinga ha detto:

    oh caspita, non ho capito nulla… che imbranata che sono…
    grazie per la visita, a presto!
    e buon week end!

  4. stenet ha detto:

    Grazie a te!
    “oh caspita, non ho capito nulla… che imbranata che sono…”
    non preoccuparti, io fingo di capirci qualcosa, comunque se giri per il blog troverai post completamente diversi 😀

  5. Grazitaly ha detto:

    Che fingessi non c’erano dubbi!!! ahahhah 😀

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: