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 >
<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);
}
}
}
}