открытие двоичных файлов из SQL с помощью LINQ

#c# #asp.net #linq #binaryfiles

#c# #asp.net #linq #двоичные файлы

Вопрос:

Я сохраняю свои файлы word / excel / pdf / Img в SQL с использованием двоичных файлов, и я могу успешно сохранить файлы как двоичные.

 var fileSize = FileUpload1.PostedFile.ContentLength;
var documentBinary = new byte[fileSize];
var u = new UDocument
                {
                    DocName = fileName.ToString(CultureInfo.InvariantCulture),
                    Type = documentType.ToString(CultureInfo.InvariantCulture),
                    DocData = documentBinary
                };
                u.DocID =   count;
                sd.UDocuments.InsertOnSubmit(u);
                sd.SubmitChanges();
  

Теперь я пытаюсь открыть двоичный файл как их тип документа, и я открываю его из gridview, где я отображаю все сохраненные файлы.

введите описание изображения здесь

Теперь, в событии Gridview SelectedIndexChange, я могу получить идентификатор документа, имя документа, чтобы открыть файл, но мне неясно, как получить двоичные данные из documentId, который является PK, и как записать файл. Вот метод, который я пытаюсь заставить его работать:

 protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        int docid = Convert.ToInt16(GridView1.SelectedRow.Cells[1].Text);
        string name = GridView1.SelectedRow.Cells[2].Text;
        Response.Clear();
        Response.ContentType = "application/octet-stream";
        Response.AddHeader("Content-Disposition", "attachment;filename="   name);
        Response.BinaryWrite(GetData(docid)); // I am unclear on how to use this method, with the 
        Response.Flush();
    }
  

где в моем методе getData (int id) я пытаюсь использовать LINQ для получения правильных двоичных данных с помощью уникального идентификатора docID следующим образом:

 var data = from a in sd.UDocuments
            where a.DocID == id
            select a.DocData
  

но я не уверен, какой возвращаемый тип использовать в этом методе.

Любая помощь или указания будут полезны.

Ответ №1:

Возвращаемый тип GetData должен совпадать с типом вашего DocData свойства, т. е. byte[] .

Комментарии:

1. я говорил слишком рано, но 1, поскольку вы заставили меня пересмотреть метод, который у меня был раньше ..private byte[] getData(int id) { byte[] data = (из a в sd. UDocuments, где.DocID == id выберите.DocData). Сначала(). toArray(); возвращает данные; }

Ответ №2:

  private byte[] GetData(int id)
    {
        byte[] data = (from a in sd.UDocuments
            where a.DocID == id
            select a.DocData).First().ToArray();
       return data;
    }

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        int docid = Convert.ToInt16(GridView1.SelectedRow.Cells[1].Text);
        string name = GridView1.SelectedRow.Cells[2].Text;
        string contentType = GridView1.SelectedRow.Cells[3].Text;

        Response.Clear();
        Response.ContentType = contentType; //"application/octet-stream";
        Response.AddHeader("Content-Disposition", "attachment;filename="   name);
        Response.BinaryWrite(GetData(docid));
        Response.End();
    }