Relaterade webbplatser
PChemma
Andra tjänster från Egmont Tidskrifter
Förlaget
Annonsbörsen
Allt om Husvagn & Camping
Body
Classic Motor
Stylingtorget
FZ
Mailgamer
PC Gamer
Power Magazine
Praktiskt Båtägande
Sportfack
Uppsnappat
Utemagasinet
V75 Guiden
Wheels Magazine
Åka Skidor
Motorrad
GolfDigest
Golfresan
Jobbguiden.se
SQL
BLOB-fält i MySQL
Ladda ner
» BLOB-kod (pdf)
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);

}

}

}

}



SPONSRADE LÄNKAR
Vad är detta?
Vad är sponsrade länkar?
Detta är textbaserade annonser som levereras från Eniro.
Länkarna är köpta av företag som vill synas ha dessa synliga i samband med lämpligt innehåll baserat på av dem valda nyckelord. Annonserna administreras, sorteras och underhålls av Eniro.
För information om dessa, se http://www.eniro.se/sponsradelankar/. När du klickar på en annons från Eniro öppnas ett nytt webbfönster.. Den webbplats du hamnar på ska betraktas som annonsör.
Stäng
Direktlänkar till svar i våra olika kategorier
» ASP.Net
» C#
» Ajax
» SQL
De senaste frågorna och svaren - SQL
Nummer 8-2010

Välkommen till senaste numret av Datormagazin. Här finner du innehållet i den utgåva som finns ute i butik.
 Läs mer »
Forumet stängt

På grund av brister i forumsystemet kommer vi tyvärr inte att kunna öppna vårt forum den närmaste tiden.
 Läs mer »
Test: Adobe Photoshop CS5

Photoshop har 20 år på nacken, men känns fräschare än någonsin. Nya CS5 innehåller både nya funktioner och massor av små förbättringar.
 Läs mer »
Test: Apple Ipad

Apples Ipad är en av de mest intressanta lanseringarna i år. Men ska man verkligen köpa en platt och dyr dator som har lägre prestanda än en traditionell netbook.
 Läs mer »
Test: Sony Ericsson Xperia X10

Sony Ericssons X10-Android har en härlig skärm och en snabb processor. Men den smarta mobilen skulle må bra av en uppdatering. Både när det gäller operativsystem och firmware.
 Läs mer »
Test: Canon Pixma MX870

Du behöver rejält med utrymme för att få plats med Pixma MX870. Det är inte så konstigt egentligen, Canons allt-i-ett-skrivare har mängder av funktioner.
 Läs mer »
Test: Lenovo X100E

Varumärket Lenovo brukar förknippas med hög kvalitet, snarare än lågt pris. Ultraportabla Thinkpad X100E ger dig både och.
 Läs mer »
Läsarnas programtips

Denna gång har vi samlat tips på portabla applikationer. Faktiskt finns det sådana för nästan alla behov. Här presenteras en del av dem.
 Läs mer »

Månadens fråga

Kopplar du ned under sommarsemestern?
 Ja
 Mestadels
 Nej
 Till och med hängmattan har WiFi

Visa resultat »

Ja
 10%

Mestadels
 24%

Nej
 42%

Till och med hängmattan har WiFi
 24%

« Tillbaka
Totalt: 143 röster
Nytt i testlabbet
Frågor till experterna
Nytt på bloggen
Senaste nyheterna
Nästa nummer: 9-2010

31
...dagar kvar till nästa nummer
Innehåller bland annat
* Stort säkerhetstema
* Stor guide till IT-forensik
* Så analyserar du dina webbesökare
* Så fungerar Linuxkärnan
* USB 2.0 vs USB 3.0
 Läs mer »