从SQL Server数据库中读取docx(二进制)并将其转换为字母(docx)

时间:2014-05-19 06:22:02

标签: sql-server binary docx letter

好的,我设法将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。我可以接受在这种情况下我对转换很弱。我看不出自己做错了什么。需要一个新的想法。 亲切的问候, 雷

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。花了一段时间,还有很多研究要做。我试图从错误的角度解决问题。

此解决方案从数据库中读取二进制字段,并将其作为文件写入名为doctemp的内部Web文件夹。

private void download(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);
}