2011-05-06 97 views
7

我有这个数据库,其中有一个表的下面,但我没有办法正是DeCypher它存储的Microsoft Word 97页中的SQL Server列中的文档

DATA,  TYPE,   FILE TYPE, SIZE, DOC TYPE 
0x15234324 , Word.Document.8 ,DOC,  19968, WORD.DOCUMENT.8 

领域似乎包含存储在一个Word文档SQL Server IMAGE

有没有人遇到过这个或以可读的格式提取数据的方法?

到目前为止,我已经尝试使用PHP来提取文件并将其写入word文档,但没有多少运气。

更新:我现在拥有的Visual Studio Express和希望的方式来提取这些数据,并保存到word文档

UPDATE2:这是我在VB中辛勤

Imports System.Data.SqlClient 
Imports System.IO 


Public Class Form1 

    Private Shared Function RetrieveFile(ByVal filename As String) As Byte() 
     Dim connection As New SqlConnection("Server=sqlsrv;database=database;Trusted_Connection=Yes;") 
     Dim command As New SqlCommand("select data from objects where object_ref in (select data from parts where object_ref =239804)", connection) 
     command.Parameters.AddWithValue("test", filename) 
     connection.Open() 
     Dim reader As SqlDataReader = command.ExecuteReader(System.Data.CommandBehavior.SequentialAccess) 
     reader.Read() 
     Dim memory As New MemoryStream() 
     Dim startIndex As Long = 0 
     Const ChunkSize As Integer = 256 
     While True 
      Dim buffer As Byte() = New Byte(ChunkSize - 1) {} 
      Dim retrievedBytes As Long = reader.GetBytes(1, startIndex, buffer, 0, ChunkSize) 
      memory.Write(buffer, 0, CInt(retrievedBytes)) 
      startIndex += retrievedBytes 
      If retrievedBytes <> ChunkSize Then 
       Exit While 
      End If 
     End While 
     connection.Close() 
     Dim data As Byte() = memory.ToArray() 
     memory.Dispose() 
     Return data 


    End Function 


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 
     Dim saveFileDialog1 As New SaveFileDialog() 
     saveFileDialog1.Filter = "Doc File|*.doc" 
     saveFileDialog1.Title = "Save an doc File" 
     saveFileDialog1.ShowDialog() 

     If saveFileDialog1.FileName <> "" Then 
      Dim fs As New System.IO.FileStream(saveFileDialog1.FileName, System.IO.FileMode.Create, System.IO.FileAccess.Write) 
      Dim data As Byte() = RetrieveFile("test.doc") 
      fs.Write(data, 0, data.Length) 
      fs.Flush() 
      fs.Close() 
     End If 
    End Sub 




End Class 
+0

你也许包含在'DATA'字节只是存储在文件系统和然后用MS Word打开该文件。 – 2011-05-06 12:37:09

+0

很酷 - 如何从SQL服务器提取这些数据?因为字符串接缝在SQL管理查询结果窗口中是短的 – Rob 2011-05-06 12:38:48

+3

是的,SSMS将始终截断为最大值。长度 - 您需要使用一些代码从SQL Server中获取它。看到这个[其他SO问题](http://stackoverflow.com/questions/2818557/are-there-any-utilities-to-extract-binary-data-from-sql-server)上类似的话题 - 也许这'我会帮你 – 2011-05-06 12:39:43

回答

4

我写了一个VBS脚本来提取数据出来的SharePoint斑点而回,这里是它的一个通用版本:

Const adOpenKeyset     = 1 
Const adLockOptimistic    = 3 
Const adTypeBinary     = 1 
Const adSaveCreateOverWrite   = 2 

strSQLServer = "YOURSERVER" 
strSQLDatabase = "YOURDB" 
strRecordID = "123" 
strTempFileName = "c:\output.doc" 

Set objConn = CreateObject("ADODB.Connection") 
Set objRS = CreateObject("ADODB.RecordSet") 
Set objStream = CreateObject("ADODB.Stream") 

objConn.Open "Provider=SQLOLEDB;data Source=" & strSQLServer & ";Initial Catalog=" & strSQLDatabase & "; Trusted_Connection=yes;" 
objRS.Open "Select * from AllDocStreams WHERE ID='" & strRecordID & "'", objConn, adOpenKeyset, adLockOptimistic 

objStream.Type = adTypeBinary 
objStream.Open 
objStream.Write objRS.Fields("Content").Value 
objStream.SaveToFile strTempFileName, adSaveCreateOverWrite 

objRS.Close 
objConn.Close 
+0

我试了上面的和即时得到一个转换器错误在word中,然后下面的文本 - ÿÿÿÿDocumentWord.Document.8 Word.Document.8Ï¡¡>þÿ - 看起来像输出是错误的 – Rob 2011-06-27 11:34:44

+0

我测试了一个Word 2007年的文件存储在Sharepoint 2007数据库中,它似乎工作正常。 – Dave 2011-06-27 14:41:27

2

C#代码:

connection.Open(); 
SqlCommand command1 = new SqlCommand("select DATA from TABLE where ...", connection); 
byte[] img = (byte[])command1.ExecuteScalar(); 
File.WriteAllBytes("your_path/word.doc", img); 

这应该是逻辑。用你认识的任何语言写出类似的东西。它不应该很难在PHP或任何你使用的。

+0

看到更新2上面这是我撕了沙发和即时获取索引越界的代码!有任何想法吗? – Rob 2011-06-23 13:01:16

0

尝试这样的事情,换成你自己的“一些”值:

declare @doc varbinary(max), @ObjectToken int 

select @doc = (select data from yourTable were someID = @idThatYouWant) 

set @FileName = '\someFolder\' + 'someFilename.doc' 

print 'Processing: ' + isnull(@FileName, 'null') 

exec sp_oacreate 'ADODB.Stream', @objecttoken output 
exec sp_oasetproperty @objecttoken, 'type', 1 
exec sp_oamethod @objecttoken, 'open' 
exec sp_oamethod @objecttoken, 'write', null, @doc 
exec sp_oamethod @objecttoken, 'savetofile', null, @FileName, 2 
exec sp_oamethod @objecttoken, 'close' 
exec sp_oadestroy @objecttoken 
+0

这个工作和文件写出来,但它dosnt在word中打开得到一个转换器错误在word中,然后下面的文本 - ÿÿÿÿ文件Word.Document.8 Word.Document.8æà¡>þÿ - 看起来像输出是错误的 – Rob 2011-06-27 12:38:26

0

我想你会在下面的行代码中得到IndexOutOfRangeException:

Dim retrievedBytes As Long = reader.GetBytes(1, startIndex, buffer, 0, ChunkSize) 

因为第一个参数的索引是0而不是1

无论如何,我建议你使用像Klark所建议的那样的方法,它更简单,更具可读性。

相关问题