Avatar billede alex_sleiborg Nybegynder
06. december 2005 - 09:11 Der er 84 kommentarer og
1 løsning

Billede fra MySql db til picturebox

Jeg har i min mysql database et billede som jeg gerne vil have vist i en picturebox. Men det virker ikke rigtigt når jeg prøver at typecaste

feks

this.pictureBox1.Image = Image.FromFile(@"" + (string)rdr_find[11] + "");
Avatar billede dr_chaos Nybegynder
06. december 2005 - 09:17 #1
er det stien til billedet eller er det selve billedet ?
Avatar billede alex_sleiborg Nybegynder
06. december 2005 - 09:18 #2
Tja det skulle vel egentlig være hele billedet. Den ligger i en longblob
Avatar billede dr_chaos Nybegynder
06. december 2005 - 09:19 #3
hvis det er selve billedet skal du gemme det i et byte array som illustreret her:
byte [] buffer = (byte [])ds.Tables["Table"].Rows[imageNumber]["Data"];
en måde at vise det på kan være
System.IO.MemoryStream stream1 = new System.IO.MemoryStream(buffer,true); 
stream1.Write(buffer,0,buffer.Length);
Bitmap m_bitmap = (Bitmap) Bitmap.FromStream(stream1,true);
//kode til at vise bitmap i picturebox.
Avatar billede alex_sleiborg Nybegynder
06. december 2005 - 09:24 #4
Gider du at kommentere koden lidt nærmere :)

Hvordan får jeg det ud af databasen, og så ned i det byte array?
Avatar billede dr_chaos Nybegynder
06. december 2005 - 09:26 #5
prøv lige at vise mig den forbindelse du har lavet for at nå til
this.pictureBox1.Image = Image.FromFile(@"" + (string)rdr_find[11] + "");
Avatar billede the_party_dog Nybegynder
06. december 2005 - 09:41 #6
//Her har du fat i din reader(regner med at din reader hedder rdr)
byte [] buffer = (byte [])rdr_find[11];

//Nu opretter du en stream, som læser hele indholdet af dit byte[](buffer)
System.IO.MemoryStream stream1 = new System.IO.MemoryStream(buffer,true);
stream1.Write(buffer,0,buffer.Length);

//Her opretter du et bitmap object, som skal bruges til dit picture box
Bitmap m_bitmap = (Bitmap) Bitmap.FromStream(stream1,true);

Så ved jeg ikke lige hvad Chaos havde tænkt sig med bitmap, da jeg ikke lige kan gennemskue det, når picture bix forventer et image object.
Avatar billede dr_chaos Nybegynder
06. december 2005 - 09:57 #7
//Her har du fat i din reader(regner med at din reader hedder rdr)
byte [] buffer = (byte [])rdr_find[11];

//Nu opretter du en stream, som læser hele indholdet af dit byte[](buffer)
System.IO.MemoryStream stream1 = new System.IO.MemoryStream(buffer,true);
stream1.Write(buffer,0,buffer.Length);

//Her opretter du et bitmap object, som skal bruges til dit picture box
Bitmap m_bitmap = (Bitmap) Bitmap.FromStream(stream1,true);
//sæt image i picturebox.
pictureBox1.Image = m_bitmap;
Avatar billede alex_sleiborg Nybegynder
06. december 2005 - 10:27 #8
jeg får fejl under runtime.

Parameter is not valid.
Bitmap m_bitmap = (Bitmap) Bitmap.FromStream(stream1,true);

Her er koden

while (rdr_find.Read())
            {
                this.txtBox_ID.Text = "" + (int)rdr_find[0] + "";
                this.txtBox_Rediger_Fornavn.Text = "" + (string)rdr_find[1] + "";
                this.txtBox_Rediger_Efternavn.Text = "" + (string)rdr_find[2] + "";
                this.txtBox_Rediger_Adresse.Text = "" + (string)rdr_find[3] + "";
                this.txtBox_Rediger_Postnr.Text = "" + (int)rdr_find[4] + "";
                this.txtBox_Rediger_By.Text = "" + (string)rdr_find[5] + "";
                this.txtBox_Rediger_Fødselsdag.Text = "" + (int)rdr_find[6] + "";
                this.txtBox_Rediger_Stilling.Text = "" + (string)rdr_find[7] + "";
                this.txtBox_Rediger_Tlf.Text = "" + (int)rdr_find[8] + "";
                this.txtBox_Rediger_Mobil.Text = "" + (int)rdr_find[9] + "";
                this.txtBox_Rediger_Email.Text = "" + (string)rdr_find[10] + "";
                byte[] buffer = (byte[])rdr_find[11];
                System.IO.MemoryStream stream1 = new System.IO.MemoryStream(buffer, true);
                stream1.Write(buffer, 0, buffer.Length);
                //Her opretter du et bitmap object, som skal bruges til dit picture box
                Bitmap m_bitmap = (Bitmap)Bitmap.FromStream(stream1, true);
                //sæt image i picturebox.
                pictureBox1.Image = m_bitmap;

            }
