A simple solution we have used in the past is to upload the file as varbinary and then when it is time to download it, save it to a temporary file in the application directory then open it.
IE:
outputFile = new System.IO.FileStream("TempFile." + fExtension, System.IO.FileMode.Create, System.IO.FileAccess.Write);
outputFile.Write(fContent, 0, fContent.Length);
outputFile.Close();
System.Diagnostics.Process.Start(Directory.GetCurrentDirectory() + "\\TempFile." + fExtension);
In this case, the file extension (ie pdf, xls, txt) is saved to the server with the varbinary file. The outputFile variable is a System.IO.FileStream, so you may be able to start from there in your code. For me, I used a datareader to grab the basic Byte[] straight from the server and went from there.
This was a simple test program I wrote a while back to test the implementation. This allows you to save basically any file type and Windows will decide what to open it with.