Avatar billede starf Nybegynder
26. oktober 2004 - 19:20 Der er 41 kommentarer og
1 løsning

gem fil i daabase

Hey

Har et program, der skal gemme en fil, i mysql database.

har lavet en knap der åbner en fil med koden:

        private void button16_Click(object sender, System.EventArgs e)
        {
            if(openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                System.IO.StreamReader sr = new
                    System.IO.StreamReader(openFileDialog1.FileName);
                //MessageBox.Show(sr.ReadToEnd());
                textBox1.Show(sr.ReadToEnd());
                sr.Close();
            }

        }

dette er koden jeg har til at finde en fil med, hvordan får jeg så lavet så den gemme ri en mysql database?
Avatar billede arne_v Ekspert
26. oktober 2004 - 19:22 #1
Henter og installerer ByteFX .NET provider for MySQL.

Og så gemme rdu i databasen med en helt almindelig INSERT statement.
Avatar billede arne_v Ekspert
26. oktober 2004 - 19:27 #2
Noget a la:

MySqlConnection con = new MySqlConnection("Database=Test;Data Source=localhost;User Id=;Password=");
con.Open();
MySqlCommand ins = new MySqlCommand("INSERT INTO files VALUES (@id, @data)", con);
ins.Parameters.Add("@id", MySqlDbType.Int);
ins.Parameters.Add("@pic", MySqlDbType.MediumText);
ins.Parameters["@id"].Value = id;
ins.Parameters["@pic"].Value = data;
ins.ExecuteNonQuery();
Avatar billede starf Nybegynder
26. oktober 2004 - 19:34 #3
{
            if(openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                System.IO.StreamReader sr = new
                    System.IO.StreamReader(openFileDialog1.FileName);
                MessageBox.Show(sr.ReadToEnd());
               
                sr.Close();
            }


            MySqlConnection myConn = new MySqlConnection( getDatabaseDNS());
            myConn.Open();
            MySqlCommand ins = new MySqlCommand("INSERT INTO file VALUES (@ID, @Data)", myConn);
            ins.Parameters.Add("@id", MySqlDbType.Int);
            ins.Parameters.Add("@pic", MySqlDbType.MediumText);
            ins.Parameters["@id"].Value = ID;
            ins.Parameters["@pic"].Value = Data;
            ins.ExecuteNonQuery();
            myConn.Close();

        }

dette er min kode nu. men jeg får:

D:\DatabaseSample\DatabaseSampleVirker\DatabaseSampleVirker\DatabaseSampleVirker\Main.cs(2918): 'ByteFX.Data.MySqlClient.MySqlDbType' does not contain a definition for 'MediumText'

samt

D:\DatabaseSample\DatabaseSampleVirker\DatabaseSampleVirker\DatabaseSampleVirker\Main.cs(2920): The name 'Data' does not exist in the class or namespace 'DatabaseSample.Form1'

Data er det ikke et felt i databasen?
Avatar billede arne_v Ekspert
26. oktober 2004 - 19:37 #4
1)

MySqlDbType.MediumText skal vist være MySqlDbType.MediumBlob selvom
feltet er MEDIUMTEXT (mystisk men det sifer docs - sorry for vildledningen)
Avatar billede arne_v Ekspert
26. oktober 2004 - 19:38 #5
2)

Data er indholdet af filen.

3)

Du skal vel også kun gemme inden i OK
Avatar billede arne_v Ekspert
26. oktober 2004 - 19:39 #6
if(openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                System.IO.StreamReader sr = new
                    System.IO.StreamReader(openFileDialog1.FileName);
            MySqlConnection myConn = new MySqlConnection( getDatabaseDNS());
            myConn.Open();
            MySqlCommand ins = new MySqlCommand("INSERT INTO file VALUES (@ID, @Data)", myConn);
            ins.Parameters.Add("@ID", MySqlDbType.Int);
            ins.Parameters.Add("@Data", MySqlDbType.MediumBlob);
            ins.Parameters["@ID"].Value = ID;
            ins.Parameters["@Data"].Value = sr.ReadToEnd(); // <--- indholdet af filen
            ins.ExecuteNonQuery();
            myConn.Close();               
                sr.Close();
            }
Avatar billede starf Nybegynder
26. oktober 2004 - 19:40 #7
trode jeg enligt den gjorde automatisk, hvis man lagde database koden til sidst, og så skiftede data ud med sr.ReadToEnd ?
Avatar billede arne_v Ekspert
26. oktober 2004 - 19:41 #8
Du kan godt gemme det du læser med:

string Data = sr.ReadToEnd();

og så bruge Data senere hvis du foretrækker det.
Avatar billede starf Nybegynder
26. oktober 2004 - 19:41 #9
Takker, men når man vælger en fil og trykke rpå OK så cracher det med følgende fejl:

An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll

Additional information: Input string was not in a correct format.
Avatar billede arne_v Ekspert
26. oktober 2004 - 19:45 #10
Er din ID variabel et tal ?
Avatar billede starf Nybegynder
26. oktober 2004 - 19:46 #11
Hvad er enligt forskellen på mediumBlob og LongBlob?
Avatar billede starf Nybegynder
26. oktober 2004 - 19:46 #12
min ID er et Auto Increament, så hver gang der bliver addet noget, kommer der er et nummer i id, så jeg senere kan gemme filen igen med at henvise til dette id nummer (eller det var da ihvertifalde planen)
Avatar billede arne_v Ekspert
26. oktober 2004 - 19:48 #13
ByteFX MediumBlob ---- MySQL MEDIUMBLOB eller MySQL MEDIUMTEXT ---- max. 16 MB

ByteFX LongBlob ---- MySQL LONGBLOB eller MySQL LONGTEXT ---- max. 4 GB
Avatar billede arne_v Ekspert
26. oktober 2004 - 19:49 #14
Hvis den er auto increment så vil du vel egentligt:

            MySqlCommand ins = new MySqlCommand("INSERT INTO file (data) VALUES (@Data)", myConn);
            ins.Parameters.Add("@Data", MySqlDbType.MediumBlob);
            ins.Parameters["@Data"].Value = sr.ReadToEnd(); // <--- indholdet af filen
            ins.ExecuteNonQuery();
Avatar billede starf Nybegynder
26. oktober 2004 - 19:53 #15
takker for forklaringen!

An unhandled exception of type 'ByteFX.Data.MySqlClient.MySqlException' occurred in bytefx.mysqlclient.dll

Additional information: You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near '$UA5)(*Dy=U' at line 1
Avatar billede arne_v Ekspert
26. oktober 2004 - 19:55 #16
Øh.

Er det en tekst fil eller en binær fil ?
Avatar billede starf Nybegynder
26. oktober 2004 - 19:56 #17
binær fil (pdf, exel, doc, jpg osv)
Avatar billede arne_v Ekspert
26. oktober 2004 - 19:58 #18
Så tror jeg ikke at det duer med StreamReader.
Avatar billede starf Nybegynder
26. oktober 2004 - 19:58 #19
går enligt ud fra det vil vær een gode ide at gemme filens extention i et database felt, så man har det til når man skal lave download delen?

og evt gemme fil navnet i en også?
Avatar billede starf Nybegynder
26. oktober 2004 - 19:59 #20
hmmm pis!
Avatar billede arne_v Ekspert
26. oktober 2004 - 20:00 #21
Stream imgfile = new FileStream(openFileDialog1.FileName, FileMode.Open);
        byte[] imgdata = new byte[(int)imgfile.Length];
        imgfile.Read(imgdata, 0, imgdata.Length);
        imgfile.Close();
        ...
        ins.Parameters["@Data"].Value = imgdata;
Avatar billede arne_v Ekspert
26. oktober 2004 - 20:01 #22
Og husk at felt typen i databasen skal være BLOB eller MEDIUMBLOB
Avatar billede arne_v Ekspert
26. oktober 2004 - 20:01 #23
Og ja - det er selvfølgelig smart at gemme filnavn og type
Avatar billede starf Nybegynder
26. oktober 2004 - 20:03 #24
yes yes det virker sku!.. Takker..

ikke for at belemme dig eller noget, men hvordan får man trukket fil navnet og extentionen ud?
Avatar billede arne_v Ekspert
26. oktober 2004 - 20:05 #25
Prøv:

(new FileInfo(filnavn)).Name
(new FileInfo(filnavn)).Extension
Avatar billede arne_v Ekspert
26. oktober 2004 - 20:06 #26
og et svar
Avatar billede starf Nybegynder
26. oktober 2004 - 20:11 #27
hvordan vil du have jeg skal kode det sammen med en indsætning i databasen?

ins.Parameters["@filnavn"].Value = new FileInfo(filnavn).Name;

noget hen af det eller?
Avatar billede arne_v Ekspert
26. oktober 2004 - 20:21 #28
ins.Parameters.Add("@filnavn", MySqlDbType.VarChar);
...
ins.Parameters["@filnavn"].Value = (new FileInfo(filnavn)).Name;

