Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Storing Microsoft Word 97 documents in SQL Server column

I have this database with a table which has the the following but I have no way to decypher it

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

The field seems to contain a word document stored in a SQL Server IMAGE column

Has anyone come across this before or a way to extract this data in a readable format?

So far I have tried using PHP to extract the file and write it to a word document but not had much luck.

UPDATE: I now have Visual Studio Express and would like a way to extract this data and save to a word document

UPDATE2: This is what I have 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
like image 437
Rob Avatar asked May 06 '11 11:05

Rob


People also ask

Can Microsoft Word be used as a database?

Microsoft Word has a Mail Merge feature that links a Word document with information stored in a data file, called a data source. The data source can be a database. Before the merge, you can create and manage a database within Word. The database is saved as an Access database file within Word.


2 Answers

I wrote a VBS script to pull data out of sharepoint blobs a while back, here's a generic version of it:

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
like image 153
Dave Avatar answered Oct 24 '22 03:10

Dave


C# code:

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

That should be the logic. Write something similar in any language you know. It shouldn't be hard in PHP or whatever you are using.

like image 20
Klark Avatar answered Oct 24 '22 04:10

Klark