Avatar billede the_party_dog Nybegynder
06. december 2005 - 10:30 #9
m_bitmap er ikke et Image object, og det forventer din picturebox...
Avatar billede alex_sleiborg Nybegynder
06. december 2005 - 10:32 #10
Hvordan laver jeg så et Image object?
Avatar billede alex_sleiborg Nybegynder
06. december 2005 - 11:07 #11
Jeg får den her fejl i min log fil, når jeg prøver at indsætte et billede med mit program. Her prøver jeg også at indsætte det som hvis det var en streng

Input string was not in a correct format.
Avatar billede dr_chaos Nybegynder
06. december 2005 - 11:10 #12
det meget mærkeligt alle de eksempler jeg har fundet bruger min metode men jeg kan ikke få den til at virke kun hvis jeg bruger en filestream. Til at indlæse billedet med.
Avatar billede alex_sleiborg Nybegynder
06. december 2005 - 11:13 #13
Det billede jeg har sat ind i databasen, har jeg gjort ved hjælp af et administrations værktøj til mysql. Så det kan være det ikke er sat rigtigt ind???

Når jeg kigger på min longblob er det et felt der hedder tekst. Og når jeg klikker der, så står stien til billedet

C:\Documents and Settings\Administrator\Dokumenter\Modtagne filer\peter.jpg
Avatar billede the_party_dog Nybegynder
06. december 2005 - 11:14 #14
Hvis det nu blev for søgt med en normal Stream, så kan Image.FromStream() funktionen bruges, men lige nu sidder jeg og har ikke lige tid til at kigge nærmere på det.

Alex hvis du kan vente til i eftermiddag, vil jeg gerne ligge mere tid i det.
Avatar billede the_party_dog Nybegynder
06. december 2005 - 11:15 #15
Alex: Ahh... Nu er vi over i noget helt andet... Er det selve billedet du vil have gemt i din tabel, eller er det kun stien du vil have gemt?

Det har stor betydning om du vil gemme selve billedet, eller om du vil gemme stien. :)
Avatar billede dr_chaos Nybegynder
06. december 2005 - 11:19 #16
prøv lige med denne kode

FileStream MyFileStream = new FileStream(@"C:\Documents and Settings\Administrator\Dokumenter\Modtagne filer\peter.jpg", FileMode.Open);
            long FileSize;
            FileSize = MyFileStream.Length;
            byte[] buffer = new byte[(int)FileSize];
            MyFileStream.Read(buffer, 0, (int)MyFileStream.Length);
            MyFileStream.Close();
            //Her har du fat i din reader(regner med at din reader hedder rdr)
       
            //Nu opretter du en stream, som læser hele indholdet af dit byte[](buffer)
            System.IO.MemoryStream stream1 = new System.IO.MemoryStream(buffer);
            //stream1.Write(buffer,0,buffer.Length);
            stream1.Flush();
            //Her opretter du et bitmap object, som skal bruges til dit picture box
            Bitmap m_bitmap = (Bitmap) Bitmap.FromStream(stream1);
            //m_bitmap.Save("tmp.jpg",System.Drawing.Imaging.ImageFormat.Jpeg);
            pictureBox1.Image = m_bitmap;
            stream1.Close();
Avatar billede dr_chaos Nybegynder
06. december 2005 - 11:20 #17
den virker hos mig i mit test prog.
Avatar billede alex_sleiborg Nybegynder
06. december 2005 - 11:35 #18
chaos henter du ikke billedet ud fra en sti på harddisken? Billedet skulle jo gerne ligge i databasen
Avatar billede dr_chaos Nybegynder
06. december 2005 - 12:03 #19
jo i dette tilfælde gør jeg. Det er lavet som en test at stream. Jeg får den samme fejl som dig og jeg forstår ikke helt  hvorfor.
hvis du bare gemmer stien i databasen kan du nøjes med noget i denne stil.
pictureBox1.Image = Image.FromFile("pathtilbilled");
Avatar billede alex_sleiborg Nybegynder
06. december 2005 - 13:00 #20
Ja jeg er klar over, hvis jeg bare gemmer stien til billedet i databasen som en streg, så har jeg ikke det problem. Men billedet skal ligges i databasen. Da et andet program også skal bruge billedet, og det program ligger på en anden computer
Avatar billede the_party_dog Nybegynder
06. december 2005 - 13:31 #21
Alex:

Er du helt sikker på at du har lagt dit billede korrekt op i databasen, du sagde du havde gjort det igennem et administrations værktøj, og når du kiggede på feltet, viste den kun stien til filen.

Hvilke værktøjer bruger du?
Har du ikke noget kode, som ligger dit billede op i din databae?

Men nu har jeg fået hul igennem så jeg kan uploade et billede, og vise det igen... Det kommer i næste post, hæng på drenge :)
Avatar billede the_party_dog Nybegynder
06. december 2005 - 13:35 #22
Her er til hvordan man uploader et billede til databasen, se bort fra MSSQL objecterne, det er det samme hvis du bruger MySQL .NET provideren.

