Textstorlek

Hem » Experten » BLOB-fält i MySQL

BLOB-fält i MySQL

Publicerad 2009-11-30 14:18

Fråga

Hur lägger man in en fil i ett BLOB-fält i tex MySQL, från ett applikationsprogram tex. VB. Jag har sökt i manualen till MySQL, men intehittat något.

Vidare vore det intressant att om man dubbelklickar på BLOB-fältet så öppnas det i det ursprungliga, eller kompatibelt program, som tex att en bildfil öppnas i Paint. Denna fråga passar även in under VB.

Svar

MySQL erbjuder fyra typer av BLOB-fält, tinyblob, blob, mediumblob och longblob. Det enda som skiljer dessa åt är lagringskapacitet, eller rättare sagt längden på strängarna som tillåts. BLOB-värden är binära strängar (byte strings).

Associera filer med program

Jag tror inte jag hängde med riktigt i frågan om att klicka på BLOB-fältet, men jag gör ett försök. Vi kan självfallet programmässigt tala om att filer med en viss filändelse ska öppnas av ett visst program, enklast är att använda sig av metoden Process.Start.

Exempel: System.Diagnostics.Process.Start("mspaint.exe");

Normalfallet är att filer öppnas av program som redan associerats med en vissa filändelser på den aktuella datorn. Om till exempel programmet Paint är associerat med bildformatet .jpg så öppnas alla .jpg-filer av Paint.

Att lagra och hämta lagrad BLOB från databas

För att använda medföljande kodexempel behövs också en tabell i MySQL som heter tbfile. Tabellen behöver minst följande tre fält, filename (varchar), file (blob) och filesize (int).

För att hålla exemplet så kort som möjligt används statiska sökvägar och filnamn. I detta fall behövs en testfil som heter ”originalfil.png” som placeras i roten av C:\. Samma sökväg används sedan för att skriva ut fil från databas men med annat namn.

För illustrationens och enkelhetens skull har en ASP.NET webbapplikation skapats med två knapphändelser, varav en som läser in och lagrar en bildfil i ett BLOB-fält i databas, och en händelse som hämtar ett BLOB-värde från databas och skapar en ny bildfil på hårddisken.

Programspråket är C# men principerna är samma hos VB.NET. Webbapplikationen har en knapp för respektive händelse. Koden finns även att ladda ned som PDF, se överst på den här sidan.

ASP.NET webbsida

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="blobtest._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

<title>MySQL BLOB</title>

</head>

<body>

<form id="form1" runat="server">

<div>

<asp:Button ID="btnCreateBlob" runat="server" Text="Lagra i databas" onclick="btnCreateBlob_Click" />

<br />

<br />

<asp:Button ID="btnReadBlob" runat="server" Text="Skriv till disk" onclick="btnReadBlob_Click" />

</div>

</form>

</body>

</html>

Lägga till BLOB och hämta BLOB med MySQL

using System;

using System.IO;

using System.Collections.Generic;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Configuration;

using System.Data;

using System.Web.Configuration;

namespace blobtest

