VSTO:在数据库中存储 __ComObject (Microsoft.Office.Interop.Word.Table)
VSTO: Store __ComObject (Microsoft.Office.Interop.Word.Table) in Database
我想在 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 Class 中包装了单词对象以构建某种 ToString 转换器。
但这似乎很麻烦,并且当用户在 table.
中插入图片、图表、oleobjects 时容易出错
有什么建议吗?
非常感谢您的帮助!
Word 对象并不独立于它们所在的文档;它们不是 "serializable",也不只是文本。
据我所知,有两种可能的方法:
从文档中删除所有其他信息。将该版本的文档保存到磁盘(临时)。将文档导入数据库(此时您应该能够删除临时文件)。要重新使用内容,请将文档另存为文件并将文件插入目标文档或在 Word 中打开文件并传输内容。
检索 table 范围的 WordOpenXML
属性,它是纯文本 - 描述 table 的 Office Open XML 在 OPC 平面文件格式的文档上下文中 - 并存储它。稍后可以使用 Range.InsertXML
方法检索(写入另一个文档)。
但是请注意,在这两种情况下(或您可能会发现的任何其他方法),不能保证与原始文档中信息的出现方式完全一致。这是由于 Word 处理格式(样式)和页面布局的方式所致。内容将适应目标文档中的样式定义,布局将适应页边距设置。
我想在 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 Class 中包装了单词对象以构建某种 ToString 转换器。 但这似乎很麻烦,并且当用户在 table.
中插入图片、图表、oleobjects 时容易出错有什么建议吗? 非常感谢您的帮助!
Word 对象并不独立于它们所在的文档;它们不是 "serializable",也不只是文本。
据我所知,有两种可能的方法:
从文档中删除所有其他信息。将该版本的文档保存到磁盘(临时)。将文档导入数据库(此时您应该能够删除临时文件)。要重新使用内容,请将文档另存为文件并将文件插入目标文档或在 Word 中打开文件并传输内容。
检索 table 范围的
WordOpenXML
属性,它是纯文本 - 描述 table 的 Office Open XML 在 OPC 平面文件格式的文档上下文中 - 并存储它。稍后可以使用Range.InsertXML
方法检索(写入另一个文档)。
但是请注意,在这两种情况下(或您可能会发现的任何其他方法),不能保证与原始文档中信息的出现方式完全一致。这是由于 Word 处理格式(样式)和页面布局的方式所致。内容将适应目标文档中的样式定义,布局将适应页边距设置。