System.IO.FileStream FS = new System.IO.FileStream(@"C:\FIL.jpg", FileMode.Open);
            long FileSize = FS.Length;
           
            byte[] Picture = new byte[(int)FileSize];
            FS.Read(Picture, 0, (int)FileSize);
            FS.Close();

            SqlConnection con = new SqlConnection("packet size=4096;user id=USR;data source=DB;persist security info=True;initial catalog=CATALOG;password=PASS");
            SqlDataAdapter adap = new SqlDataAdapter("SELECT * FROM Pictures", con);
            SqlCommandBuilder cmBuilder = new SqlCommandBuilder(adap);

            DataSet ds = new DataSet();

            adap.Fill(ds);
           
            DataRow objNew = ds.Tables[0].NewRow();
            objNew["Picture"] = Picture;

            ds.Tables[0].Rows.Add(objNew);
            adap.Update(ds);

Her forventes at du har en tabel som hedder "Pictures"(tabel), hvor der er en "ID" kolonne, og en "Piture" kolonne.

Først så ud læser du alt data fra tabellen(Næste gang kan du bare tage den første med TOP). Så oprettes der en ny række, igennem dit dataset(ds). Når billedet er lagt ind, bliver det sendt til serveren igennem DataAdapteren(adap.Update(ds)).
Avatar billede alex_sleiborg Nybegynder
06. december 2005 - 13:35 #23
Jeg brugte "MySQL Query Browser" til at uploade billedet. Jeg har ikke noget kode som smider et billede op i databasen endnu.

Brugte denne guide mener jeg nok
http://forums.mysql.com/read.php?20,17671,27914#msg-27914
Avatar billede the_party_dog Nybegynder
06. december 2005 - 13:37 #24
SqlConnection con = new SqlConnection("packet size=4096;user id=USR;data source=DB;persist security info=True;initial catalog=CATALOG;password=PASS");
            SqlDataAdapter adap = new SqlDataAdapter("SELECT * FROM Pictures", con);

DataSet ds = new DataSet();

            adap.Fill(ds);

            byte[] Picture = (byte[])ds.Tables[0].Rows[0]["Picture"];

            MemoryStream strPicture = new MemoryStream(Picture,0, Picture.Length);

            strPicture.Read(Picture, 0, Picture.Length);
           
            pictureBox1.Image = Image.FromStream(strPicture);

Her opretter du en forbindelse til databasen, og udlæser alt i et dataset. Det kan nemt laves om til din måde, igennem din datareader. Så når det er kommet ud, bliver det bare lagt ud i en memory stream, og så kan Image.FromStream() selv finde ud af det.
Avatar billede dr_chaos Nybegynder
06. december 2005 - 13:39 #25
det er samme kode som jeg brugte i anden form.
Jeg tror måske at du og jeg fik den parameter fejl fordi vores byte array var tomt eller indeholdte tommme pladser.
Avatar billede the_party_dog Nybegynder
06. december 2005 - 13:42 #26
//Henter et billed, og laver det om til et byte[]
System.IO.FileStream FS = new System.IO.FileStream(@"C:\FIL.jpg", FileMode.Open);
long FileSize = FS.Length;
byte[] Picture = new byte[(int)FileSize];
FS.Read(Picture, 0, (int)FileSize);
FS.Close();

//Opretter alle dine MySQL objekter
MySqlConnection conn = null;
MySqlDataAdapter da = null;
MySqlCommand cmdSelect = null;
DataSet ds = new DataSet();

conn = new MySqlConnection("CONNECTIONSTRING");
da = new MySqlDataAdapter("SELECT * FROM Pictures",conn);
           
MySqlCommandBuilder cmb = new MySqlCommandBuilder(da);

//Henter alt til dit dataset, og opretter en ny række, med værdien fra dit byte[]
da.Fill(ds);
DataRow objNewRow = ds.Tables[0].NewRow();
objNewRow["Picture"] = Picture;

ds.Tables[0].Rows.Add(objNewRow);
da.Update(ds);

Det burde virke til MySQL. Her får I uploadet et billed til jeres database.
Avatar billede the_party_dog Nybegynder
06. december 2005 - 13:44 #27
//Opretter alle dine MySQL objekter
MySqlConnection conn = null;
MySqlDataAdapter da = null;
MySqlCommand cmdSelect = null;
DataSet ds = new DataSet();

conn = new MySqlConnection("CONNECTIONSTRING");
da = new MySqlDataAdapter("SELECT * FROM Pictures",conn);

//Udlæser alt til dit dataset.
da.Fill(ds);

//Tager det første billed.
byte[] Picture = (byte[])ds.Tables[0].Rows[0]["Picture"];

MemoryStream strPicture = new MemoryStream(Picture,0, Picture.Length);

strPicture.Read(Picture, 0, Picture.Length);
           
pictureBox1.Image = Image.FromStream(strPicture);
Avatar billede the_party_dog Nybegynder
06. december 2005 - 13:45 #28
Det er hvad jeg har brugt, til at få det op at køre på en MSSQL idag. Det er taget fra et tidligere projekt som brugte MySQL, så det burde altså virke.

Alex: Skriv hvis det er noget som volder dig problemer.
Avatar billede alex_sleiborg Nybegynder
06. december 2005 - 13:53 #29
Burde den ikke være okay, den her kode???

string MyConnection = "server=127.0.0.1;uid=root;" +
                "pwd=pass;database=testdb;";

//Laver Forbindelse til databasen
MySql.Data.MySqlClient.MySqlConnection Con;
Con = new MySql.Data.MySqlClient.MySqlConnection();
Con.ConnectionString = MyConnection;

