2011-11-02 82 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'部分將來自該查找表中刪除的開始。 –