Utilizzare i campi BLOB di MySQL con ASP.NET

3 pagine in totale: <<Indietro 1 2 [3]

Estrazione di dati binari dal campo blob con ASP.NET

A questo punto le cose si semplificano, si tratta solo di compiere il procedimento inverso. Dobbiamo solamente stabilire cosa fare con i dati provienti dal campo. Possiamo scegliere tra inviare subito tutti i dati al client con Response.BinaryWrite:

<%@ Include Namespace="ByteFX.Data.MySQLClient"%>
<%@ Include Namespace="System.IO"%>
<script language="VB" runat="server">
Sub Page_Load()
  Dim dt As New System.Data.DataTable()
  Dim cn As New MySQLConnection("Server=localhost; Database=test; User ID=root; Password=;")
  cn.Open
  Dim adp = New MySQLDataAdapter("SELECT campo_blob FROM tabella", cn)
  adp.Fill(dt)

  if dt.Rows.Count> 0 then
   Response.BinaryWrite(dt.Rows(0)("campo_blob"))
  end if
  dt.dispose()
  adp.dispose()
  cn.close()
  cn.dispose()
End Sub
</script>

Possiamo anche usarli per riempire uno stream (e quindi scrivere su file):

Sub Page_Load()
  'connettiti a MySQL e riempi il datatable
  'Opzione 1: scrivo su file...
  Dim percorso As String = Server.MapPath("miofile.gif")
  Dim binFile As New FileStream(percorso,Filemode.OpenOrCreate,FileAccess.Write)
  binFile.write(dt.Rows(0)("campo_blob"), 0,  dt.Rows(0)("campo_blob").length)
  binFile.Close()

  'chiudi la connessione e distruggi gli oggetti
End Sub

O ancora riconvertirli in stringa con la funzione BinToStr per un successivo utilizzo:

Dim dati As String
dati = BinToStr(dt.Rows(0)("campo_blob"))

Considerazioni finali

Qual è l'effettiva praticità di utilizzare un campo blob per conservare dati che non siano file?
Gli usi possono essere svariati. Non è una pratica molto comune l'inserimento di stringhe in campi blob, ma qualche volta può tornare davvero utile, specie se si deve salvare qualcosa nel modo più compatto possibile.
Immaginate di dover realizzare un'applicazione per la creazione di mappe di teatri e cinema. Si dovrà costruire una griglia (array bidimensionale di byte) in cui potranno essere inseriti dei posti. Naturalmente ogni posto può avere una sua tipologia che faremo corrispondere ad un numero progressivo (tribuna = 1; poltronissima = 2; platea = 3; in piedi = 4; ecc... fino ad un massimo di 255). Volendo disegnare un posto in platea sulla fila 5, colonna 20 nella nostra griglia scriveremo:

Dim griglia(50,50) As Byte
griglia(5, 20) = 3  ' il 3 è il progressivo della platea

Il grande vantaggio di usare questo metodo è che con un solo byte si definiscono coordinate e tipologia di posto.
Riempito tutto il nostro array bidimensionale, non ci resta che "mettere tutti i posti in fila" per ottenerne una collana di byte (cioè una stringa).

Dim i as Integer
Dim j as Integer
Dim posti As String = ""
  for j = 0 to griglia.GetUpperBound(1)
   for i = 0 to griglia.GetUpperBound(0)
   posti &= Chr(griglia(i,j))
  next
next

'connessione a MySQL
cmd.CommandText = "INSERT INTO tabella (campo_blob) VALUES (" & toHexString(posti) & ")"
cmd.ExecuteNonQuery()
'elimina gli oggetti

Per estrarre i dati dal campo blob dovremo eseguire il procedimento inverso.
L'offset del byte (la sua posizione nella stringa) ci darà le coordinate, mentre il valore ne indicherà il tipo. Ecco il codice di esempio:

Dim offset As Integer = 520  'zero-based, indica il 521° byte
Dim coordX As Integer
Dim coordY As Integer
Dim tipologia As Integer
coordY = Math.ceiling((offset+1) / (griglia.getUpperBound(0)+1))
coordX = (offset+1) mod (griglia.getUpperBound(0)+1)
tipologia =  Asc(posti.substring(offset,1))

E con questo è tutto! Buon divertimento con i campi blob!

Approfondimenti

3 pagine in totale: <<Indietro 1 2 [3]

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.


TUTORIALS
TOP TEN ARTICOLI
NOTIFICHE

Iscriviti alla nostra newsletter nuoviarticoli per ricevere e-mail le notifiche!

Indirizzo e-mail:
PROVIDER ASP.NET 2.0

Seleziona il database per avere il web.config pronto per Membership, Roles e Profile API.



IN EVIDENZA
MISC