Con.Open();//Åbner forbindelse til databasen
MySql.Data.MySqlClient.MySqlCommand Com = new MySql.Data.MySqlClient.MySqlCommand("SELECT * FROM bruger WHERE id ='" + tmpbruger_id + "'", Connect);
MySql.Data.MySqlClient.MySqlDataReader rdr_find = Com.ExecuteReader();
while (rdr_find.Read())
{
    this.txtBox_ID.Text = "" + (int)rdr_find[0] + "";
    this.txtBox_Rediger_Fornavn.Text = "" + (string)rdr_find[1] + "";
    this.txtBox_Rediger_Efternavn.Text = "" + (string)rdr_find[2] + "";
    this.txtBox_Rediger_Adresse.Text = "" + (string)rdr_find[3] + "";
    this.txtBox_Rediger_Postnr.Text = "" + (int)rdr_find[4] + "";
    this.txtBox_Rediger_By.Text = "" + (string)rdr_find[5] + "";
    this.txtBox_Rediger_Fødselsdag.Text = "" + (int)rdr_find[6] + "";
    this.txtBox_Rediger_Stilling.Text = "" + (string)rdr_find[7] + "";
    this.txtBox_Rediger_Tlf.Text = "" + (int)rdr_find[8] + "";
    this.txtBox_Rediger_Mobil.Text = "" + (int)rdr_find[9] + "";
    this.txtBox_Rediger_Email.Text = "" + (string)rdr_find[10] + "";
    byte[] buffer = (byte[])rdr_find[11];
               
    System.IO.MemoryStream stream1 = new System.IO.MemoryStream(buffer, true);
    stream1.Write(buffer, 0, buffer.Length);
    //Her opretter du et bitmap object, som skal bruges til dit picture box
    Bitmap m_bitmap = (Bitmap)Bitmap.FromStream(stream1, true);
    //sæt image i picturebox.
    pictureBox1.Image = m_bitmap;
}
rdr_find.Close();
this.lblOverskrift.Text = "Rediger brugeroplysninger for " + this.txtBox_Rediger_Fornavn.Text + " " + this.txtBox_Rediger_Efternavn.Text + "";
Con.Close();
Avatar billede dr_chaos Nybegynder
06. december 2005 - 13:56 #30
jo men hvis der ikke kommer noget billede ud så er der et problem
prøv evt. at tilføje
  this.txtBox_Rediger_Email.Text = "" + (string)rdr_find[11] + "";
for at se hvad der står i kolonnen som formodes at indeholde et billede.
Avatar billede alex_sleiborg Nybegynder
06. december 2005 - 14:01 #31
Unable to cast object of type 'System.Byte[]' to type 'System.String'.

Når jeg prøver at caste det ind i en streng

Og jeg får "Parameter is not valid."

Når jeg bruger

byte[] buffer = (byte[])rdr_find[11];
               
    System.IO.MemoryStream stream1 = new System.IO.MemoryStream(buffer, true);
    stream1.Write(buffer, 0, buffer.Length);
    //Her opretter du et bitmap object, som skal bruges til dit picture box
    Bitmap m_bitmap = (Bitmap)Bitmap.FromStream(stream1, true);
    //sæt image i picturebox.
    pictureBox1.Image = m_bitmap;
Avatar billede the_party_dog Nybegynder
06. december 2005 - 14:19 #32
Prøv at droppe det bitmap, og gå over til :
Image m_Image = Image.FromStream(stream1);

pictureBox1.Image = m_Image;
Avatar billede alex_sleiborg Nybegynder
06. december 2005 - 14:29 #33
Samme fejl. "Parameter is not valid."
Avatar billede the_party_dog Nybegynder
06. december 2005 - 14:50 #34
MemoryStream strPicture = new MemoryStream(buffer,0, buffer.Length);
         
pictureBox1.Image = Image.FromStream(strPicture);

Prøv dette... Kommer der ikke en linje fejl, hvor "Parameter is not valid"
Avatar billede alex_sleiborg Nybegynder
06. december 2005 - 14:58 #35
Jo jeg får nøjagtig samme fejl "Parameter is not valid."
Avatar billede the_party_dog Nybegynder
06. december 2005 - 15:00 #36
kan du ikke sige hvilken linje der giver den fejl???? Det må stå der et sted, så vi kan se hvem der ikke får en valid parameter
Avatar billede dr_chaos Nybegynder
06. december 2005 - 15:02 #37
jeg fik den altid i den linie hvor jeg brugte fromstream.
Avatar billede alex_sleiborg Nybegynder
06. december 2005 - 15:04 #38
Jo da

  Bitmap m_bitmap = (Bitmap)Bitmap.FromStream(stream1, true);

Det er ligesom chaos siger, altid fromstream den er gal med
Avatar billede dr_chaos Nybegynder
06. december 2005 - 15:05 #39
prøv at sende billedet til mig eller party_dog.
ifølge :
www.developersdex.com/vb/message.asp%3Fp%3D1121%26r%3D4556446+fromstream+Parameter+is+not+valid&hl=da" target="_blank">http://72.14.207.104/search?q=cache:v_EraoNUJU8J:www.developersdex.com/vb/message.asp%3Fp%3D1121%26r%3D4556446+fromstream+Parameter+is+not+valid&hl=da
kan fejlen komme p.ga. formatet af billedet.
Avatar billede alex_sleiborg Nybegynder
06. december 2005 - 15:10 #40
Her

