11. april 2005 - 16:07Der er
72 kommentarer og 1 løsning
Hvordan lægger et billede ind i MySQL DB?
Jeg har behov for:
1. At vide hvordan, jeg smider et billede ind i en database, og her tænker jeg ikke på en URL, men et fysisk billede ind fx et *.jpg fil
2. Hvordan kan jeg hente det billede ud, og vise det på en side (jeg koder i c# og .NET).
3. Jeg har forsøgt at eksportere mine data fra min lokale MySQL database og i en MySQL hos min hosting bureau. Her har jeg lavet et SQL script men jeg får en fejl i 'DEFAULT CHARSET=latin1, når jeg forsøger at køre scriptet hos min remote MySQL, et eller andet med versioner??? Hvad er der galt her? Nr jeg eksportere data på den måde, får jeg så al min billede data med???
MySQL connector for .NET, BLOB felt, MySqlCommand med Parameters.
Jeg har et C# eksempel som må kune give dig de rigtige ideer:
using System; using System.Threading; using System.Data; using ByteFX.Data.MySqlClient;
public class PicTestThread { private int n; private int npics; private int picsize; public PicTestThread(int n, int npics, int picsize) { this.n = n; this.npics = npics; this.picsize = picsize; } public void Run() { PicTest.CheckN(n, npics, picsize); } }
public class PicTest { private const int N = 10000; public static void CreateTable(int npics, int picsize) { MySqlConnection con = new MySqlConnection("Database=Test;Data Source=localhost;User Id=;Password="); con.Open(); MySqlCommand cre = new MySqlCommand("CREATE TABLE pics (id INTEGER PRIMARY KEY, pic MEDIUMBLOB)", con); cre.ExecuteNonQuery(); MySqlCommand ins = new MySqlCommand("INSERT INTO pics VALUES (@id, @pic)", con); ins.Parameters.Add("@id", MySqlDbType.Int); ins.Parameters.Add("@pic", MySqlDbType.MediumBlob); for(int i = 0; i < npics; i++) { ins.Parameters["@id"].Value = i; byte[] data = new Byte[picsize]; for(int j = 0; j < picsize; j++) { data[j] = (byte)((i + j) % 256); } ins.Parameters["@pic"].Value = data; ins.ExecuteNonQuery(); } con.Close(); } public static void CheckOne(int id, int picsize) { MySqlConnection con = new MySqlConnection("Database=Test;Data Source=localhost;User Id=;Password="); con.Open(); MySqlCommand sel = new MySqlCommand("SELECT pic FROM pics WHERE id = " + id, con); byte[] data = (byte[])sel.ExecuteScalar(); if(data.Length != picsize) { Console.WriteLine("picture #" + id + " corrupted"); } for(int j = 0; j < data.Length; j++) { if(((id + j) % 256) != data[j]) { Console.WriteLine("picture #" + id + " corrupted"); } } con.Close(); } public static void DropTable() { MySqlConnection con = new MySqlConnection("Database=Test;Data Source=localhost;User Id=;Password="); con.Open(); MySqlCommand drp = new MySqlCommand("DROP TABLE pics", con); drp.ExecuteNonQuery(); con.Close(); } public static void CheckN(int n, int npics, int picsize) { Random rng = new Random(); for(int i = 0; i < n; i++) { int id = rng.Next(npics); CheckOne(id, picsize); } } public static void CheckTest(int nthreads, int npics, int picsize) { long t1 = DateTime.Now.Ticks; PicTestThread[] ptt = new PicTestThread[nthreads]; Thread[] thr = new Thread[nthreads]; for(int i = 0; i < thr.Length; i++) { ptt[i] = new PicTestThread(N/nthreads, npics, picsize); thr[i] = new Thread(new ThreadStart(ptt[i].Run)); } for(int i = 0; i < thr.Length; i++) { thr[i].Start(); } for(int i = 0; i < thr.Length; i++) { thr[i].Join(); } long t2 = DateTime.Now.Ticks; Console.WriteLine(nthreads + " conc reqs, " + npics + " pics in db, " + picsize/1000 + " KB pics => " + N/((t2 - t1) / 1000000.0) + " pics/sec"); } public static void Main(string[] args) { int[] npics = { 250, 500, 1000 }; int[] picsize = { 50000 /*, 100000, 200000 */ }; int[] nthreads = { 10, 20, 40 }; for(int i = 0; i < npics.Length; i++) { for(int j = 0; j < picsize.Length; j++) { CreateTable(npics[i], picsize[j]); for(int k = 0; k < nthreads.Length; k++) { CheckTest(nthreads[k], npics[i], picsize[j]); } DropTable(); } } } }
Jo, men jeg har ingen billeder nu, og forsøger bare at flytte mine lokale data over på mit site, og det er her jeg får en fejl i DEFAULT CHARTSET= latin1. Jeg gider ikke at oprette hele min database og smide data ind from scratch. Er der nogen, der har en ide om, hvordan jeg får flyttet min data?
som jeg husker det, er det kun tabelstrukturen der giver dig problemer. Hvis du kun overføre data skulle der ikke være nogle problemer.
jeg har selv lige været igennem 50 databaser, hvor jeg brugte nested sql til at konventere nogle data, struktur og brugte derfor version 4.1. Herefter brugte jeg dump af data (kun data) tilbage til en version 4.0.
Jeg har forsøgt at editere, men problemet er at jeg ikke ved hvad jeg skal editere til. Da det er DEFAULT CHARSET, der giver problemer, skal jeg vel bare vide hvad latin1 skal erstattes med. Jeg har søgt på nettet men uden held.
Kan jeg egetligt smide et billede manuelt ind i en MySQL database. Et eller andet a la drag billede ind i MySQL front fx. og slip billedet i tabel feltet.????
Ok. Jeg har fået flyttet tabeller + data. No Problem. Det med drag ´n drop, mente jeg ikke bogstavligt. Men jeg tænkte mere på at hælde noget billede data ind i tabel ved kun at bruge et MySQL GUI som MySql Front eller Sqlyog, det må vel kunne lade sig gøre.
jeg ved at dette spørgsmål ikke skal stilles her men....
File or assembly name MySql.Data, or one of its dependencies, was not found. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.IO.FileNotFoundException: File or assembly name MySql.Data, or one of its dependencies, was not found.
Jeg har nemlig flyttet min kode hos mit remote sted, og jeg mistænker at der ikke er en forbindelse mellem min kode og MySQL databasen. Hvad kan jeg gøre?
Jeg er kommet tættere på en løsning på dette. Jeg skal lige hjælpes resten af vejen.
Jeg får bøvl med denne linje...
while (rdr.Read()) { ProductData p = new ProductData(); p.ProductId = (int) rdr["product_id"]; p.ProductName = (string) rdr["product_name"]; p.ProductPrice = Convert.ToDecimal(rdr["product_price"]); err -> p.ProductPhoto = Convert.ToByte(rdr["photo_data"]); arrLstProduct.Add(p); }
dbCon.DbClose();
Jeg får en "Object cannot be cast from DBNull to other types.", men henter jeg ikke data ud når min SQL streng ser således ud?
string strSql = "SELECT product.id AS product_id, product.name AS product_name, product.price AS product_price, photo.photo_data FROM product INNER JOIN photo ON (product.photo_id = photo.id)WHERE (NAME LIKE '%%')ORDER BY NAME;"; return arrLstProduct;
Har jeg prøvet med, men får masser af fejl. Jeg tror "byte[] Billeddata = new byte[]{"Intet billede"};" ikke rigtig, og jeg får:
c:\inetpub\wwwroot\wwwbutikdk\Class\Product.cs(61): Cannot implicitly convert type 'string' to 'byte' \Product.cs(69): The best overloaded method match for 'MySql.Data.MySqlClient.MySqlDataReader.IsDBNull(int)' has some invalid arguments \Product.cs(69): Argument '1': cannot convert from 'object' to 'int'
Jeg mente at du havde et rigtigt billede f.eks. JPG med en baggrund og teksten "Intet billede" og så læste du det ind og brugte de bytes de steder hvor der ikke er et billede.
Ovenstående giver ingen kompilerings fejl (HURRA).....men :-( giver runtime fejl.
System.InvalidCastException: Specified cast is not valid. at System.Convert.ToByte(Object value) at System.Data.Common.ByteStorage.Set(Int32 record, Object value) at System.Data.DataColumn.set_Item(Int32 record, Object value)Couldn't store <System.Byte[]> in Billede Column. Expected type is Byte.
Hey nu kommer der ingen runtime fejl, men ude på min præsentation kommer der ikke noget billede frem men skriver "System.Byte[]" ud. Jeg er tæt på...hvad mangler jeg????
using System; using System.Collections; using System.Drawing; using System.Data; using MySql; using MySql.Data; using MySql.Data.MySqlClient; using System.Drawing.Imaging; using System.IO;
public class Photo { public Photo() { // // TODO: Add constructor logic here // }
public Bitmap StreamPhoto(byte[] PhotoData) { MemoryStream stream = new MemoryStream (); stream.Write (PhotoData, 0, PhotoData.Length); Bitmap bitmap = new Bitmap (stream); return bitmap; } }
Jeg vil gerne give point til dig Arne, jeg arbejder på at løse dette ønske under en anden tråd, men jeg vil gerne give point da du har skubbet mig hen imod den rigtige retning. Mange tak. :O)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.