1

Today I have been trying to get an image to save into a database, and I really can't figure it out.

I have made the following table (Afbeeldingen):

  • id:int
  • afbeelding1:varbinary(max)

Imported it with a Linq-to-SQL class, wrote a WCF service for it:

    [OperationContract]
    public void setAfbeelding(Afbeelding a)
    {
        dc.Afbeeldings.InsertOnSubmit(a);
        dc.SubmitChanges();
    }

And then in my xaml page I try to to create an Afbeelding, but I can't put the Byte[] as a varbinary. I don't know how to do this and I can't seem to find anything about it.

OpenFileDialog openFileDialog = new OpenFileDialog();

openFileDialog.Filter = "JPEG files|*.jpg";

if (openFileDialog.ShowDialog() == true)
{
   Stream stream = (Stream)openFileDialog.File.OpenRead();
   Byte[] bytes = new Byte[stream.Length];
   stream.Read(bytes, 0, (int)stream.Length);
   string fileName = openFileDialog.File.Name;

   Afbeelding a = new Afbeelding();
   a.id = 1;
   a.afbeelding1 = new Byte{ Bytes = bytes};
}

I hope somebody can help me because I really can't figure this out.

Thank you in advance, Thomas

Edit: Having solved this problem, what happens now when I press the button as I get an error.

System.ServiceModel.FaultException: The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter :a. The InnerException message was 'There was an error deserializing the object of type OndernemersAward.Web.Afbeelding. The maximum array length quota (16384) has been exceeded while reading XML data. This quota may be increased by changing the MaxArrayLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader.'.  Please see InnerException for more details.
   at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
   at System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result)
   at System.ServiceModel.ClientBase`1.ChannelBase`1.EndInvoke(String methodName, Object[] args, IAsyncResult result)
   at OndernemersAward.EditAfbeeldingServiceReference.EditAfbeeldingServiceClient.EditAfbeeldingServiceClientChannel.EndsetAfbeelding(IAsyncResult result)
   at OndernemersAward.EditAfbeeldingServiceReference.EditAfbeeldingServiceClient.OndernemersAward.EditAfbeeldingServiceReference.EditAfbeeldingService.EndsetAfbeelding(IAsyncResult result)
   at OndernemersAward.EditAfbeeldingServiceReference.EditAfbeeldingServiceClient.OnEndsetAfbeelding(IAsyncResult result)
   at System.ServiceModel.ClientBase`1.OnAsyncCallCompleted(IAsyncResult result)

1 Answer 1

2

You need to construct a Binary object.

a.afbeelding1 = new Binary( bytes );
Sign up to request clarification or add additional context in comments.

9 Comments

Thank you, but when I try this I get the error: 'OndernemersAward.EditAfbeeldingServiceReference.Binary' does not contain a constructor that takes 1 arguments
It should be a System.Linq.Binary -- perhaps you've created a class for it?
I just did a search for afbeelding1 and I couldn't find it anywhere (but the linq class), this is the linq class: pastebin.com/n91W2fme Edit: There is another one, in reference.cs: pastebin.com/jDA07rUs (I don't know why), I also don't know why it's called afbeelding1, because in my database it is just afbeelding.
I just renamed the column to "source", addded it again to my Dataclasses and it still tells me that it doesn't contain a constructor that takes 1 arguments. This doesn't make any sense :S
That's odd. I wonder why it created the Binary class for the service. If it persists in doing that, use a.afbeelding1 = new Binary { Bytes = bytes };
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.