http://peecee.dk/?id=21851

Det er bare et billede jeg hurtigt lige fandt på google
Avatar billede the_party_dog Nybegynder
06. december 2005 - 15:29 #41
Hos mig, med det udleveret kode fra mig, lagt ind på en MSSQL database, og læs ud igen, kommer billedet fint frem i min PictureBox, på min windows form.

Det her er min måde:
System.IO.MemoryStream stream1 = new System.IO.MemoryStream(buffer,0, buffer.Length);
pictureBox1.Image = Image.FromStream(stream1);

Dette er jeres måde:

System.IO.MemoryStream stream1 = new System.IO.MemoryStream(buffer, true);
stream1.Write(buffer, 0, buffer.Length);

Bitmap m_bitmap = (Bitmap)Bitmap.FromStream(stream1, true);
pictureBox1.Image = m_bitmap;

Jeg bruger PT en DataAdapter og et dataset. Skal jeg teste om jeg kan få det til at virke med en datareader?
Avatar billede alex_sleiborg Nybegynder
06. december 2005 - 15:32 #42
Er desværre offline indtil imorgen. Men ja du må meget gerne se om du kan få det til at virke med en datareader
Avatar billede the_party_dog Nybegynder
06. december 2005 - 15:32 #43
Igen virker det ved mig.

while(rs.Read())
            {
                byte[] Picture = (byte[])rs["Picture"];
                MemoryStream strPicture = new MemoryStream(Picture,0, Picture.Length);
                pictureBox1.Image = Image.FromStream(strPicture);
            }       
   
            con.Close();
Avatar billede the_party_dog Nybegynder
06. december 2005 - 15:33 #44
Jeg er OVERBEVIST om at det er den måde I håndtere MemoryStream'en på. Ellers kan jeg ikke se hvad der går galt. Men mindre I ikke har et helt billede i jeres database.
Avatar billede the_party_dog Nybegynder
06. december 2005 - 15:35 #45
og igen. Med jeres måde at gøre det på, virker det også ved mig.

Nu er jeg på herrens mark. Er I sikker på at I får sat en billed rigtigt ind på databasen?
Avatar billede alex_sleiborg Nybegynder
07. december 2005 - 08:47 #46
Det må være fordi billedet ikke ligger rigtigt inde i databasen

Jeg gør jo bare sådan

Command.Parameters.Add("?pic", "" + this.openFileDialog1.FileName + "");

Så uploader den vel bare billedet som en streng

Hvordan skal jeg gøre for at få det rigtigt ind?
Avatar billede the_party_dog Nybegynder
07. december 2005 - 08:50 #47
Alex:

Har du prøvet at se om du kan implementere det første kode jeg skrev, hvor jeg sagde at sådan fik I et billed op i databasen?

Det kode du lige har skrevet, viser tydeligt, at det kun er navnet du ligger op i databasen...
Avatar billede alex_sleiborg Nybegynder
07. december 2005 - 08:53 #48
Ja jeg prøver lige at se om jeg ikke kan få din kode til at virke.

Jo men det billede jeg forsøger at få vist i mit program, har jeg uploaded med MySQL Query Browser så det burde være iorden. Men prøver lige det andet
Avatar billede alex_sleiborg Nybegynder
07. december 2005 - 08:57 #49
Kan du lige hjælpe mig, programmet laver en exception

Input string was not in a correct format.

System.IO.FileStream FS = new System.IO.FileStream(@"" + this.openFileDialog1.FileName + "", FileMode.Open);
                long FileSize = FS.Length;
                byte[] Picture = new byte[(int)FileSize];
                FS.Read(Picture, 0, (int)FileSize);
                FS.Close();
               
                Command.Parameters.Add("?pic", Picture);

Det er sidste linje, som den brokker sig over når jeg prøver at uploade
Avatar billede the_party_dog Nybegynder
07. december 2005 - 08:59 #50
Er add ikke overloadet så du kan angive typen af parameteren?

Normal med MSSQL:
Commmand.Parameters.Add("@Pic", SqlDbType.Image);
Commmand.Parameters["@Pic"].Value = Picture;
Avatar billede alex_sleiborg Nybegynder
07. december 2005 - 09:06 #51
Jeg får stadig samme exception med denne her kode

Command.Parameters.Add("?Pic", MySql.Data.MySqlClient.MySqlDbType.longblob);
                Command.Parameters["?Pic"].Value = Picture;
Avatar billede the_party_dog Nybegynder
07. december 2005 - 09:41 #52
Hvad siger Value når du holder stille over den, eller er ved at skrive den? Står der ikke at den modtager Object?

Hvad type er din kolonne i databasen, er den stor nok til at modtage billeder?
Avatar billede alex_sleiborg Nybegynder
07. december 2005 - 09:52 #53
Hva mener du med står stille over den?

Kolonnen er af typen longblob, og skulle eftersigende kunne klare filer på op til 1 mb. Medmindre man ændrer noget i opsætningen til Mysql serveren
Avatar billede the_party_dog Nybegynder
07. december 2005 - 09:54 #54
Når du sidder i dit VS.NET og "hover" med din mus hen over Value, vil man normalt kunne se hvilken type den kan modtage.
Avatar billede alex_sleiborg Nybegynder
07. december 2005 - 09:58 #55
Hvem siger jeg bruger VS.NET? bruger da notepad :)

