2016-05-31 10 views
0

Ich versuche, eine Datei in einer Datenbank zu speichern und aus einer Datenbank abzurufen. Ich serialisiere das Objekt und speichere es als binär. Bei der Deserialisierung erhalte ich jedoch den Fehler, dass der Eingabestream kein gültiges Binärformat ist. Ich habe versucht, verschiedene Lösungen und das ist, was ich bisher gemeinsam gesetzt haben:Binary-Array aus der Datenbank deserialisieren C#

public void saveFile(string filename, string file, object o) 
    { 
     byte[] myFile; 
     if (o != null) 
     { 
      BinaryFormatter bf = new BinaryFormatter(); 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       bf.Serialize(ms, o); 
       myFile= ms.ToArray(); 
      } 
     String insert = "INSERT INTO user_files(FileName, Username, File) VALUES ('myfile','noname','"+ myFile + "')"; 
     MySqlCommand command = new MySqlCommand(insert, connection); 

      try 
      { 
       connection.Open(); 
       command.ExecuteNonQuery(); 

      } 
      catch 
      { 
       MessageBox.Show("Sorry, something went wrong"); 

      } 
      finally 
      { connection.Close(); } 
      } 

Und hier ist

public TrafficMonitor LoadFile(string user, string filename) 
    { 
     TrafficMonitor obj = null; 
     byte[] myFile = null; 
     DataTable dt = new DataTable(); 
     MySqlDataAdapter getCommand = new MySqlDataAdapter("Select File from user_files where Username='noname' and filename='myfile'" , connection); 

     try 
     { 

      connection.Open(); 
      getCommand.Fill(dt); 
      foreach (DataRow row in dt.Rows) 
      { 
       myFile= (byte[])row["File"]; 
      } 
      MemoryStream memStream = new MemoryStream(); 
      BinaryFormatter binForm = new BinaryFormatter(); 
      memStream.Write(myFile, 0, myFile.Length); 
      memStream.Seek(0, SeekOrigin.Begin); 
      obj = (TrafficMonitor)binForm.Deserialize(memStream); 

     } 
     catch { MessageBox.Show("Sorry, something went wrong"); } 
     finally { connection.Close(); } 
     return obj; 

    } 
+0

Ich benutze kein Bild. Ich bin ein Objekt des Typs TrafficMonitor serialisieren. – MonicaS

+0

Haben Sie versucht, eine Codierung zu verwenden, um Ihr Byte-Array in eine Zeichenfolge umzuwandeln (vor dem Speichern in der Datenbank) und dann dieselbe Codierung zum Konvertieren der Datenbankzeichenfolge in das Bytearray zu verwenden. Nur eine Schätzung - http://StackOverflow.com/Questions/11654562/How-convert-byte-array-to-string – vabii

+0

Das Objekt wird als Binär-Array gespeichert und ich bin eine Binär-Array abrufen, die wieder eingefügt werden muss ein Objekt. Ich glaube, dass die Verwendung einer Saite ein zusätzlicher Schritt wäre. – MonicaS

Antwort

0

Hier ist, wie ich binäre Daten zu MySQL eingefügt die Last:

byte[] imgBuffer = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }; 
MySqlCommand query = new MySqlCommand(); 
query.Connection = _connection; 
query.CommandText = "INSERT INTO Photos(id,img) VALUES(?id,?img)"; 
var id = Guid.NewGuid(); 
query.Parameters.Add("?id", MySqlDbType.Binary).Value = id.ToByteArray(); 
query.Parameters.Add("?img", MySqlDbType.Blob).Value = imgBuffer; 
query.ExecuteNonQuery(); 

Und wie ich binäre Daten aus MySQL lesen:

MySqlCommand query = new MySqlCommand(); 
query.Connection = _connection; 
query.CommandText = "SELECT * FROM Photos WHERE [email protected]"; 
query.Parameters.Add("@id", MySqlDbType.Binary).Value = guid.ToByteArray(); 

using (MySqlDataReader reader = query.ExecuteReader()) 
{ 
    if (reader.Read()) 
    { 
     Guid id = reader.GetGuid(0); 
     byte[] imgBuffer = (byte[])reader.GetValue(1); 
    } 
}