ser vist ikke helt forkert ud.
Avatar billede starf Nybegynder
26. oktober 2004 - 20:23 #29
får bare:

D:\DatabaseSample\DatabaseSampleVirker\DatabaseSampleVirker\DatabaseSampleVirker\Main.cs(2922): The name 'filnavn' does not exist in the class or namespace 'DatabaseSample.Form1'
Avatar billede arne_v Ekspert
26. oktober 2004 - 20:25 #30
ins.Parameters["@filnavn"].Value = (new FileInfo(openFileDialog1.FileName)).Name;
Avatar billede starf Nybegynder
26. oktober 2004 - 20:26 #31
takker ser ud til det virker!.. :)
Avatar billede starf Nybegynder
26. oktober 2004 - 23:37 #32
hvorfor kan den ikke gemme filer over 1mb?
Avatar billede starf Nybegynder
26. oktober 2004 - 23:46 #33
og hvofor virker det ikk ehvis man ligger filer over f.eks 600kb i databasen?
Avatar billede arne_v Ekspert
26. oktober 2004 - 23:50 #34
Hvilken fejl får du ?
Avatar billede arne_v Ekspert
26. oktober 2004 - 23:50 #35
Ihvertfald en version af ByteFX havde et problem med store BLOB's
Avatar billede arne_v Ekspert
26. oktober 2004 - 23:53 #36
Bruger du ByteFX 0.76 ?

MySQL Connecter/.NET 1.0 er klar i Beta (den bygger på ByteFX !)

http://dev.mysql.com/get/Downloads/Connector-Net/mysql-connector-net-1.0.0-beta.zip/from/pick
Avatar billede starf Nybegynder
27. oktober 2004 - 00:01 #37
det bliver lidt tricky men forsøger lige at forklare..

for at man kan se hvad filer der er lagt op, henter jeg fil navn og extension ud i en listview der også viser id.. så langt så godt..

når jeg så ligger små filer op på et par kb virker det fint, men lige så snart vi nærmer os 300kb og jeg forsøger at hente dataén ud får jeg følgende fejl:

An unhandled exception of type 'System.OverflowException' occurred in system.data.dll

Additional information: Arithmetic operation resulted in an overflow.

og den pejer på min linie:

myCmd.Fill( dtSet, "file" );

hele koden er:

            listView6.Items.Clear(); //Clear the list.
            MySqlConnection myConn = new MySqlConnection( getDatabaseDNS());


            string strSQL = "SELECT * FROM file"; //our SQL string
            MySqlDataAdapter myCmd = new MySqlDataAdapter ( strSQL, myConn );
           
            myConn.Open();
            DataSet dtSet = new DataSet();
            myCmd.Fill( dtSet, "file" );
            DataTable dTable = dtSet.Tables[0];

            foreach( DataRow dtRow in dTable.Rows )
            {
                ListViewItem li = new ListViewItem();
                li.SubItems.Clear();
                li.SubItems[0].Text = dtRow["ID"].ToString();
                li.SubItems.Add(dtRow["extension"].ToString());
                li.SubItems.Add(dtRow["filnavn"].ToString());

                listView6.Items.Add(li);
            }

            myConn.Close(); //Close database connection!
        }
Avatar billede starf Nybegynder
27. oktober 2004 - 00:03 #38
køre med Version 0.76 af bytefx

Hvis jeg henter den der 1.0 så skal jeg ikke ændre noget i min kode andet end at inkludere det?

og hvis jeg med gem fil knappen forsøger at sende en fil på 1mb siger den

An unhandled exception of type 'ByteFX.Data.MySqlClient.MySqlException' occurred in bytefx.mysqlclient.dll

Additional information: Packet size too large.  This MySQL server cannot accept rows larger than 1048576 bytes.

selv om den er sat til longblob
Avatar billede starf Nybegynder
27. oktober 2004 - 00:10 #39
men sidste har jeg på fornemeren jeg skal rette under max packet size...
Avatar billede starf Nybegynder
27. oktober 2004 - 00:58 #40
Jep det fjernede da den sidste fejl.. men den anden fatter jeg da godt nok minus af!
Avatar billede arne_v Ekspert
28. oktober 2004 - 20:17 #41
Kan du få et stacktrace for fejlene ?
Avatar billede starf Nybegynder
28. oktober 2004 - 20:54 #42
har fundet ud af hvad det var.. skulle bare precisere mit sql kald, så data ikke blev hentet også.. da det af en eller anden grund var for meget!
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