Ej den skriver "object MySQLParameter.Value"
Avatar billede the_party_dog Nybegynder
07. december 2005 - 10:01 #56
Okay..

Alex jeg må give fortabt lige her og nu... Kan vi tage det engang i eftermiddag/aften? Sidder på arbejde, og chefen er på nakken af mig lige nu.

Når jeg kommer hjem, og har tid til det, vil jeg se om kan få smidt en MySQL på min server, og lave en windows form som bruger MySQL .NET provideren, til at uploade, og vise billeder.

Hvordan har du tænkt dig din form skal uploade et billed, ved at brugeren vælger en fil igennem en Dialog, og så trykker upload? Så vil jeg nemlig lige strikke det sammen hvis jeg får tid :)
Avatar billede alex_sleiborg Nybegynder
07. december 2005 - 10:07 #57
Helt okay. Og rigtig mange tak for din hjælp indtil videre :)

Jeg bruger MySQL .Net Connector, er det den samme som MySQL .NET Provider???

Ja det bliver igennem en dialog, det virker fint med alle de andre bruger oplysninger. Bare ikke med billeder :(
Avatar billede the_party_dog Nybegynder
07. december 2005 - 10:09 #58
Det er helt den samme... Det er bare hvem man spørger, så giver de forskellige navne :) My bad.
Avatar billede alex_sleiborg Nybegynder
07. december 2005 - 14:29 #59
Tja nu kan jeg da sætte billeder ind med den her kode

using System;
using System.IO;

class Insert_Pic
{
    static void Main()
    {
        MySql.Data.MySqlClient.MySqlConnection conn;
        MySql.Data.MySqlClient.MySqlCommand cmd;

        conn = new MySql.Data.MySqlClient.MySqlConnection();
        cmd = new MySql.Data.MySqlClient.MySqlCommand();

        string SQL;
   

        conn.ConnectionString = "server=127.0.0.1;uid=root;pwd=kommet;database=billede;";

        try
        {
       
        System.IO.FileStream fs = new System.IO.FileStream(@"c:\peter.jpg", FileMode.Open);
        long FileSize = fs.Length;
        byte[] Picture = new byte[(int)FileSize];
        fs.Read(Picture, 0, (int)FileSize);
        fs.Close();

        conn.Open();

        SQL = "INSERT INTO test VALUES(NULL, ?File)";

        cmd.Connection = conn;
        cmd.CommandText = SQL;
        cmd.Parameters.Add("File", MySql.Data.MySqlClient.MySqlDbType.Blob);
        cmd.Parameters["File"].Value = Picture;

        cmd.ExecuteNonQuery();

        Console.WriteLine("File Inserted into database successfully!");

        conn.Close();
        }
        catch (MySql.Data.MySqlClient.MySqlException ex)
        {
            Console.WriteLine("Error " + ex.Number + " has occurred: ");
        }
    }
}

Men det virker ikke, hvis jeg prøver at smide det ind i min egen kode.
Avatar billede the_party_dog Nybegynder
07. december 2005 - 14:35 #60
Det er altid noget du kan få sat et billede ind. :) Et skridt i den rigtige retning. Har du tjekket om du kan få det ud igen?

Hvad er den store forskel mellem den seneste kode, og din egen?
Avatar billede alex_sleiborg Nybegynder
07. december 2005 - 14:46 #61
Har fået det til at virke lidt nu. Det har noget at gøre med, at når man åbner en openfiledialog så passer den sti man angiver ikke helt. Jeg får i hvert fald en exception fejl.

