2011-05-06 7 views
7

ho questo database con una tabella che ha il seguente ma non ho modo di decifrare loMemorizzazione di documenti Microsoft Word 97 nella colonna di SQL Server

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

Il campo sembra contenere un documento di parola memorizzata in un SQL Server IMAGE colonna

Qualcuno ha incontrato questo prima o un modo per estrarre questi dati in un formato leggibile?

Finora ho provato a utilizzare PHP per estrarre il file e scriverlo in un documento Word ma non ho avuto molta fortuna.

UPDATE: Ora ho Visual Studio Express e vorrei un modo per estrarre questi dati e salvare in un documento word

UPDATE2: Questo è quello che ho in VB sofar

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

Si potrebbe probabilmente solo memorizzare i byte contenuti nel 'data' nel file system e quindi apri quel file con MS Word. –

+0

Cool - come si estraebbero questi dati dal server SQL? come le stringhe devono essere troppo corte nella finestra dei risultati della query managment SQL – Rob

+3

Sì, SSMS troncerà sempre a max. lunghezza: è necessario utilizzare del codice per recuperarlo da SQL Server. Vedi questa [altra domanda SO] (http://stackoverflow.com/questions/2818557/are-there-any-utilities-to-extract-binary-data-from-sql-server) su un argomento simile - forse quello Ti aiuterò a –

risposta

4

Ho scritto uno script VBS per estrarre i dati di SharePoint blobs un po 'indietro, ecco una versione generica di esso:

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

Ho provato quanto sopra e sto ottenendo un errore convertitore in parola poi il seguente testo - ÿÿÿÿ Documento Word.Document.8 Word.Document.8 æ ÐÏ à¡ ± á> þÿ - Sembra uscita sbagliata – Rob

+0

Ho provato questo con una parola Il documento 2007 è stato archiviato in un database di Sharepoint 2007 questa mattina e sembrava funzionare correttamente. – Dave

2

codice 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); 

che dovrebbe essere la logica. Scrivi qualcosa di simile in qualsiasi lingua tu sappia. Non dovrebbe essere difficile in PHP o qualsiasi altra cosa tu stia utilizzando.

+0

Vedere l'aggiornamento 2 sopra Questo è il codice che ho strappato e sto ottenendo un indice fuori limite! qualche idea? – Rob

0

provare qualcosa di simile, sostituire la "alcuni" valori con il proprio:

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

funziona e il file scrive ma non si apre a parole ottenendo un errore convertitore in parola, quindi il seguente testo - ÿÿÿÿ Documento Word.Document.8 Word.Document.8 æ ÐÏ à¡ ± á> þÿ - Sembra che l'output sia sbagliato – Rob

0

Penso che si otterrà un IndexOutOfRangeException nella seguente riga di codice:

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

perché il l'indice del primo parametro è 0 non 1

comunque suggerisco di utilizzare un metodo come quello suggerito da Klark, che è più semplice e più leggibile.