{

public partial class _Default : System.Web.UI.Page

{

private string SqlInsert;

private string SqlSelect;

private string strFileName;

protected void Page_Load(object sender, EventArgs e)

{

}

/// <summary>

/// Hämta fil från disk och skriv BLOB-värde i databas

/// </summary>

protected void btnCreateBlob_Click(object sender, EventArgs e)

{

MySql.Data.MySqlClient.MySqlConnection connstring = new MySql.Data.MySqlClient.MySqlConnection();

connstring.ConnectionString = WebConfigurationManager.ConnectionStrings["connString"].ConnectionString;

SqlInsert = "INSERT INTO tbfile(filename,file,filesize) VALUES(?Filename,?File,?Filesize)";

MySql.Data.MySqlClient.MySqlCommand InsertCommand = new MySql.Data.MySqlClient.MySqlCommand(SqlInsert, connstring);

InsertCommand = new MySql.Data.MySqlClient.MySqlCommand();

strFileName = "filnamn";

try

{

connstring.Open();

FileStream fileStream = new FileStream(@"c:\originalfil.png", FileMode.Open, FileAccess.Read);

int fileSize = Convert.ToInt32(fileStream.Length);

byte[] rawData = new byte[fileStream.Length];

fileStream.Read(rawData, 0, fileSize);

fileStream.Close();

InsertCommand.Connection = connstring;

InsertCommand.CommandText = SqlInsert;

InsertCommand.Parameters.AddWithValue("?FileName", strFileName);

InsertCommand.Parameters.AddWithValue("?FileSize", fileSize);

InsertCommand.Parameters.AddWithValue("?File", rawData);

InsertCommand.ExecuteNonQuery();

Response.Write("Filen sparad till databas!");

connstring.Close();

}

catch (MySql.Data.MySqlClient.MySqlException ex)

{

Response.Write("Fel " + ex.Number + " inträffade: " + ex.Message);

}

}

/// <summary>

/// Hämta BLOB-värde från databas och skriv till disk

/// </summary>

protected void btnReadBlob_Click(object sender, EventArgs e)

{

MySql.Data.MySqlClient.MySqlConnection connstring = new MySql.Data.MySqlClient.MySqlConnection();

connstring.ConnectionString = WebConfigurationManager.ConnectionStrings["connString"].ConnectionString;

SqlSelect = "SELECT * FROM tbfile";

MySql.Data.MySqlClient.MySqlCommand SelectCommand = new MySql.Data.MySqlClient.MySqlCommand(SqlSelect, connstring);

SelectCommand = new MySql.Data.MySqlClient.MySqlCommand();

MySql.Data.MySqlClient.MySqlDataReader myData;

try

{

connstring.Open();

SelectCommand.Connection = connstring;

SelectCommand.CommandText = SqlSelect;

myData = SelectCommand.ExecuteReader();

myData.Read();

// Kontroll om BLOB saknas i databas

if (myData.HasRows == false)

{

Response.Write("Det finns ingen BLOB att spara");

}

else

{

int fileSize = myData.GetInt32(myData.GetOrdinal("filesize"));

byte[] rawData = new byte[fileSize];

myData.GetBytes(myData.GetOrdinal("file"), 0, rawData, 0, fileSize);

// Statisk sökväg m.m. där filen ska skrivas

FileStream fileStream = new FileStream(@"C:\blobfil.png", FileMode.OpenOrCreate, FileAccess.Write);

fileStream.Write(rawData, 0, fileSize);

fileStream.Close();

Response.Write("Filen sparad till disk");

}

myData.Close();

connstring.Close();

}

catch (MySql.Data.MySqlClient.MySqlException ex)

{

Response.Write("Fel " + ex.Number + " inträffade: " + ex.Message);

}

}

}

}

On
Off

0 kommentarer

Avatar

Inte inloggad

Logga in Bli medlem

Läs mer

  • Senaste
  • Mest läst
  • Mest kommenterat

Kom in i diskussionen

Detta innehåll är skapat av Datormagazins besökare

Test: Samsung Galaxy SII LTE I9210

3 kommentarer

Kakan: Herregud vad virrigt inlägg, Bror-David.

Månadens fråga

  • Med den kreditkortsstora Linuxdatorn Raspberry Pi kan du både ordbehandla och spela spel. Vad tycker du om den?

Artikelkommentarer


För dig som vill veta mer: prenumerera

Datormagazin är datortidningen för dig som vill veta mest. Vår ambition är att göra en tidning med djupare och mer avancerade artiklar än vad du hittar i andra datortidningar. Samtidigt väjer vi inte för att på ett handfast sätt förklara hur saker och ting fungerar. Du ska alltid känna att du har nytta av tidningen.
Välkommen till Sveriges största tidskrift för avancerade datoranvändare!

Beställ prenumeration och betala direkt online

  • Datormagazin 6-2012

  • Datormagazin 5-2012

  • Datormagazin 4-2012

  • Datormagazin 3-2012

  • Datormagazin 2-2012

  • Datormagazin 1-2012

  • Datormagazin 14-2011

Egmont logo
© Egmont Tidskrifter