Hva betyder det @ egentligt.
(@"c:\peter.jpg",

og det virker ikke med
("" + this.openfiledialog.FileName + "",
Avatar billede the_party_dog Nybegynder
07. december 2005 - 14:50 #62
@ gør at alle \ bliver taget som det \ tegn de er.
Normal bliver \ taget som en escape character, f.eks \n = new line, \r = carrier return

så når du ikke har @ med vil følgende blive læst forkert:
"c:\peter.jpg" - Fordi den leder efter \p, og det findes ikke.
Avatar billede alex_sleiborg Nybegynder
07. december 2005 - 15:03 #63
Nå okay.

Men hvorfor kan jeg ikke bruge min openfiledialog?

Jeg får denne exception
The process cannot access the file 'c:\peter.jpg' because it is being used by another process.   

når min filestream linje ser sådan her ud
System.IO.FileStream fs = new System.IO.FileStream(@"" + this.openFileDialog1.FileName + "", FileMode.Open);
Avatar billede the_party_dog Nybegynder
07. december 2005 - 15:07 #64
Har du dit billed åbenet et sted?
Har du prøvet læse stien ud en variabel, og sørge for at din openFileDialog ikke har fat i den? Kunne jo sagtens være at filen blev låst fordi din dialog peger på den.
Avatar billede alex_sleiborg Nybegynder
07. december 2005 - 15:12 #65
Jeg får denne her exception

Input string was not in a correct format.

når min filestream linje ser sådan her ud
System.IO.FileStream fs = new System.IO.FileStream(@"C:\Documents and Settings\All Users\Dokumenter\Billeder\Billedeksempler\Vinter.jpg", FileMode.Open);

bare lige for at prøve med et andet billede.

Jeg kan derimod godt bruge billedet hvis jeg flytter det ned i roden af c:, og self ændrer stien i min filestream
Avatar billede alex_sleiborg Nybegynder
07. december 2005 - 15:14 #66
Nej jeg har ikke billedet åbnet et andet sted

og jeg har prøvet at gøre sådan her
string file = this.openFileDialog1.FileName;

System.IO.FileStream fs = new System.IO.FileStream(@file, FileMode.Open);
Avatar billede the_party_dog Nybegynder
07. december 2005 - 15:15 #67
Det har vist noget at gøre med mellemrum... Tror du skal prøve noget med [] eller ' '... Smutter hjem nu, kigger lige på noget hvis tiden bliver til det.. Glæder mig du kan uploade :-)
Avatar billede alex_sleiborg Nybegynder
07. december 2005 - 15:20 #68
Der er ikke noget mellemrum, det er bare eksperten der ikke kan vise det hele. Strengen står i en lang køre. Ja det er jeg også, det har satme været bøvlet indtil videre
Avatar billede the_party_dog Nybegynder
07. december 2005 - 21:01 #69
Hej Alex.

Jeg har desværre slet ikke haft noget tid til overs idag, og har desværre ikke tid før søndag til at hjælpe dig. :( Hvis søndag kan redde din dag, vil jeg gerne bytte MSN/ICQ adresser med dig, og så kan vi tage det den vej over.

Så regner jeg selvfølgelig med at du smider en øl på bordet en dag, hvis jeg nogensinde skulle komme til at møde dig. :)

Men er virkelig ked af at jeg ikke har kunne finde tid til at hjælpe dig videre.
Avatar billede alex_sleiborg Nybegynder
08. december 2005 - 09:29 #70
:) Det er bare helt okay... Men msn adr er alex_sleiborg@hotmail.com.

Men jeg er da meget glad for der er nogen der gider at hjælpe.. Du skal da i hvert fald have mange tak:)
Avatar billede alex_sleiborg Nybegynder
08. december 2005 - 10:34 #71
Så nu kan jeg uploaded de billeder jeg vælger i min openfiledialog :)

Men jeg har sådan en picturebox, som billedet bliver vist i før det bliver uploaded til databasen. Og jeg får en fejl hvis billedet bliver vist i den picture box, så siger den at billedet bliver brugt af en anden process.

Men selvom jeg tømmer pictureboxen sådan her

this.pictureBox2.Image = null;

inden jeg uploader, mener windows stadig at filen er i brug. Hvordan løser jeg lige det problem?
Avatar billede alex_sleiborg Nybegynder
08. december 2005 - 10:35 #72
Skal jeg kopiere billedet ind i et midlertidigt byte array?
Avatar billede the_party_dog Nybegynder
08. december 2005 - 10:37 #73
Du husker selvfølgelig at lave en .Close på din FileStream, inden du prøver på at uploade det til din database?
Avatar billede alex_sleiborg Nybegynder
08. december 2005 - 10:38 #74
Ja selvfølgelig

Men det er den her linje der ikke lukker filen

this.pictureBox2.Image = Image.FromFile(@"" + this.openFileDialog1.FileName + "");
Avatar billede alex_sleiborg Nybegynder
08. december 2005 - 14:30 #75
Jeg har fået det til at virke nu. Smid et svar Party dog. Og mange tak for hjælpen
Avatar billede dr_chaos Nybegynder
08. december 2005 - 14:31 #76
kan du ikke kopiere din kildekode her ind, hvis der er andre med samme problem så kan de finde løsningen her :)

btw tillykke :)
Avatar billede the_party_dog Nybegynder
08. december 2005 - 14:33 #77
Der kommer et svar.

Det endte med at han loaded billedet ind i en picture box, som vi bagefter udlæste billedet fra igen, lavede om til et byte[], og sendte det op til serveren.
Avatar billede alex_sleiborg Nybegynder
08. december 2005 - 14:47 #78
Jeps. Jeg poster lige en komplet kildekode her engang i weekenden, hvordan man uploader billeder til databasen og hvordan man får det ned i en picturebox igen.

Men det er The Party Dog's fortjeneste, skal det lige siges.
Avatar billede dr_chaos Nybegynder
08. december 2005 - 14:50 #79
det ved jeg :)
jeg kunne ikke hjælpe mere end den smule jeg forsøgte.
Avatar billede dr_chaos Nybegynder
08. december 2005 - 14:51 #80
du kan evt give ham noget karma som tak for hjælpen.
man kan vidst roligt sige at det kostede lidt sved :)
Avatar billede alex_sleiborg Nybegynder
08. december 2005 - 14:55 #81
Jeg har givet ham karma :)

Du må også have rigtig mange tak for hjælpen chaos. Det er rigtigt dejligt man kan få hjælp, når man er lidt "grøn".

Ja det var lidt mere bøvlet, end jeg først lige havde regnet med.

