2011-11-02 77 views
2

编辑:让我把它变成一个直接的SQL问题...从截断的数据库条目中恢复墨迹数据?

我有一个varbinary(max)列包含表示Microsoft Ink数据的字节数组。墨迹数据由笔画组成,笔画似乎由0x00分隔。例如

0x0090011D04A4048C040304481045141914320800C03402E9A46242330800E01202D0BA014211ABAAD3411E060484E24F6C400A0701096B800A4AC00A060108690943800A2B3C82FCD9F9B56001165CB61440059412CA8B2882FC61F8C66692772AC4D92A2C22E5CD2CAB08DCBB1365940A212182FE043BF810FCCCD6B360AB9A2A451482FC6DF8D664AB337C55DCA9B2D5B650 ...

行程1是0090011D04A4048C0403044810451419143208

中风2是00C03402E9A462423308(I 认为在两端的端部的0x08的是巧合)

等c。

由于数据在插入时被截断,所以最后的Stroke已损坏。如何从数据中只删除最后的笔画?如果可能,我想在SQL更新中执行此操作。

由于一个Fluent NHibernate mapping SNAFU,我们有在8000个字节截断并存储在SQL Server数据库中的varbinary(max)列一些微软的墨水数据。尝试将此数据加载到新的Ink对象中会引发异常“灾难性故障(异常来自HRESULT:0x8000FFFF(E_UNEXPECTED)”)

是否可以恢复任何Ink数据?我知道它存储为笔画,所以如果有一个分隔符来识别单个招那么我可以只取出后坏的数据。

回答

1

我不熟悉的墨数据,但有可能它读成一个字节数组,并试图将其转换为从阵列工作字节数组,直到创建墨数据的顺序中落后的末端开始不抛出异常墨数据。你会然后此生成的对象存储在数据库中。

这似乎可能需要很长时间,如果你的结果集很大,但它似乎可以工作。

+0

我尝试了类似的东西 - 如果Ink无法加载,我找到了最后一个分隔符并将其截断。不幸的是,墨迹序列化格式(http://en.wikipedia.org/wiki/Ink_Serialized_Format)比这更复杂。 –

+0

从格式看起来好像你说的比这更复杂。看起来,要做到这一点,你必须基本截断数据的末尾,直到遇到最后一个结尾'TAG_STROKE'。然后,您还必须修改所有“TAG_STROKE”块的大小,并将该值设置在Ink对象开头的适当位置。你也将不得不修改'GUID'表在墨水对象以使得所有缺少'TAG_STROKE'部分将来自该查找表中删除的开始。 –