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

aprile 12, 2007

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


Flash in C#

febbraio 19, 2007

La tesi prosegue a ritmo direi lento (oggi è la giornata della lentezza) ma inesorabile. Siamo ancora in fase di studio ma le idee cominciano a chiarirsi e comincio ad immaginare il prodotto definitivo.

Partiamo dall’inizio. Senza entrare troppo nei particolari, la mia tesi dovrebbe portarmi a realizzare una caccia al tesoro multimediale per bambini da svolgersi all’interno di un museo. Il tutto con il supporto della tecnologia RFID e, forse, di una Smartboard.

Come già detto in post precedenti le applicazioni per il lettore RFID che ho a disposizione devo svilupparle nel linguaggio C# (o VB ma ho deciso per il primo). Di contro in questo modo, avrei ottenuto delle interfacce poco “appetibili” per i bambini che dovranno usare l’applicazione. Ho deciso quindi di inserire alcune animazioni in Flash. Ebbene oggi dopo due giorni sono riuscito a capire come inserire animazioni Flash in una form. Di per se è molto semplice, tra poco mostrerò i pochi passaggi necessari, le problematiche erano legate alla comunicazione con l’ActiveX del lettore RFID.

Per inserire un componente Flash sarà necessario inserire tra i references due dll: AxInterop.ShockwaveFlashObjects.dll e Interop.ShockwaveFlashObjects.dll.
Successivamente dopo aver inserito il componente nella form per richiamare il filmato Flash sono necessarie poche righe da inserire dopo la chiamata ad InitializeComponent():

path = System.Environment.CurrentDirectory;
path += @”\nomefile.swf”;

axShockwaveFlash1.LoadMovie(0, path);
axShockwaveFlash1.Play();

e il gioco è fatto.

[La Vida Es Un Carnaval]

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