Jeg opretter også lige et ekstra sprøgsmål, så kan i få lidt flere point :)
Avatar billede dr_chaos Nybegynder
08. december 2005 - 14:57 #82
jeg skal ikke have points giv dem til the_party_dog.
gerne lidt karma :)
Avatar billede alex_sleiborg Nybegynder
08. december 2005 - 15:00 #83
Synes nu også du fortjener lidt point, bare det der er nogen der gider at hjælpe en...
Avatar billede dr_chaos Nybegynder
08. december 2005 - 15:01 #84
jeg skal nok klare mig :)
jeg fandt heller ikke løsningen.
Avatar billede alex_sleiborg Nybegynder
02. januar 2006 - 22:48 #85
Sorry jeg først kommer med et eksempel nu, har ikke haft tid før...

Jeg har lavet et lille test program som lovet for at demonstrere hvordan man uploader billeder til en MySQL Database. Programmet indeholder en lille picturebox, så man kan se billedet man vil have uploadet inden det bliver puttet ind i databasen.

Min database hedder ”pictures”, og indeholder tabellen ”billeder”.
”billeder” har 2 kolonner id som autogenerer et nummer, så hver billede for et unikt nummer.
Den anden kolonne hedder ”pic” og er af typen MediumBlob.

Her er nogen af de mest almindelige typer til at opbevare binær data med i MySQL

Blob            65 Kb
MediumBlob         16,7 Mb
LongBlob            4,3 Gb

Så MediumBlob må være vores valg til at gemme billeder I, da det er sjældent at billeder bliver større end 16,7 Mb.

Så til selve programmet som indeholder følgende Controls.

Navn:            Type:

btnBrowse            Button
btnUpload            Button
pcbPicture            PictureBox
openfile            OpenFileDialog

Jeg bruger Mysql Connector 1.0.7 til databasen

Jeg har oversat et lille stykke fra min MySQL bog, hvor de omtaler om man bør opbevare binær data i sin database og billeder er jo binær data… Synes lige det skulle med, bare lige for en god ordens skyld 

Der er noget debat blandt database udviklere om man bør opbevare binær data i sin database eller ej. Alternativet ville være at opbevare det på en traditionel fil server, og så gemme stien i databasen. Der er fordele og ulemper ved begge valg

Hvis man opbevarer sine binære data i databasen, laver man også backup af dem, når man laver backup af resten af databasen. Alle der har adgang til databasen får også adgang til de binære data.

På den anden side skal der også skrives ekstra SQL kode, for at gemme og hente dine binære data ud fra databasen. Og man kan måske tabe noget ”performance”.

Så det er op til den enkelte udvikler hvad man vælger

Også til sidst så får i lige kildekoden. I må i øvrigt undskylde hvis der er for mange stavefejl, håber der er nogen der kan bruge det til noget. God fornøjelse :)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace Picture_Upload_Mysql_Db
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.openfile.Filter = "Alle billedfiler|*.bmp;*.jpg;*.jpeg;*.jpe;*.jfif;*.gif|JPEG (*.JPG,*.JPEG,*.JPE,*" +
              ".JFIF)|*.jpg;*.jpeg;*.jpe;*.jfif|GIF (*.GIF)|*.gif|Bitmap filer (*.bmp)|*.bmp|Al" +
              "le filer (*.*)|*.*";

        }
     
        private void btnBrowse_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.openfile.ShowDialog() == DialogResult.OK)
                {


                    this.pcbPicture.Image = Image.FromFile(@"" + this.openfile.FileName + "");
                }
            }

            catch
            {
                MessageBox.Show("Det valgte billed format er ikke understøttet", "Filformat ikke understøttet",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }

        private void btnUpload_Click(object sender, EventArgs e)
        {
            string MyConnection = "server=127.0.0.1;uid=root;pwd=kommet;database=pictures;";

            MySql.Data.MySqlClient.MySqlConnection conn;
            MySql.Data.MySqlClient.MySqlCommand cmd;

            conn = new MySql.Data.MySqlClient.MySqlConnection();
            cmd = new MySql.Data.MySqlClient.MySqlCommand();

            string SQL;

            //Laver en memoryStream som henter billedet ud af picturebox2
            //og putter det ned i et byte array, så det kan uploades til databasen
            Image imgPicture = pcbPicture.Image;
            MemoryStream ms = new MemoryStream();
            imgPicture.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            ms.Position = 0;
            byte[] Picture = new byte[ms.Length];
            ms.Read(Picture, 0, (int)ms.Length);

            conn.ConnectionString = "server=127.0.0.1;uid=root;pwd=pass;database=pictures;";

            try
            {
                conn.Open();

                SQL = "INSERT INTO billeder" +
                  "(pic) VALUES" +
                  "(?File)";

                cmd.Connection = conn;
                cmd.CommandText = SQL;

                cmd.Parameters.Add("?File", MySql.Data.MySqlClient.MySqlDbType.Blob);
                cmd.Parameters["?File"].Value = Picture;

                cmd.ExecuteNonQuery();

                conn.Close();
            }
            catch (Exception ex)
            {
              MessageBox.Show(ex.Message);
            }
        }
    }
}


Og tak til the party dog for hans hjælp 
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Ingeniør til Satellitkommunikation

KMD A/S

Projektleder

Capgemini Danmark A/S

Open Application (Denmark)

Netcompany A/S

Network Engineer