0

我想在 T-SQL 数据库中存储一个 Microsoft.Office.Interop.Word.Table 对象。并再次从数据库中获取对象以粘贴到 Word 文档中。强制所有信息,如标签、索引、格式保持一致。

在数据库端,我创建了一个 [Object] (varbinary(max)) byte[] 字段。

直接将单词对象分配给参数化查询会导致序列化错误。我告诉我我需要显式创建一个转换函数(iConvertible):

System.InvalidCastException
  HResult=0x80004002
  Nachricht = Parameterwert konnte nicht von LoomTable in Byte[] umgewandelt werden.
  Quelle = offer
  Stapelüberwachung:
   bei offer.Classes.TextBlock.WriteTextBlockToDB() in C:\Temp\code\text\Classes\TextBlock.cs: Zeile215
   bei offer.ManageBlockTexts.ButtonLeft_Click(Object sender, EventArgs e) in C:\Temp\code\text\InsertNewText.cs: Zeile691

Innere Ausnahme 1:
InvalidCastException: Ein Objekt muss IConvertible implementieren.

代码:

SqlConnection cn = new SqlConnection(cn_string);
            string sql_Text = @"INSERT INTO LOOM.Text(Description, TextLong, TextBlock, Language, Approved, Object) VALUES(@DES, @TEL, @TEB, @LAN, @APP, @OBJ);
                            SELECT SCOPE_IDENTITY()";
...
using (SqlCommand sqlCommand = new SqlCommand(sql_Text, cn))
{
...
    sqlCommand.Parameters.Add("@OBJ", SqlDbType.VarBinary, Int32.MaxValue);
    sqlCommand.Parameters["@OBJ"].Value = this.loomTable;

    cn.Open();
    object returnObj = sqlCommand.ExecuteScalar();
...
}

using Microsoft.Office.Interop.Word;

namespace offer.Classes
{
    class LoomTable
    {
...
        private Table table;
...
    }
}

我已经在我自己的 LoomTable 类中包装了单词 object 来构建某种 ToString 转换器。但这似乎很麻烦,并且当用户在表中插入图片图表、oleobjects 时容易出错。

有什么建议么?帮助将不胜感激!

4

1 回答 1

0

Word 对象并不独立于它们所在的文档。它们不是“可序列化的”,也不是仅由文本组成。

据我所知,有两种可能的方法:

  1. 从文档中删除所有其他信息。将该版本的文档保存到磁盘(临时)。将文档导入数据库(此时您应该能够删除临时文件)。要重新使用内容,请将文档另存为文件并将文件插入目标文档或在 Word 中打开文件并传输内容。

  2. 检索表格范围的WordOpenXML属性,它是纯文本 - Office Open XML,它在 OPC 平面文件格式的文档的上下文中描述表格- 并存储它。Range.InsertXML稍后可以使用该方法检索(写入另一个文档) 。

但是请注意,在这两种情况下(或您可能找到的任何其他方法),都不能保证信息在原始文档中的显示方式的准确副本。这是由于 Word 如何处理格式(样式)和页面布局。内容将适应目标文档中的样式定义,布局适应边距设置。

于 2019-11-18T19:07:48.233 回答