Чтение docx (двоичного) из базы данных SQL Server и преобразование его в букву (docx)

Хорошо, мне удалось загрузить слово DOCX в мою базу данных SQL Server в столбец varbinary (Max).

Я могу получить DOCX из базы данных и скрыть его из varbinary обратно в массив и предложить его для загрузки с помощью:

    Byte[] bytes = (Byte[])dt.Rows[0]["TD_DocFile"];
    Response.Buffer = true;
    Response.Charset = "";
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.ContentType = dt.Rows[0]["TD_DocContentType"].ToString();
    Response.AddHeader("content-disposition", "attachment;filename="
    + dt.Rows[0]["TD_DocTitle"].ToString());
    Response.BinaryWrite(bytes);
    Response.Flush();
    Response.End();

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

Я попытался найти способ преобразовать его в строку, чтобы я мог использовать его, например, для docx.

 DocX letter = this.document();

Лучшим вариантом, который я видел до сих пор, была версия файлового потока.

public static MemoryStream databaseFileRead(string varID) {
    MemoryStream memoryStream = new MemoryStream();
    using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
    using (var sqlQuery = new SqlCommand(@"SELECT [RaportPlik] FROM [dbo].[Raporty] WHERE [RaportID] = @varID", varConnection)) {
        sqlQuery.Parameters.AddWithValue("@varID", varID);
        using (var sqlQueryResult = sqlQuery.ExecuteReader())
            if (sqlQueryResult != null) {
                sqlQueryResult.Read();
                var blob = new Byte[(sqlQueryResult.GetBytes(0, 0, null, 0, int.MaxValue))];
                sqlQueryResult.GetBytes(0, 0, blob, 0, blob.Length);
                //using (var fs = new MemoryStream(memoryStream, FileMode.Create, FileAccess.Write)) {
                memoryStream.Write(blob, 0, blob.Length);
                //}
            }
    }
    return memoryStream;
}

Но я не мог преобразовать ни байты двоичного массива, ни поток памяти в переменную, которую docx понял бы. Может быть, я просто искал не тот разговор. Может кто-нибудь дать мне подсказку, пожалуйста?

Поле называется TD_DocContentType из базы данных. Я могу признать, что в данном случае я слаб в конверсии. Я не вижу, что я делаю неправильно. Нужна новая идея, пожалуйста. С уважением, Рене


person Rene    schedule 19.05.2014    source источник
comment
Спасибо, Marc_s - только что перечитал, и ты оказался быстрее. Цените перемены.   -  person Rene    schedule 19.05.2014
comment
Рассматривали ли вы возможность базовой отладки? т.е. являются ли данные, которые вы извлекаете из базы данных, такими же, как вы вводите (например, длина, первые 8 и последние 8 байтов)?   -  person TomTom    schedule 19.05.2014
comment
Спасибо, TomTom, да, как я уже сказал, я могу получить документ из базы данных, как это было, и загрузить его. Проблема для меня в том, как преобразовать его, чтобы я мог использовать его с Doc X в программе.   -  person Rene    schedule 20.05.2014
comment
О чем ты говоришь? Если это двоичное представление docx, преобразование не требуется, просто сохраните байты под правильным именем файла, оканчивающимся на .docx.   -  person TomTom    schedule 20.05.2014
comment
Хорошо, ТомТом, это я пытаюсь выяснить. Спасибо. Тогда мне нужно сохранить его на сервере, а не локально. Посмотрите на этот вариант сейчас.   -  person Rene    schedule 20.05.2014
comment
DocX - это какая-то сторонняя библиотека? Учитывая, что название может сбить с толку поисковую систему, ваш вопрос, вероятно, должен включать ссылку на ее домашнюю страницу.   -  person JasonPlutext    schedule 20.05.2014
comment
Может ли кто-нибудь помочь мне изменить верхнюю процедуру, чтобы вместо ее загрузки она записывала ее в папку ~/doctemp/, пожалуйста? Я изо всех сил пытаюсь понять концепцию, которую я должен признать. Спасибо   -  person Rene    schedule 21.05.2014


Ответы (1)


Я нашел решение для моей проблемы. Потребовалось время и много дополнительных исследований. Я попытался подойти к проблеме не с той стороны.

Это решение считывает двоичное поле из базы данных и записывает его в виде файла во внутреннюю веб-папку с именем doctemp.

Частная недействительная загрузка (DataTable DT)

{
    var physicalPath = Server.MapPath("~\\doctemp\\{0}");
    string outputFileName = string.Format(physicalPath, dt.Rows[0]["TD_DocTitle"]);
    filename = outputFileName;

    Byte[] bytes = (Byte[])dt.Rows[0]["TD_DocFile"];
    File.WriteAllBytes(outputFileName, bytes);
}
person Rene    schedule 23.05.2014