lendo imagem BLOB do database MySQL

Estou com problemas para ler um blob de um database MySQL. Eu comecei a inserir com sucesso no database, mas parece que não consigo ler de volta. Eu sei que alguns de vocês podem estar pensando “por que ele está usando um database para armazenar blobs para imagens, e não apenas os caminhos de arquivo / nomes de arquivos”, mas eu quero ter flexibilidade e muitas dessas imagens serão armazenadas em um arquivo. servidor e não localmente, isso otimiza a eficiência, além de permitir que eu mova imagens para locais, se necessário. Eu segui um tutorial (curto) e escrevi este método a seguir para receber um blob;

public void getBlob(string query, string fileOut) { if (this.OpenConnection() == true) { MySqlCommand cmd = new MySqlCommand(query, mConnection); //the index number to write bytes to long CurrentIndex = 0; //the number of bytes to store in the array int BufferSize = 100; //The Number of bytes returned from GetBytes() method long BytesReturned; //A byte array to hold the buffer byte[] Blob = new byte[BufferSize]; //We set the CommandBehavior to SequentialAccess //so we can use the SqlDataReader.GerBytes() method. MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess); while (reader.Read()) { FileStream fs = new FileStream(DeviceManager.picPath + "\\" + reader["siteBlobFileName"].ToString(), FileMode.OpenOrCreate, FileAccess.Write); BinaryWriter writer = new BinaryWriter(fs); CurrentIndex = 0; BytesReturned = reader.GetBytes(1, CurrentIndex, Blob, 0,BufferSize); while (BytesReturned == BufferSize) { writer.Write(Blob); writer.Flush(); CurrentIndex += BufferSize; BytesReturned = reader.GetBytes(1, CurrentIndex, Blob, 0, BufferSize); } writer.Write(Blob, 0, (int)BytesReturned); writer.Flush(); writer.Close(); fs.Close(); } reader.Close(); this.CloseConnection(); } } 

e eu estou chamando assim …

  mDBConnector.getBlob("SELECT siteMapPicture, siteBlobFilename FROM sites WHERE siteID = '" + DeviceManager.lastSite + "'", DeviceManager.picPath + "mappicsite" + DeviceManager.lastSite); PBSite.BackgroundImage = Image.FromFile(DeviceManager.picPath + "mappicsite" + DeviceManager.lastSite); 

No entanto, está com erro no BytesReturned = reader.GetBytes (1, CurrentIndex, Blob, 0, BufferSize); com o erro “GetBytes só pode ser chamado em colunas binárias ou guid”. Eu estou supondo que isso tem a ver com o meu tipo de campo no meu database, mas alterando a coluna para digitar binário significa que eu tenho que armazenar isso como um tipo de blob, mas eu quero deixar o nome do arquivo apenas como uma string regular. Tem algo que estou perdendo? ou outra maneira de fazer isso?

edit1: eu acho que o primeiro parâmetro para bytesreturned é fazer com coluna no leitor, definindo isso para 0 dá o erro “tentativa inválida de ler uma coluna anterior usando o SequentialAccess”, mal olhar para isso.

edit2: Removendo access sequencial me dá um arquivo de tamanho 13 bytes, (o que poderia ser apenas a primeira linha, razão pela qual o access seqüencial lê todas as linhas?) Então, talvez eu esteja lendo colunas na ordem errada ..

editar 3: eu acredito que a razão para este erro foi devido à maneira que eu estava inserindo no database. Tendo mudado este método, meu saveBlob agora parece assim:

 public void saveBlob(string filePath, string fileName, string siteID) { if (this.OpenConnection() == true) { //A stream of bytes that represnts the binary file FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read); //The reader reads the binary data from the file stream BinaryReader reader = new BinaryReader(fs); //Bytes from the binary reader stored in BlobValue array byte[] BlobValue = reader.ReadBytes((int)fs.Length); fs.Close(); reader.Close(); MySqlCommand cmd = new MySqlCommand(); cmd.Connection = mConnection; cmd.CommandType = CommandType.Text; cmd.CommandText = "INSERT INTO x (y, z) VALUES (@BlobFile, @BlobFileName)"; MySqlParameter BlobFileNameParam = new MySqlParameter("@BlobFileName", SqlDbType.NChar); MySqlParameter BlobFileParam = new MySqlParameter("@BlobFile", SqlDbType.Binary); cmd.Parameters.Add(BlobFileNameParam); cmd.Parameters.Add(BlobFileParam); BlobFileNameParam.Value = fileName; BlobFileParam.Value = BlobValue; cmd.ExecuteNonQuery(); this.CloseConnection(); } } 

Eu corri através do depurador, e blobvalue e blobfileparam (@blobfile) tem o tamanho total (cerca de 150k), mas está com erro ao executar a consulta, dando o seguinte erro;

 "unable to cast object of type 'system.byte[]' to type 'system.iconvertible" 

Eu dei uma olhada no código e tentei alterar os tipos binários para imagem, para permitir arquivos maiores, mas dá o mesmo erro. Alguém sabe alguma coisa sobre essa nova informação?

edição 4: consertou tudo. notei que no meu código eu estava usando:

  ("@BlobFile", SqlDbType.Binary); 

Alterado estes para os tipos “MySqlDbType” (derp) e permitiu-me escolher os tipos de blob. As coisas estão finalmente funcionando como planejado:)

Você tentou simplificar primeiro? Em vez de ler o BLOB 100 bytes de cada vez, tente simplificar seu código para apenas ler todos os bytes em um arquivo. Dessa forma, você pode facilmente excluir problemas da camada de dados.

A documentação a seguir também sugere que você armazene o tamanho do arquivo como outra coluna: http://dev.mysql.com/doc/refman/5.5/en/connector-net-programming-blob.html